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@cshore.neomailbox.net>

SVN-Revision: 24833
This commit is contained in:
Daniel Dickinson 2010-12-26 04:17:51 +00:00
parent ec45087403
commit b1362f94bc
3 changed files with 120 additions and 115 deletions

View File

@ -44,31 +44,10 @@
#include "mtd-api.h" #include "mtd-api.h"
#include "fis.h" #include "fis.h"
#include "mtd.h" #include "mtd.h"
#include "crc32.h"
#define MAX_ARGS 8 #define MAX_ARGS 8
#define JFFS2_DEFAULT_DIR "" /* directory name without /, empty means root dir */ #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 *buf = NULL;
static char *imagefile = NULL; static char *imagefile = NULL;
static char *jffs2file = NULL, *jffs2dir = JFFS2_DEFAULT_DIR; static char *jffs2file = NULL, *jffs2dir = JFFS2_DEFAULT_DIR;
@ -151,9 +130,9 @@ static int
image_check(int imagefd, const char *mtd) image_check(int imagefd, const char *mtd)
{ {
int ret = 1; int ret = 1;
#ifdef target_brcm if (trx_check) {
ret = trx_check(imagefd, mtd, buf, &buflen); ret = trx_check(imagefd, mtd, buf, &buflen);
#endif }
return ret; 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 static int
mtd_refresh(const char *mtd) mtd_refresh(const char *mtd)
{ {
@ -594,8 +497,12 @@ static void usage(void)
" refresh refresh mtd partition\n" " refresh refresh mtd partition\n"
" erase erase all data on device\n" " erase erase all data on device\n"
" write <imagefile>|- write <imagefile> (use - for stdin) to device\n" " write <imagefile>|- write <imagefile> (use - for stdin) to device\n"
" jffs2write <file> append <file> to the jffs2 partition on the device\n" " jffs2write <file> append <file> to the jffs2 partition on the device\n");
" fixtrx fix the checksum in a trx header on first boot\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" "Following options are available:\n"
" -q quiet mode (once: no [w] on writing,\n" " -q quiet mode (once: no [w] on writing,\n"
" twice: no status messages)\n" " twice: no status messages)\n"
@ -604,8 +511,12 @@ static void usage(void)
" -f force write without trx checks\n" " -f force write without trx checks\n"
" -e <device> erase <device> before executing the command\n" " -e <device> erase <device> before executing the command\n"
" -d <name> directory for jffs2write, defaults to \"tmp\"\n" " -d <name> directory for jffs2write, defaults to \"tmp\"\n"
" -j <name> integrate <file> into jffs2 data when writing an image\n" " -j <name> integrate <file> into jffs2 data when writing an image\n");
" -o offset offset of the trx header in the partition (for fixtrx)\n" if (mtd_fixtrx) {
fprintf(stderr,
" -o offset offset of the image header in the partition(for fixtrx)\n");
}
fprintf(stderr,
#ifdef FIS_SUPPORT #ifdef FIS_SUPPORT
" -F <part>[:<size>[:<entrypoint>]][,<part>...]\n" " -F <part>[:<size>[:<entrypoint>]][,<part>...]\n"
" alter the fis partition table to create new partitions replacing\n" " alter the fis partition table to create new partitions replacing\n"
@ -686,6 +597,10 @@ int main (int argc, char **argv)
jffs2dir = optarg; jffs2dir = optarg;
break; break;
case 'o': case 'o':
if (!mtd_fixtrx) {
fprintf(stderr, "-o: Only for brcm47xx\n");
usage();
}
errno = 0; errno = 0;
offset = strtoul(optarg, 0, 0); offset = strtoul(optarg, 0, 0);
if (errno) { if (errno) {
@ -717,7 +632,7 @@ int main (int argc, char **argv)
} else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) { } else if ((strcmp(argv[0], "erase") == 0) && (argc == 2)) {
cmd = CMD_ERASE; cmd = CMD_ERASE;
device = argv[1]; 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; cmd = CMD_FIXTRX;
device = argv[1]; device = argv[1];
} else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) { } else if ((strcmp(argv[0], "write") == 0) && (argc == 3)) {
@ -793,7 +708,9 @@ int main (int argc, char **argv)
mtd_refresh(device); mtd_refresh(device);
break; break;
case CMD_FIXTRX: case CMD_FIXTRX:
if (mtd_fixtrx) {
mtd_fixtrx(device, offset); mtd_fixtrx(device, offset);
}
break; break;
} }

View File

@ -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 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); extern void mtd_parse_jffs2data(const char *buf, const char *dir);
/* target specific */ /* target specific functions */
extern int trx_fixup(int fd, const char *name); extern int trx_fixup(int fd, const char *name) __attribute__ ((weak));
extern int trx_check(int imagefd, const char *mtd, char *buf, int *len); 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 */ #endif /* __mtd_h */

View File

@ -27,6 +27,7 @@
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <string.h> #include <string.h>
#include <errno.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include "mtd-api.h" #include "mtd-api.h"
@ -35,13 +36,24 @@
#define TRX_MAGIC 0x30524448 /* "HDR0" */ #define TRX_MAGIC 0x30524448 /* "HDR0" */
struct trx_header { struct trx_header {
unsigned magic; /* "HDR0" */ uint32_t magic; /* "HDR0" */
unsigned len; /* Length of file including header */ uint32_t len; /* Length of file including header */
unsigned crc32; /* 32-bit CRC from flag_version to end of file */ uint32_t crc32; /* 32-bit CRC from flag_version to end of file */
unsigned flag_version; /* 0:15 flags, 16:31 version */ uint32_t flag_version; /* 0:15 flags, 16:31 version */
unsigned offsets[3]; /* Offsets of partitions from start of header */ 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 int
trx_fixup(int fd, const char *name) trx_fixup(int fd, const char *name)
{ {
@ -130,3 +142,79 @@ trx_check(int imagefd, const char *mtd, char *buf, int *len)
return 1; 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;
}