Changeset 20524


Ignore:
Timestamp:
2010-03-27T18:38:33+01:00 (8 years ago)
Author:
juhosg
Message:

package/mtd: add fixtrx command

  • patch by Bernhard Loos
  • note: trailing whitespaces are removed
Location:
trunk/package/mtd/src
Files:
2 edited

Legend:

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

    r19263 r20524  
    4545#include "fis.h" 
    4646#include "mtd.h" 
     47#include "crc32.h" 
    4748 
    4849#define MAX_ARGS 8 
    4950#define JFFS2_DEFAULT_DIR       "" /* directory name without /, empty means root dir */ 
    5051 
     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 
     60ssize_t pread(int fd, void *buf, size_t count, off_t offset); 
     61ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); 
     62 
     63#define TRX_MAGIC       0x30524448      /* "HDR0" */ 
    5164struct trx_header { 
    5265        uint32_t magic;         /* "HDR0" */ 
     
    248261 
    249262        close(fd); 
     263        return 0; 
     264 
     265} 
     266 
     267static int 
     268mtd_fixtrx(const char *mtd, size_t offset) 
     269{ 
     270        int fd; 
     271        struct trx_header *trx; 
     272        char *buf; 
     273        ssize_t res; 
     274        size_t block_offset; 
     275 
     276        if (quiet < 2) 
     277                fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); 
     278 
     279        block_offset = offset & ~(erasesize - 1); 
     280        offset -= block_offset; 
     281 
     282        fd = mtd_check_open(mtd); 
     283        if(fd < 0) { 
     284                fprintf(stderr, "Could not open mtd device: %s\n", mtd); 
     285                exit(1); 
     286        } 
     287 
     288        if (block_offset + erasesize > mtdsize) { 
     289                fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); 
     290                exit(1); 
     291        } 
     292 
     293        buf = malloc(erasesize); 
     294        if (!buf) { 
     295                perror("malloc"); 
     296                exit(1); 
     297        } 
     298 
     299        res = pread(fd, buf, erasesize, block_offset); 
     300        if (res != erasesize) { 
     301                perror("pread"); 
     302                exit(1); 
     303        } 
     304 
     305        trx = (struct trx_header *) (buf + offset); 
     306        if (trx->magic != STORE32_LE(0x30524448)) { 
     307                fprintf(stderr, "No trx magic found\n"); 
     308                exit(1); 
     309        } 
     310 
     311        if (trx->len == STORE32_LE(erasesize - offset)) { 
     312                if (quiet < 2) 
     313                        fprintf(stderr, "Header already fixed, exiting\n"); 
     314                close(fd); 
     315                return 0; 
     316        } 
     317 
     318        trx->len = STORE32_LE(erasesize - offset); 
     319 
     320        trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); 
     321        if (mtd_erase_block(fd, block_offset)) { 
     322                fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno)); 
     323                exit(1); 
     324        } 
     325 
     326        if (quiet < 2) 
     327                fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); 
     328 
     329        if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { 
     330                fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); 
     331                exit(1); 
     332        } 
     333 
     334        if (quiet < 2) 
     335                fprintf(stderr, "Done.\n"); 
     336 
     337        close (fd); 
     338        sync(); 
    250339        return 0; 
    251340 
     
    481570        "        write <imagefile>|-     write <imagefile> (use - for stdin) to device\n" 
    482571        "        jffs2write <file>       append <file> to the jffs2 partition on the device\n" 
     572        "        fixtrx                  fix the checksum in a trx header on first boot\n" 
    483573        "Following options are available:\n" 
    484574        "        -q                      quiet mode (once: no [w] on writing,\n" 
     
    489579        "        -d <name>               directory for jffs2write, defaults to \"tmp\"\n" 
    490580        "        -j <name>               integrate <file> into jffs2 data when writing an image\n" 
     581        "        -o offset               offset of the trx header in the partition (for fixtrx)\n" 
    491582#ifdef FIS_SUPPORT 
    492583        "        -F <part>[:<size>[:<entrypoint>]][,<part>...]\n" 
     
    519610        char *erase[MAX_ARGS], *device = NULL; 
    520611        char *fis_layout = NULL; 
     612        size_t offset = 0; 
    521613        enum { 
    522614                CMD_ERASE, 
     
    524616                CMD_UNLOCK, 
    525617                CMD_REFRESH, 
    526                 CMD_JFFS2WRITE 
     618                CMD_JFFS2WRITE, 
     619                CMD_FIXTRX, 
    527620        } cmd = -1; 
    528621 
     
    537630                        "F:" 
    538631#endif 
    539                         "frqe:d:j:")) != -1) 
     632                        "frqe:d:j:o:")) != -1) 
    540633                switch (ch) { 
    541634                        case 'f': 
     
    561654                        case 'd': 
    562655                                jffs2dir = optarg; 
     656                                break; 
     657                        case 'o': 
     658                                errno = 0; 
     659                                offset = strtoul(optarg, 0, 0); 
     660                                if (errno) { 
     661                                        fprintf(stderr, "-o: illegal numeric string\n"); 
     662                                        usage(); 
     663                                } 
    563664                                break; 
    564665#ifdef FIS_SUPPORT 
     
    585686        } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { 
    586687                cmd = CMD_ERASE; 
     688                device = argv[1]; 
     689        } else if ((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) { 
     690                cmd = CMD_FIXTRX; 
    587691                device = argv[1]; 
    588692        } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { 
     
    658762                        mtd_refresh(device); 
    659763                        break; 
     764                case CMD_FIXTRX: 
     765                        mtd_fixtrx(device, offset); 
     766                        break; 
    660767        } 
    661768 
  • trunk/package/mtd/src/trx.c

    r20523 r20524  
    22 * trx.c 
    33 * 
    4  * Copyright (C) 2005 Mike Baker  
     4 * Copyright (C) 2005 Mike Baker 
    55 * Copyright (C) 2008 Felix Fietkau <nbd@openwrt.org> 
    66 * 
     
    7676        } 
    7777 
    78         init_crc32(); 
    7978        scan = ptr + offsetof(struct trx_header, flag_version); 
    8079        trx->crc32 = crc32buf(scan, trx->len - (scan - ptr)); 
Note: See TracChangeset for help on using the changeset viewer.