Ticket #4909: imagetag_improvement.2.diff

File imagetag_improvement.2.diff, 9.8 KB (added by anselmo@…, 9 years ago)

imagetag AGPF brcm

  • target/linux/brcm63xx/image/Makefile

     
    4242        $(STAGING_DIR_HOST)/bin/imagetag -i $(KDIR)/vmlinux.lzma.cfe -f $(KDIR)/root.$(1) \ 
    4343                -o $(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin \ 
    4444                -b $(2) -c $(3) -e $(LOADADDR) -l $(LOADADDR) \ 
    45                 -v 8 -m IMAGE -k 0x20000 -n $(4) 
    46         $(call prepare_generic_squashfs,$(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin) 
     45                -v 8 -m IMAGE -k 0x20000 -n $(4) -p alice -d true 
    4746endef 
    4847 
    4948define Image/Build/RedBoot 
  • tools/firmware-utils/src/imagetag.c

     
    44 * for more details. 
    55 * 
    66 * Copyright (C) 2008 Axel Gembe <ago@bastart.eu.org> 
     7 * Copyright (C) 2009 Anselmo LuginbÃŒhl <anselmo@darviniano.eu> 
    78 */ 
    89 
    910#include <stdio.h> 
     
    2324#define DEFAULT_FW_OFFSET               0x10000 
    2425#define DEFAULT_FLASH_START             0xBFC00000 
    2526#define DEFAULT_FLASH_BS                (64 * 1024) 
     27#define DEADCODE                        0xDEADC0DE 
    2628 
    2729/* Kernel header */ 
    2830struct kernelhdr { 
     
    101103        return crc; 
    102104} 
    103105 
     106uint32_t object_crc32(uint32_t crc, FILE *binfile, size_t object_start, size_t object_len) 
     107{ 
     108        uint8_t readbuf[1024]; 
     109        size_t read; 
     110 
     111        fseek(binfile, object_start, SEEK_SET); 
     112         
     113        /* read block of 1024 bytes */ 
     114        while (binfile && !feof(binfile) && !ferror(binfile) && (object_len >= sizeof(readbuf))) { 
     115                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), binfile); 
     116                crc = crc32(crc, readbuf, read); 
     117                object_len = object_len - read; 
     118        } 
     119 
     120        /* Less than 1024 bytes remains, read 1 byte at a time until the end */ 
     121        while (binfile && !feof(binfile) && !ferror(binfile) && (object_len > 0)) { 
     122                read = fread(readbuf, sizeof(uint8_t), 1, binfile); 
     123                crc = crc32(crc, readbuf, read); 
     124                object_len = object_len - read; 
     125        } 
     126 
     127        return crc; 
     128} 
     129 
    104130size_t getlen(FILE *fp) 
    105131{ 
    106132        size_t retval, curpos; 
     
    119145int tagfile(const char *kernel, const char *rootfs, const char *bin, 
    120146            const char *boardid, const char *chipid, const uint32_t fwaddr, 
    121147            const uint32_t loadaddr, const uint32_t entry, 
    122             const char *ver, const char *magic2, const uint32_t flash_bs) 
     148            const char *ver, const char *magic2, const uint32_t flash_bs, const char *dead, 
     149            const char *profile) 
    123150{ 
    124151        struct imagetag tag; 
    125152        struct kernelhdr khdr; 
    126153        FILE *kernelfile = NULL, *rootfsfile = NULL, *binfile; 
    127154        size_t kerneloff, kernellen, rootfsoff, rootfslen, read; 
    128155        uint8_t readbuf[1024]; 
    129         uint32_t crc; 
     156        uint32_t crc = IMAGETAG_CRC_START; 
     157        const uint32_t deadcode = htonl(DEADCODE); 
    130158 
    131159        memset(&tag, 0, sizeof(struct imagetag)); 
    132160 
     
    150178                return 1; 
    151179        } 
    152180 
    153         if (!bin || !(binfile = fopen(bin, "wb"))) { 
     181        if (!bin || !(binfile = fopen(bin, "wb+"))) { 
    154182                fprintf(stderr, "Unable to open output file \"%s\"\n", bin); 
    155183                return 1; 
    156184        } 
     
    177205        fseek(binfile, kerneloff - fwaddr, SEEK_SET); 
    178206 
    179207        /* Write the kernel header */ 
    180         crc = crc32(IMAGETAG_CRC_START, (uint8_t*)&khdr, sizeof(khdr)); 
    181208        fwrite(&khdr, sizeof(khdr), 1, binfile); 
    182209 
    183210        /* Write the kernel */ 
    184211        while (kernelfile && !feof(kernelfile) && !ferror(kernelfile)) { 
    185212                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), kernelfile); 
    186                 crc = crc32(crc, readbuf, read); 
    187213                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    188214        } 
    189215 
     
    191217        fseek(binfile, rootfsoff - fwaddr, SEEK_SET); 
    192218        while (rootfsfile && !feof(rootfsfile) && !ferror(rootfsfile)) { 
    193219                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), rootfsfile); 
    194                 //crc = crc32(crc, readbuf, read); 
    195220                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    196221        } 
    197222 
     223        /* Check it the image should be aligned to specified erase block size */ 
     224        if (dead && (strcmp(dead , "true") == 0)) { 
     225                printf("Data alignement to %dk with 'deadc0de' appended\n", flash_bs/1024); 
     226                /* Align the file size to the erase block size and add deadc0de */ 
     227                fseek(binfile, rootfsoff + rootfslen - fwaddr, SEEK_SET); 
     228                fwrite(&deadcode, sizeof(uint32_t), 1, binfile); 
     229        } 
     230 
     231        /* Choose and compute the CRC32 that should be inserted in the tag */ 
     232        if ( profile && (strcmp(profile, "alice") == 0)) { 
     233                crc = object_crc32(crc, binfile, kerneloff - fwaddr, kernellen); 
     234        } 
     235        else { 
     236                /* Compute the crc32 using only the data from root and kernel files */ 
     237                /* should consider erase block alignement ? */ 
     238                //crc = object_crc32(crc, binfile, kerneloff - fwaddr, rootfsoff + rootfslen - kerneloff); 
     239                crc = object_crc32(crc, binfile, kerneloff - fwaddr, kernellen); 
     240                crc = object_crc32(crc, binfile, rootfsoff - fwaddr, getlen(rootfsfile)); 
     241        } 
     242         
    198243        /* Close the files */ 
    199244        fclose(kernelfile); 
    200245        fclose(rootfsfile); 
     
    206251        strcpy(tag.chipid, chipid); 
    207252        strcpy(tag.boardid, boardid); 
    208253        strcpy(tag.bigendian, "1"); 
    209         sprintf(tag.imagelen, "%lu", kernellen + rootfslen); 
     254        sprintf(tag.imagelen, "%lu", rootfsoff + rootfslen - kerneloff); 
    210255 
    211256        /* We don't include CFE */ 
    212257        strcpy(tag.cfe.address, "0"); 
     
    236281int main(int argc, char **argv) 
    237282{ 
    238283        int c; 
    239         char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver; 
     284        char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver, *profile, *dead; 
    240285        uint32_t flashstart, fwoffset, loadaddr, entry; 
    241286        uint32_t fwaddr, flash_bs; 
    242287         
    243         kernel = rootfs = bin = boardid = chipid = magic2 = ver = NULL; 
     288        kernel = rootfs = bin = boardid = chipid = magic2 = ver = profile = dead = NULL; 
    244289        entry = 0; 
    245290 
    246291        flashstart = DEFAULT_FLASH_START; 
     
    248293        loadaddr = IMAGETAG_DEFAULT_LOADADDR; 
    249294        flash_bs = DEFAULT_FLASH_BS; 
    250295 
    251         printf("Broadcom image tagger - v0.1.1\n"); 
     296        printf("Broadcom image tagger - v0.1.2\n"); 
    252297        printf("Copyright (C) 2008 Axel Gembe\n"); 
    253298 
    254         while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h")) != -1) { 
     299        while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h:d:p:")) != -1) { 
    255300                switch (c) { 
    256301                        case 'i': 
    257302                                kernel = optarg; 
     
    265310                        case 'b': 
    266311                                boardid = optarg; 
    267312                                break; 
     313                        case 'd': 
     314                                dead = optarg; 
     315                                break; 
    268316                        case 'c': 
    269317                                chipid = optarg; 
    270318                                break; 
     
    289337                        case 'e': 
    290338                                entry = strtoul(optarg, NULL, 16); 
    291339                                break; 
     340                        case 'p': 
     341                                profile = optarg; 
     342                                break; 
    292343                        case 'h': 
    293344                        default: 
    294                                 fprintf(stderr, "Usage: imagetag <parameters>\n"); 
    295                                 fprintf(stderr, "-i <kernel>   - The LZMA compressed kernel file to include in the image\n"); 
    296                                 fprintf(stderr, "-f <rootfs>   - The RootFS file to include in the image\n"); 
    297                                 fprintf(stderr, "-o <bin>      - The output file\n"); 
    298                                 fprintf(stderr, "-b <boardid>  - The board id to set in the image (i.e. \"96345GW2\")\n"); 
    299                                 fprintf(stderr, "-c <chipid>   - The chip id to set in the image (i.e. \"6345\")\n"); 
    300                                 fprintf(stderr, "-s <flashstart>   - Flash start address (i.e. \"0xBFC00000\"\n"); 
    301                                 fprintf(stderr, "-n <fwoffset>   - \n"); 
    302                                 fprintf(stderr, "-v <version>   - \n"); 
    303                                 fprintf(stderr, "-m <magic2>    - \n"); 
    304                                 fprintf(stderr, "-k <flash_bs>  - \n"); 
    305                                 fprintf(stderr, "-l <loadaddr> - Address where the kernel expects to be loaded (defaults to 0x80010000)\n"); 
    306                                 fprintf(stderr, "-e <entry>    - Address where the kernel entry point will end up\n"); 
    307                                 fprintf(stderr, "-h            - Displays this text\n"); 
     345                                fprintf(stderr, "Usage: imagetag <parameters>\n\n"); 
     346                                fprintf(stderr, "       -i <kernel>             - The LZMA compressed kernel file to include in the image\n"); 
     347                                fprintf(stderr, "       -f <rootfs>             - The RootFS file to include in the image\n"); 
     348                                fprintf(stderr, "       -o <bin>                - The output file\n"); 
     349                                fprintf(stderr, "       -b <boardid>            - The board id to set in the image (i.e. \"96345GW2\")\n"); 
     350                                fprintf(stderr, "       -c <chipid>             - The chip id to set in the image (i.e. \"6345\")\n"); 
     351                                fprintf(stderr, "       -s <flashstart>         - Flash start address (i.e. \"0xBFC00000\"\n"); 
     352                                fprintf(stderr, "       -n <fwoffset>           - \n"); 
     353                                fprintf(stderr, "       -v <version>            - \n"); 
     354                                fprintf(stderr, "       -m <magic2>             - \n"); 
     355                                fprintf(stderr, "       -k <flash_bs>           - flash erase block size\n"); 
     356                                fprintf(stderr, "       -l <loadaddr>           - Address where the kernel expects to be loaded (defaults to 0x80010000)\n"); 
     357                                fprintf(stderr, "       -e <entry>              - Address where the kernel entry point will end up\n"); 
     358                                fprintf(stderr, "       -d <true,false>         - Select if the image should be aligned to 'flash erase block size' (-k) and 'deadc0de' appended (default false)\n"); 
     359                                fprintf(stderr, "       -p <profile>            - Specify profile for particular devices, use 'list' to see available devices\n"); 
     360                                fprintf(stderr, "       -h                      - Displays this text\n\n"); 
    308361                                return 1; 
    309362                } 
    310363        } 
     
    318371                fprintf(stderr, "You need to specify the kernel entry (-e)\n"); 
    319372                return 1; 
    320373        } 
     374         
     375        if (dead && !((strcmp(dead , "false") == 0) || (strcmp(dead ,"true") == 0))) { 
     376                fprintf(stderr, "available parameters for option 'd' are <true, false>\n"); 
     377                return 1; 
     378        } 
    321379 
     380        if (profile && (strcmp(profile, "list") == 0)) { 
     381                fprintf(stderr, "\n----------------------------------------\n"); 
     382                fprintf(stderr, "\tAvailable Profiles:"); 
     383                fprintf(stderr, "\n\n"); 
     384                fprintf(stderr, "\t'alice'\tALICE GATE VoIP 2 Plus Wi-Fi Business"); 
     385                fprintf(stderr, "\n----------------------------------------\n"); 
     386                return 0; 
     387        } 
     388 
     389        /* If the profile increase should found another way of testing the validity */ 
     390        if (profile && !(strcmp(profile, "alice") == 0)) { 
     391                fprintf(stderr, "You specified an inexistent profile %s, see the list of availables options\n", profile); 
     392                return 1; 
     393        } 
     394 
    322395        /* Fallback to defaults */ 
    323396 
    324397        fwaddr = flashstart + fwoffset; 
     
    340413                } 
    341414                strcpy(ver, IMAGETAG_VER); 
    342415        } 
     416                 
    343417 
    344         return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs); 
     418        return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs, dead, profile); 
    345419}