Changeset 24833


Ignore:
Timestamp:
2010-12-26T05:17:51+01:00 (7 years ago)
Author:
cshore
Message:

mtd: Changed mtd_fixtrx and related functions to be weak references. The weak references only lead to actual functions for brcm47xx

Signed-off-by: Daniel Dickinson <daniel@…>

Location:
trunk/package/mtd/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/mtd/src/mtd.c

    r24135 r24833  
    4545#include "fis.h" 
    4646#include "mtd.h" 
    47 #include "crc32.h" 
    4847 
    4948#define MAX_ARGS 8 
    5049#define JFFS2_DEFAULT_DIR       "" /* directory name without /, empty means root dir */ 
    51  
    52 #if __BYTE_ORDER == __BIG_ENDIAN 
    53 #define STORE32_LE(X)           ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24)) 
    54 #elif __BYTE_ORDER == __LITTLE_ENDIAN 
    55 #define STORE32_LE(X)           (X) 
    56 #else 
    57 #error unkown endianness! 
    58 #endif 
    59  
    60 ssize_t pread(int fd, void *buf, size_t count, off_t offset); 
    61 ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); 
    62  
    63 #define TRX_MAGIC       0x30524448      /* "HDR0" */ 
    64 struct trx_header { 
    65         uint32_t magic;         /* "HDR0" */ 
    66         uint32_t len;           /* Length of file including header */ 
    67         uint32_t crc32;         /* 32-bit CRC from flag_version to end of file */ 
    68         uint32_t flag_version;  /* 0:15 flags, 16:31 version */ 
    69         uint32_t offsets[3];    /* Offsets of partitions from start of header */ 
    70 }; 
    7150 
    7251static char *buf = NULL; 
     
    152131{ 
    153132        int ret = 1; 
    154 #ifdef target_brcm 
    155         ret = trx_check(imagefd, mtd, buf, &buflen); 
    156 #endif 
     133        if (trx_check) { 
     134          ret = trx_check(imagefd, mtd, buf, &buflen); 
     135        } 
    157136        return ret; 
    158137} 
     
    262241 
    263242        close(fd); 
    264         return 0; 
    265  
    266 } 
    267  
    268 static int 
    269 mtd_fixtrx(const char *mtd, size_t offset) 
    270 { 
    271         int fd; 
    272         struct trx_header *trx; 
    273         char *buf; 
    274         ssize_t res; 
    275         size_t block_offset; 
    276  
    277         if (quiet < 2) 
    278                 fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); 
    279  
    280         block_offset = offset & ~(erasesize - 1); 
    281         offset -= block_offset; 
    282  
    283         fd = mtd_check_open(mtd); 
    284         if(fd < 0) { 
    285                 fprintf(stderr, "Could not open mtd device: %s\n", mtd); 
    286                 exit(1); 
    287         } 
    288  
    289         if (block_offset + erasesize > mtdsize) { 
    290                 fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); 
    291                 exit(1); 
    292         } 
    293  
    294         buf = malloc(erasesize); 
    295         if (!buf) { 
    296                 perror("malloc"); 
    297                 exit(1); 
    298         } 
    299  
    300         res = pread(fd, buf, erasesize, block_offset); 
    301         if (res != erasesize) { 
    302                 perror("pread"); 
    303                 exit(1); 
    304         } 
    305  
    306         trx = (struct trx_header *) (buf + offset); 
    307         if (trx->magic != STORE32_LE(0x30524448)) { 
    308                 fprintf(stderr, "No trx magic found\n"); 
    309                 exit(1); 
    310         } 
    311  
    312         if (trx->len == STORE32_LE(erasesize - offset)) { 
    313                 if (quiet < 2) 
    314                         fprintf(stderr, "Header already fixed, exiting\n"); 
    315                 close(fd); 
    316                 return 0; 
    317         } 
    318  
    319         trx->len = STORE32_LE(erasesize - offset); 
    320  
    321         trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); 
    322         if (mtd_erase_block(fd, block_offset)) { 
    323                 fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno)); 
    324                 exit(1); 
    325         } 
    326  
    327         if (quiet < 2) 
    328                 fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); 
    329  
    330         if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { 
    331                 fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); 
    332                 exit(1); 
    333         } 
    334  
    335         if (quiet < 2) 
    336                 fprintf(stderr, "Done.\n"); 
    337  
    338         close (fd); 
    339         sync(); 
    340243        return 0; 
    341244 
     
    595498        "        erase                   erase all data on device\n" 
    596499        "        write <imagefile>|-     write <imagefile> (use - for stdin) to device\n" 
    597         "        jffs2write <file>       append <file> to the jffs2 partition on the device\n" 
    598         "        fixtrx                  fix the checksum in a trx header on first boot\n" 
     500        "        jffs2write <file>       append <file> to the jffs2 partition on the device\n"); 
     501        if (mtd_fixtrx) { 
     502            fprintf(stderr, 
     503        "        fixtrx                  fix the checksum in a trx header on first boot\n"); 
     504        } 
     505    fprintf(stderr,      
    599506        "Following options are available:\n" 
    600507        "        -q                      quiet mode (once: no [w] on writing,\n" 
     
    605512        "        -e <device>             erase <device> before executing the command\n" 
    606513        "        -d <name>               directory for jffs2write, defaults to \"tmp\"\n" 
    607         "        -j <name>               integrate <file> into jffs2 data when writing an image\n" 
    608         "        -o offset               offset of the trx header in the partition (for fixtrx)\n" 
     514        "        -j <name>               integrate <file> into jffs2 data when writing an image\n"); 
     515        if (mtd_fixtrx) { 
     516            fprintf(stderr, 
     517        "        -o offset               offset of the image header in the partition(for fixtrx)\n"); 
     518    } 
     519        fprintf(stderr, 
    609520#ifdef FIS_SUPPORT 
    610521        "        -F <part>[:<size>[:<entrypoint>]][,<part>...]\n" 
     
    687598                                break; 
    688599                        case 'o': 
     600                            if (!mtd_fixtrx) { 
     601                                    fprintf(stderr, "-o: Only for brcm47xx\n"); 
     602                                        usage(); 
     603                                } 
    689604                                errno = 0; 
    690605                                offset = strtoul(optarg, 0, 0); 
     
    718633                cmd = CMD_ERASE; 
    719634                device = argv[1]; 
    720         } else if ((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) { 
     635        } else if (((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) && mtd_fixtrx) { 
    721636                cmd = CMD_FIXTRX; 
    722637                device = argv[1]; 
     
    794709                        break; 
    795710                case CMD_FIXTRX: 
    796                         mtd_fixtrx(device, offset); 
     711                    if (mtd_fixtrx) { 
     712                            mtd_fixtrx(device, offset); 
     713            } 
    797714                        break; 
    798715        } 
  • trunk/package/mtd/src/mtd.h

    r12655 r24833  
    2222extern void mtd_parse_jffs2data(const char *buf, const char *dir); 
    2323 
    24 /* target specific */ 
    25 extern int trx_fixup(int fd, const char *name); 
    26 extern int trx_check(int imagefd, const char *mtd, char *buf, int *len); 
    27  
     24/* target specific functions */ 
     25extern int trx_fixup(int fd, const char *name)  __attribute__ ((weak)); 
     26extern int trx_check(int imagefd, const char *mtd, char *buf, int *len) __attribute__ ((weak)); 
     27extern int mtd_fixtrx(const char *mtd, size_t offset) __attribute__ ((weak)); 
    2828#endif /* __mtd_h */ 
  • trunk/package/mtd/src/trx.c

    r20524 r24833  
    2828#include <sys/stat.h> 
    2929#include <string.h> 
     30#include <errno.h> 
    3031 
    3132#include <sys/ioctl.h> 
     
    3637#define TRX_MAGIC       0x30524448      /* "HDR0" */ 
    3738struct trx_header { 
    38         unsigned magic;         /* "HDR0" */ 
    39         unsigned len;           /* Length of file including header */ 
    40         unsigned crc32;         /* 32-bit CRC from flag_version to end of file */ 
    41         unsigned flag_version;  /* 0:15 flags, 16:31 version */ 
    42         unsigned offsets[3];    /* Offsets of partitions from start of header */ 
     39        uint32_t magic;         /* "HDR0" */ 
     40        uint32_t len;           /* Length of file including header */ 
     41        uint32_t crc32;         /* 32-bit CRC from flag_version to end of file */ 
     42        uint32_t flag_version;  /* 0:15 flags, 16:31 version */ 
     43        uint32_t offsets[3];    /* Offsets of partitions from start of header */ 
    4344}; 
     45 
     46#if __BYTE_ORDER == __BIG_ENDIAN 
     47#define STORE32_LE(X)           ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24)) 
     48#elif __BYTE_ORDER == __LITTLE_ENDIAN 
     49#define STORE32_LE(X)           (X) 
     50#else 
     51#error unknown endianness! 
     52#endif 
     53 
     54ssize_t pread(int fd, void *buf, size_t count, off_t offset); 
     55ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); 
    4456 
    4557int 
     
    131143} 
    132144 
     145int 
     146mtd_fixtrx(const char *mtd, size_t offset) 
     147{ 
     148        int fd; 
     149        struct trx_header *trx; 
     150        char *buf; 
     151        ssize_t res; 
     152        size_t block_offset; 
     153 
     154        if (quiet < 2) 
     155                fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); 
     156 
     157        block_offset = offset & ~(erasesize - 1); 
     158        offset -= block_offset; 
     159 
     160        fd = mtd_check_open(mtd); 
     161        if(fd < 0) { 
     162                fprintf(stderr, "Could not open mtd device: %s\n", mtd); 
     163                exit(1); 
     164        } 
     165 
     166        if (block_offset + erasesize > mtdsize) { 
     167                fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); 
     168                exit(1); 
     169        } 
     170 
     171        buf = malloc(erasesize); 
     172        if (!buf) { 
     173                perror("malloc"); 
     174                exit(1); 
     175        } 
     176 
     177        res = pread(fd, buf, erasesize, block_offset); 
     178        if (res != erasesize) { 
     179                perror("pread"); 
     180                exit(1); 
     181        } 
     182 
     183        trx = (struct trx_header *) (buf + offset); 
     184        if (trx->magic != STORE32_LE(0x30524448)) { 
     185                fprintf(stderr, "No trx magic found\n"); 
     186                exit(1); 
     187        } 
     188 
     189        if (trx->len == STORE32_LE(erasesize - offset)) { 
     190                if (quiet < 2) 
     191                        fprintf(stderr, "Header already fixed, exiting\n"); 
     192                close(fd); 
     193                return 0; 
     194        } 
     195 
     196        trx->len = STORE32_LE(erasesize - offset); 
     197 
     198        trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); 
     199        if (mtd_erase_block(fd, block_offset)) { 
     200                fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno)); 
     201                exit(1); 
     202        } 
     203 
     204        if (quiet < 2) 
     205                fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); 
     206 
     207        if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { 
     208                fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); 
     209                exit(1); 
     210        } 
     211 
     212        if (quiet < 2) 
     213                fprintf(stderr, "Done.\n"); 
     214 
     215        close (fd); 
     216        sync(); 
     217        return 0; 
     218 
     219} 
     220 
Note: See TracChangeset for help on using the changeset viewer.