Changeset 15253


Ignore:
Timestamp:
2009-04-19T15:18:48+02:00 (9 years ago)
Author:
florian
Message:

[brcm63xx] make images that can be flashed using the stock firmware web interface, thanks to Anselmo Luginbuhl and Daniel Dickinson (#4909, #4943)

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm63xx/files/include/asm-mips/mach-bcm63xx/bcm_tag.h

    r13379 r15253  
    1515        unsigned char cfeAddress[ADDRESS_LEN];  // Address in memory of CFE 
    1616        unsigned char cfeLength[IMAGE_LEN];             // Size of CFE 
    17         unsigned char rootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
    18         unsigned char rootLength[IMAGE_LEN];            // Size of rootfs 
     17        unsigned char cfeRootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
     18        unsigned char cfeRootLength[IMAGE_LEN];            // Size of rootfs 
    1919        unsigned char kernelAddress[ADDRESS_LEN];       // Address in memory of kernel 
    2020        unsigned char kernelLength[IMAGE_LEN];  // Size of kernel 
     
    2323        unsigned char reserved1[74];                            // Reserved area not in use 
    2424        unsigned char imageCRC[4];                              // CRC32 of images 
    25         unsigned char reserved2[16];                            // Unused at present 
    26         unsigned char headerCRC[4];                             // CRC32 of header excluding tagVersion 
    27         unsigned char reserved3[16];                            // Unused at present 
     25//      unsigned char reserved2[16];                    // Unused at present 
     26        unsigned char reserved2[4];                     //Unused 
     27        unsigned char rootAddress[ADDRESS_LEN];         // Address in memory of rootfs 
     28        unsigned char headerCRC[4];                     // CRC32 of header excluding tagVersion 
     29//      unsigned char reserved3[16];                    // Unused at present 
     30        unsigned char reserved3[6];                     // Unused at present 
     31        unsigned char rootLength[IMAGE_LEN];            // Size of rootfs 
    2832}; 
    2933 
  • trunk/target/linux/brcm63xx/image/Makefile

    r15133 r15253  
    3535#               -b $(2) -c $(3) -e $(KERNEL_ENTRY) -l $(LOADADDR) 
    3636 
    37         $(call prepare_generic_squashfs,$(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin) 
    3837endef 
    3938 
     
    4342                -o $(BIN_DIR)/openwrt-$(2)-$(1)-cfe.bin \ 
    4443                -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) 
     44                -v 8 -m IMAGE -k 0x20000 -n $(4) -p alice 
    4745endef 
    4846 
  • trunk/tools/firmware-utils/src/imagetag.c

    r15140 r15253  
    2424#define DEFAULT_FLASH_START             0xBFC00000 
    2525#define DEFAULT_FLASH_BS                (64 * 1024) 
     26#define DEADCODE                        0xDEADC0DE 
    2627 
    2728/* Kernel header */ 
     
    4849        uint8_t                 imagelen[10];   /*  62 -  71: The length of all data that follows */ 
    4950        struct imagecomp        cfe;            /*  72 -  93: The offset and length of CFE */ 
    50         struct imagecomp        rootfs;         /*  94 - 115: The offset and length of the root file system */ 
     51        struct imagecomp        rootfs; /*  94 - 115: The offset and length of the root file system */ 
    5152        struct imagecomp        kernel;         /* 116 - 137: The offset and length of the kernel */ 
    5253        uint8_t                 dualimage[2];   /* 138 - 139: use "0" here */ 
     
    5455        uint8_t                 reserved1[74];  /* 142 - 215: reserved */ 
    5556        uint32_t                imagecrc;       /* 216 - 219: crc of the images (net byte order) */ 
    56         uint8_t                 reserved2[16];  /* 220 - 235: reserved */ 
     57//      uint8_t                 reserved2[16];  /* 220 - 235: reserved */ 
     58        uint8_t                 reserved2[4];   /* 220 - 223: reserved */ 
     59        uint8_t                 wrtrootfsaddr[12];      /* 224 - 235: wrt rootfs address */ 
    5760        uint32_t                headercrc;      /* 236 - 239: crc starting from sig1 until headercrc (net byte order) */ 
    58         uint8_t                 reserved3[16];  /* 240 - 255: reserved */ 
     61//      uint8_t                 reserved3[16];  /* 240 - 255: reserved */ 
     62        uint8_t                 reserved3[6];   /* 240 - 245: reserved */ 
     63        uint8_t                 wrtrootfslen[10];       /* 246 - 255: wrt rootfs lenght */ 
    5964}; 
    6065 
     
    102107} 
    103108 
     109uint32_t compute_crc32(uint32_t crc, FILE *binfile, size_t compute_start, size_t compute_len) 
     110{ 
     111        uint8_t readbuf[1024]; 
     112        size_t read; 
     113 
     114        fseek(binfile, compute_start, SEEK_SET); 
     115         
     116        /* read block of 1024 bytes */ 
     117        while (binfile && !feof(binfile) && !ferror(binfile) && (compute_len >= sizeof(readbuf))) { 
     118                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), binfile); 
     119                crc = crc32(crc, readbuf, read); 
     120                compute_len = compute_len - read; 
     121        } 
     122 
     123        /* Less than 1024 bytes remains, read compute_len bytes */ 
     124        if (binfile && !feof(binfile) && !ferror(binfile) && (compute_len > 0)) { 
     125                read = fread(readbuf, sizeof(uint8_t), compute_len, binfile); 
     126                crc = crc32(crc, readbuf, read); 
     127        } 
     128 
     129        return crc; 
     130} 
     131 
    104132size_t getlen(FILE *fp) 
    105133{ 
     
    120148            const char *boardid, const char *chipid, const uint32_t fwaddr, 
    121149            const uint32_t loadaddr, const uint32_t entry, 
    122             const char *ver, const char *magic2, const uint32_t flash_bs) 
     150            const char *ver, const char *magic2, const uint32_t flash_bs, 
     151            const char *profile) 
    123152{ 
    124153        struct imagetag tag; 
    125154        struct kernelhdr khdr; 
    126155        FILE *kernelfile = NULL, *rootfsfile = NULL, *binfile; 
    127         size_t kerneloff, kernellen, rootfsoff, rootfslen, read; 
     156        size_t kerneloff, kernellen, rootfsoff, rootfslen, read, imagelen; 
    128157        uint8_t readbuf[1024]; 
    129         uint32_t crc; 
     158        uint32_t crc = IMAGETAG_CRC_START; 
     159        const uint32_t deadcode = htonl(DEADCODE); 
    130160 
    131161        memset(&tag, 0, sizeof(struct imagetag)); 
     
    151181        } 
    152182 
    153         if (!bin || !(binfile = fopen(bin, "wb"))) { 
     183        if (!bin || !(binfile = fopen(bin, "wb+"))) { 
    154184                fprintf(stderr, "Unable to open output file \"%s\"\n", bin); 
    155185                return 1; 
     
    173203        rootfslen = getlen(rootfsfile); 
    174204        rootfslen = (rootfslen % flash_bs) > 0 ? (((rootfslen / flash_bs) + 1) * flash_bs) : rootfslen; 
     205        imagelen = rootfsoff + rootfslen - kerneloff + sizeof(deadcode); 
    175206 
    176207        /* Seek to the start of the kernel */ 
     
    178209 
    179210        /* Write the kernel header */ 
    180         crc = crc32(IMAGETAG_CRC_START, (uint8_t*)&khdr, sizeof(khdr)); 
    181211        fwrite(&khdr, sizeof(khdr), 1, binfile); 
    182212 
     
    184214        while (kernelfile && !feof(kernelfile) && !ferror(kernelfile)) { 
    185215                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), kernelfile); 
    186                 crc = crc32(crc, readbuf, read); 
    187216                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    188217        } 
     
    192221        while (rootfsfile && !feof(rootfsfile) && !ferror(rootfsfile)) { 
    193222                read = fread(readbuf, sizeof(uint8_t), sizeof(readbuf), rootfsfile); 
    194                 //crc = crc32(crc, readbuf, read); 
    195223                fwrite(readbuf, sizeof(uint8_t), read, binfile); 
    196224        } 
    197225 
     226        /* Align image to specified erase block size and append deadc0de */ 
     227        printf("Data alignment to %dk with 'deadc0de' appended\n", flash_bs/1024); 
     228        fseek(binfile, rootfsoff + rootfslen - fwaddr, SEEK_SET); 
     229        fwrite(&deadcode, sizeof(uint32_t), 1, binfile); 
     230         
     231 
     232        /* Choose and compute the CRC32 that should be inserted in the tag */ 
     233        /* and fill reserved tag following profile specification           */ 
     234        if ( profile && (strcmp(profile, "alice") == 0)) { 
     235                crc = compute_crc32(crc, binfile, kerneloff - fwaddr, kernellen); 
     236                /* Should fill alice_data and put them on reserved1 */ 
     237        } 
     238        else { 
     239                /* Compute the crc32 of the entire image (deadC0de included) */ 
     240                crc = compute_crc32(crc, binfile, kerneloff - fwaddr, imagelen); 
     241        } 
     242 
     243         
    198244        /* Close the files */ 
    199245        fclose(kernelfile); 
     
    207253        strcpy(tag.boardid, boardid); 
    208254        strcpy(tag.bigendian, "1"); 
    209         sprintf(tag.imagelen, "%lu", kernellen + rootfslen); 
     255        sprintf(tag.imagelen, "%lu", imagelen); 
    210256 
    211257        /* We don't include CFE */ 
     
    219265 
    220266        if (rootfsfile) { 
    221                 sprintf(tag.rootfs.address, "%lu", rootfsoff); 
    222                 sprintf(tag.rootfs.len, "%lu", rootfslen); 
     267                sprintf(tag.rootfs.address, "%lu", kerneloff); 
     268                sprintf(tag.rootfs.len, "%lu", rootfslen + sizeof(deadcode)); 
     269                sprintf(tag.wrtrootfsaddr, "%lu", rootfsoff); 
     270                sprintf(tag.wrtrootfslen, "%lu", rootfslen); 
    223271        } 
    224272 
     
    237285{ 
    238286        int c; 
    239         char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver; 
     287        char *kernel, *rootfs, *bin, *boardid, *chipid, *magic2, *ver, *profile; 
    240288        uint32_t flashstart, fwoffset, loadaddr, entry; 
    241289        uint32_t fwaddr, flash_bs; 
    242290         
    243         kernel = rootfs = bin = boardid = chipid = magic2 = ver = NULL; 
     291        kernel = rootfs = bin = boardid = chipid = magic2 = ver = profile = NULL; 
    244292        entry = 0; 
    245293 
     
    249297        flash_bs = DEFAULT_FLASH_BS; 
    250298 
    251         printf("Broadcom image tagger - v0.1.1\n"); 
     299        printf("Broadcom image tagger - v0.1.2\n"); 
    252300        printf("Copyright (C) 2008 Axel Gembe\n"); 
    253301 
    254         while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h")) != -1) { 
     302        while ((c = getopt(argc, argv, "i:f:o:b:c:s:n:v:m:k:l:e:h:p:")) != -1) { 
    255303                switch (c) { 
    256304                        case 'i': 
     
    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, "       -p <profile>            - Specify profile for particular devices, use 'list' to see available devices\n"); 
     359                                fprintf(stderr, "       -h                      - Displays this text\n\n"); 
    308360                                return 1; 
    309361                } 
     
    317369        if (entry == 0) { 
    318370                fprintf(stderr, "You need to specify the kernel entry (-e)\n"); 
     371                return 1; 
     372        } 
     373         
     374        if (profile && (strcmp(profile, "list") == 0)) { 
     375                fprintf(stderr, "\n----------------------------------------\n"); 
     376                fprintf(stderr, "\tAvailable Profiles:"); 
     377                fprintf(stderr, "\n\n"); 
     378                fprintf(stderr, "\t'alice'\tALICE GATE VoIP 2 Plus Wi-Fi Business"); 
     379                fprintf(stderr, "\n----------------------------------------\n"); 
     380                return 0; 
     381        } 
     382 
     383        /* If the profile increase should found another way of testing the validity */ 
     384        if (profile && !(strcmp(profile, "alice") == 0)) { 
     385                fprintf(stderr, "You specified an inexistent profile %s, see the list of availables options\n", profile); 
    319386                return 1; 
    320387        } 
     
    341408                strcpy(ver, IMAGETAG_VER); 
    342409        } 
    343  
    344         return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs); 
     410                 
     411 
     412        return tagfile(kernel, rootfs, bin, boardid, chipid, fwaddr, loadaddr, entry, ver, magic2, flash_bs, profile); 
    345413} 
Note: See TracChangeset for help on using the changeset viewer.