Changeset 27473


Ignore:
Timestamp:
2011-07-06T10:04:50+02:00 (7 years ago)
Author:
juhosg
Message:

tools/firmware-utils: allow to create buffalo image from two files

Location:
trunk/tools/firmware-utils/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/tools/firmware-utils/src/buffalo-lib.h

    r27050 r27473  
    4444        uint32_t        base2; 
    4545        uint32_t        data_len; 
     46        uint8_t         flag; 
     47        uint8_t         unknown2[3]; 
     48} __attribute ((packed)); 
     49 
     50struct buffalo_tag2 { 
     51        unsigned char   product[TAG_PRODUCT_LEN]; 
     52        unsigned char   brand[TAG_BRAND_LEN]; 
     53        unsigned char   ver_major[TAG_VERSION_LEN]; 
     54        unsigned char   ver_minor[TAG_VERSION_LEN]; 
     55        unsigned char   region_code[2]; 
     56        uint32_t        region_mask; 
     57        unsigned char   unknown0[2]; 
     58        unsigned char   language[TAG_LANGUAGE_LEN]; 
     59        unsigned char   platform[TAG_PLATFORM_LEN]; 
     60        unsigned char   hwv[TAG_HWVER_LEN]; 
     61        unsigned char   hwv_val[TAG_HWVER_VAL_LEN]; 
     62        uint8_t         unknown1[24]; 
     63 
     64        uint32_t        total_len; 
     65        uint32_t        crc; 
     66        uint32_t        len1; 
     67        uint32_t        len2; 
    4668        uint8_t         flag; 
    4769        uint8_t         unknown2[3]; 
  • trunk/tools/firmware-utils/src/buffalo-tag.c

    r27472 r27473  
    2828}; 
    2929 
     30#define MAX_INPUT_FILES 2 
     31 
    3032static char *progname; 
    31 static char *ifname; 
     33static char *ifname[MAX_INPUT_FILES]; 
     34static ssize_t fsize[MAX_INPUT_FILES]; 
     35static int num_files; 
    3236static char *ofname; 
    3337static char *product; 
     
    9094} while (0) 
    9195 
    92         CHECKSTR(ifname, "input file", 0); 
     96        if (num_files == 0) 
     97                ERR("no input files specified"); 
     98 
    9399        CHECKSTR(ofname, "output file", 0); 
    94100        CHECKSTR(brand, "brand", TAG_BRAND_LEN); 
     
    140146} 
    141147 
    142 static void fixup_tag(unsigned char *buf, ssize_t buflen, ssize_t datalen) 
     148static int process_ifname(char *name) 
     149{ 
     150        if (num_files >= ARRAY_SIZE(ifname)) { 
     151                ERR("too many input files specified"); 
     152                return -1; 
     153        } 
     154 
     155        ifname[num_files++] = name; 
     156        return 0; 
     157} 
     158 
     159static void fixup_tag(unsigned char *buf, ssize_t buflen) 
    143160{ 
    144161        struct buffalo_tag *tag = (struct buffalo_tag *) buf; 
     
    162179 
    163180        tag->len = htonl(buflen); 
    164         tag->data_len = htonl(datalen); 
     181        tag->data_len = htonl(fsize[0]); 
    165182        tag->base1 = htonl(base1); 
    166183        tag->base2 = htonl(base2); 
     
    176193} 
    177194 
     195static void fixup_tag2(unsigned char *buf, ssize_t buflen) 
     196{ 
     197        struct buffalo_tag2 *tag = (struct buffalo_tag2 *) buf; 
     198 
     199        memset(tag, '\0', sizeof(*tag)); 
     200 
     201        memcpy(tag->brand, brand, strlen(brand)); 
     202        memcpy(tag->product, product, strlen(product)); 
     203        memcpy(tag->platform, platform, strlen(platform)); 
     204        memcpy(tag->ver_major, major, strlen(major)); 
     205        memcpy(tag->ver_minor, minor, strlen(minor)); 
     206        memcpy(tag->language, language, strlen(language)); 
     207 
     208        if (num_regions > 1) { 
     209                tag->region_code[0] = 'M'; 
     210                tag->region_code[1] = '_'; 
     211                tag->region_mask = htonl(region_mask); 
     212        } else { 
     213                memcpy(tag->region_code, region_code, 2); 
     214        } 
     215 
     216        tag->total_len = htonl(buflen); 
     217        tag->len1 = htonl(fsize[0]); 
     218        tag->len2 = htonl(fsize[1]); 
     219        tag->flag = flag; 
     220 
     221        if (hwver) { 
     222                memcpy(tag->hwv, "hwv", 3); 
     223                memcpy(tag->hwv_val, hwver, strlen(hwver)); 
     224        } 
     225 
     226        if (!skipcrc) 
     227                tag->crc = htonl(buffalo_crc(buf, buflen)); 
     228} 
     229 
    178230static int tag_file(void) 
    179231{ 
    180232        unsigned char *buf; 
    181         ssize_t fsize; 
     233        ssize_t offset; 
     234        ssize_t hdrlen; 
    182235        ssize_t buflen; 
    183236        int err; 
    184237        int ret = -1; 
    185  
    186         fsize = get_file_size(ifname); 
    187         if (fsize < 0) { 
    188                 ERR("unable to get size of '%s'", ifname); 
    189                 goto out; 
    190         } 
    191  
    192         buflen = fsize + sizeof(struct buffalo_tag); 
     238        int i; 
     239 
     240        if (num_files == 1) 
     241                hdrlen = sizeof(struct buffalo_tag); 
     242        else 
     243                hdrlen = sizeof(struct buffalo_tag2); 
     244 
     245        buflen = hdrlen; 
     246 
     247        for (i = 0; i < num_files; i++) { 
     248                fsize[i] = get_file_size(ifname[i]); 
     249                if (fsize[i] < 0) { 
     250                        ERR("unable to get size of '%s'", ifname[i]); 
     251                        goto out; 
     252                } 
     253                buflen += fsize[i]; 
     254        } 
     255 
    193256        buf = malloc(buflen); 
    194257        if (!buf) { 
     
    197260        } 
    198261 
    199         err = read_file_to_buf(ifname, buf + sizeof(struct buffalo_tag), 
    200                                fsize); 
    201         if (err) { 
    202                 ERR("unable to read from file '%s'", ifname); 
    203                 goto free_buf; 
    204         } 
    205  
    206         fixup_tag(buf, buflen, fsize); 
     262        offset = hdrlen; 
     263        for (i = 0; i < num_files; i++) { 
     264                err = read_file_to_buf(ifname[i], buf + offset, fsize[i]); 
     265                if (err) { 
     266                        ERR("unable to read from file '%s'", ifname[i]); 
     267                        goto free_buf; 
     268                } 
     269 
     270                offset += fsize[i]; 
     271        } 
     272 
     273        if (num_files == 1) 
     274                fixup_tag(buf, buflen); 
     275        else 
     276                fixup_tag2(buf, buflen); 
    207277 
    208278        err = write_buf_to_file(ofname, buf, buflen); 
     
    251321                        break; 
    252322                case 'i': 
    253                         ifname = optarg; 
     323                        err = process_ifname(optarg); 
     324                        if (err) 
     325                                goto out; 
    254326                        break; 
    255327                case 'l': 
Note: See TracChangeset for help on using the changeset viewer.