From: Daniel Dickinson Date: Sun, 26 Dec 2010 04:17:51 +0000 (+0000) Subject: mtd: Changed mtd_fixtrx and related functions to be weak references. The weak referen... X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=commitdiff_plain;hb=da238c8db0481a8ca7fc9bd8db463540d5c0c897 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 SVN-Revision: 24833 --- diff --git a/package/mtd/src/mtd.c b/package/mtd/src/mtd.c index 835cbcf4c4..d14b196bc0 100644 --- a/package/mtd/src/mtd.c +++ b/package/mtd/src/mtd.c @@ -44,31 +44,10 @@ #include "mtd-api.h" #include "fis.h" #include "mtd.h" -#include "crc32.h" #define MAX_ARGS 8 #define JFFS2_DEFAULT_DIR "" /* directory name without /, empty means root dir */ -#if __BYTE_ORDER == __BIG_ENDIAN -#define STORE32_LE(X) ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24)) -#elif __BYTE_ORDER == __LITTLE_ENDIAN -#define STORE32_LE(X) (X) -#else -#error unkown endianness! -#endif - -ssize_t pread(int fd, void *buf, size_t count, off_t offset); -ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); - -#define TRX_MAGIC 0x30524448 /* "HDR0" */ -struct trx_header { - uint32_t magic; /* "HDR0" */ - uint32_t len; /* Length of file including header */ - uint32_t crc32; /* 32-bit CRC from flag_version to end of file */ - uint32_t flag_version; /* 0:15 flags, 16:31 version */ - uint32_t offsets[3]; /* Offsets of partitions from start of header */ -}; - static char *buf = NULL; static char *imagefile = NULL; static char *jffs2file = NULL, *jffs2dir = JFFS2_DEFAULT_DIR; @@ -151,9 +130,9 @@ static int image_check(int imagefd, const char *mtd) { int ret = 1; -#ifdef target_brcm - ret = trx_check(imagefd, mtd, buf, &buflen); -#endif + if (trx_check) { + ret = trx_check(imagefd, mtd, buf, &buflen); + } return ret; } @@ -265,82 +244,6 @@ mtd_erase(const char *mtd) } -static int -mtd_fixtrx(const char *mtd, size_t offset) -{ - int fd; - struct trx_header *trx; - char *buf; - ssize_t res; - size_t block_offset; - - if (quiet < 2) - fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); - - block_offset = offset & ~(erasesize - 1); - offset -= block_offset; - - fd = mtd_check_open(mtd); - if(fd < 0) { - fprintf(stderr, "Could not open mtd device: %s\n", mtd); - exit(1); - } - - if (block_offset + erasesize > mtdsize) { - fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); - exit(1); - } - - buf = malloc(erasesize); - if (!buf) { - perror("malloc"); - exit(1); - } - - res = pread(fd, buf, erasesize, block_offset); - if (res != erasesize) { - perror("pread"); - exit(1); - } - - trx = (struct trx_header *) (buf + offset); - if (trx->magic != STORE32_LE(0x30524448)) { - fprintf(stderr, "No trx magic found\n"); - exit(1); - } - - if (trx->len == STORE32_LE(erasesize - offset)) { - if (quiet < 2) - fprintf(stderr, "Header already fixed, exiting\n"); - close(fd); - return 0; - } - - trx->len = STORE32_LE(erasesize - offset); - - trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); - if (mtd_erase_block(fd, block_offset)) { - fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno)); - exit(1); - } - - if (quiet < 2) - fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); - - if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { - fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); - exit(1); - } - - if (quiet < 2) - fprintf(stderr, "Done.\n"); - - close (fd); - sync(); - return 0; - -} - static int mtd_refresh(const char *mtd) { @@ -594,8 +497,12 @@ static void usage(void) " refresh refresh mtd partition\n" " erase erase all data on device\n" " write |- write (use - for stdin) to device\n" - " jffs2write append to the jffs2 partition on the device\n" - " fixtrx fix the checksum in a trx header on first boot\n" + " jffs2write append to the jffs2 partition on the device\n"); + if (mtd_fixtrx) { + fprintf(stderr, + " fixtrx fix the checksum in a trx header on first boot\n"); + } + fprintf(stderr, "Following options are available:\n" " -q quiet mode (once: no [w] on writing,\n" " twice: no status messages)\n" @@ -604,8 +511,12 @@ static void usage(void) " -f force write without trx checks\n" " -e erase before executing the command\n" " -d directory for jffs2write, defaults to \"tmp\"\n" - " -j integrate into jffs2 data when writing an image\n" - " -o offset offset of the trx header in the partition (for fixtrx)\n" + " -j integrate into jffs2 data when writing an image\n"); + if (mtd_fixtrx) { + fprintf(stderr, + " -o offset offset of the image header in the partition(for fixtrx)\n"); + } + fprintf(stderr, #ifdef FIS_SUPPORT " -F [:[:]][,...]\n" " alter the fis partition table to create new partitions replacing\n" @@ -686,6 +597,10 @@ int main (int argc, char **argv) jffs2dir = optarg; break; case 'o': + if (!mtd_fixtrx) { + fprintf(stderr, "-o: Only for brcm47xx\n"); + usage(); + } errno = 0; offset = strtoul(optarg, 0, 0); if (errno) { @@ -717,7 +632,7 @@ int main (int argc, char **argv) } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { cmd = CMD_ERASE; device = argv[1]; - } else if ((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) { + } else if (((strcmp(argv[0], "fixtrx") == 0) && (argc == 2)) && mtd_fixtrx) { cmd = CMD_FIXTRX; device = argv[1]; } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { @@ -793,7 +708,9 @@ int main (int argc, char **argv) mtd_refresh(device); break; case CMD_FIXTRX: - mtd_fixtrx(device, offset); + if (mtd_fixtrx) { + mtd_fixtrx(device, offset); + } break; } diff --git a/package/mtd/src/mtd.h b/package/mtd/src/mtd.h index a0180319e2..f82552a150 100644 --- a/package/mtd/src/mtd.h +++ b/package/mtd/src/mtd.h @@ -21,8 +21,8 @@ extern int mtd_write_jffs2(const char *mtd, const char *filename, const char *di extern int mtd_replace_jffs2(const char *mtd, int fd, int ofs, const char *filename); extern void mtd_parse_jffs2data(const char *buf, const char *dir); -/* target specific */ -extern int trx_fixup(int fd, const char *name); -extern int trx_check(int imagefd, const char *mtd, char *buf, int *len); - +/* target specific functions */ +extern int trx_fixup(int fd, const char *name) __attribute__ ((weak)); +extern int trx_check(int imagefd, const char *mtd, char *buf, int *len) __attribute__ ((weak)); +extern int mtd_fixtrx(const char *mtd, size_t offset) __attribute__ ((weak)); #endif /* __mtd_h */ diff --git a/package/mtd/src/trx.c b/package/mtd/src/trx.c index 7094ef62b0..b8d9e2bf05 100644 --- a/package/mtd/src/trx.c +++ b/package/mtd/src/trx.c @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "mtd-api.h" @@ -35,13 +36,24 @@ #define TRX_MAGIC 0x30524448 /* "HDR0" */ struct trx_header { - unsigned magic; /* "HDR0" */ - unsigned len; /* Length of file including header */ - unsigned crc32; /* 32-bit CRC from flag_version to end of file */ - unsigned flag_version; /* 0:15 flags, 16:31 version */ - unsigned offsets[3]; /* Offsets of partitions from start of header */ + uint32_t magic; /* "HDR0" */ + uint32_t len; /* Length of file including header */ + uint32_t crc32; /* 32-bit CRC from flag_version to end of file */ + uint32_t flag_version; /* 0:15 flags, 16:31 version */ + uint32_t offsets[3]; /* Offsets of partitions from start of header */ }; +#if __BYTE_ORDER == __BIG_ENDIAN +#define STORE32_LE(X) ((((X) & 0x000000FF) << 24) | (((X) & 0x0000FF00) << 8) | (((X) & 0x00FF0000) >> 8) | (((X) & 0xFF000000) >> 24)) +#elif __BYTE_ORDER == __LITTLE_ENDIAN +#define STORE32_LE(X) (X) +#else +#error unknown endianness! +#endif + +ssize_t pread(int fd, void *buf, size_t count, off_t offset); +ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset); + int trx_fixup(int fd, const char *name) { @@ -130,3 +142,79 @@ trx_check(int imagefd, const char *mtd, char *buf, int *len) return 1; } +int +mtd_fixtrx(const char *mtd, size_t offset) +{ + int fd; + struct trx_header *trx; + char *buf; + ssize_t res; + size_t block_offset; + + if (quiet < 2) + fprintf(stderr, "Trying to fix trx header in %s at 0x%x...\n", mtd, offset); + + block_offset = offset & ~(erasesize - 1); + offset -= block_offset; + + fd = mtd_check_open(mtd); + if(fd < 0) { + fprintf(stderr, "Could not open mtd device: %s\n", mtd); + exit(1); + } + + if (block_offset + erasesize > mtdsize) { + fprintf(stderr, "Offset too large, device size 0x%x\n", mtdsize); + exit(1); + } + + buf = malloc(erasesize); + if (!buf) { + perror("malloc"); + exit(1); + } + + res = pread(fd, buf, erasesize, block_offset); + if (res != erasesize) { + perror("pread"); + exit(1); + } + + trx = (struct trx_header *) (buf + offset); + if (trx->magic != STORE32_LE(0x30524448)) { + fprintf(stderr, "No trx magic found\n"); + exit(1); + } + + if (trx->len == STORE32_LE(erasesize - offset)) { + if (quiet < 2) + fprintf(stderr, "Header already fixed, exiting\n"); + close(fd); + return 0; + } + + trx->len = STORE32_LE(erasesize - offset); + + trx->crc32 = STORE32_LE(crc32buf((char*) &trx->flag_version, erasesize - offset - 3*4)); + if (mtd_erase_block(fd, block_offset)) { + fprintf(stderr, "Can't erease block at 0x%x (%s)\n", block_offset, strerror(errno)); + exit(1); + } + + if (quiet < 2) + fprintf(stderr, "New crc32: 0x%x, rewriting block\n", trx->crc32); + + if (pwrite(fd, buf, erasesize, block_offset) != erasesize) { + fprintf(stderr, "Error writing block (%s)\n", strerror(errno)); + exit(1); + } + + if (quiet < 2) + fprintf(stderr, "Done.\n"); + + close (fd); + sync(); + return 0; + +} +