From: Daniel Dickinson <crazycshore@gmail.com>
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.cdn.openwrt.org/?a=commitdiff_plain;h=b1362f94bcc99a2190b0d6778c41e8a21d21aa02;p=openwrt%2Fstaging%2Fjow.git

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
---

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 <imagefile>|-     write <imagefile> (use - for stdin) to 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"
+	"        jffs2write <file>       append <file> 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 <device>             erase <device> before executing the command\n"
 	"        -d <name>               directory for jffs2write, defaults to \"tmp\"\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"
+	"        -j <name>               integrate <file> 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 <part>[:<size>[:<entrypoint>]][,<part>...]\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 <sys/mman.h>
 #include <sys/stat.h>
 #include <string.h>
+#include <errno.h>
 
 #include <sys/ioctl.h>
 #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;
+
+}
+