check if firmware is in trx format, before writing it to the flash

SVN-Revision: 1431
master
Waldemar Brodkorb 19 years ago
parent 3d5a13bd6b
commit 48d9625869
  1. 65
      openwrt/package/openwrt/mtd.c

@ -42,25 +42,18 @@
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
/* trx header */
#define TRX_MAGIC 0x30524448 /* "HDR0" */ #define TRX_MAGIC 0x30524448 /* "HDR0" */
#define TRX_VERSION 1 #define BUFSIZE (10 * 1024)
#define TRX_MAX_LEN 0x3A0000
#define TRX_NO_HEADER 1 /* Do not write TRX header */
#define MAX_ARGS 8 #define MAX_ARGS 8
struct trx_header { struct trx_header {
uint32_t magic; /* "HDR0" */ uint32_t magic; /* "HDR0" */
uint32_t len; /* Length of file including header */ uint32_t len; /* Length of file including header */
uint32_t crc32; /* 32-bit CRC from flag_version to end of file */ 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 flag_version; /* 0:15 flags, 16:31 version */
uint32_t offsets[3]; /* Offsets of partitions from start of header */ uint32_t offsets[3]; /* Offsets of partitions from start of header */
}; };
#define BUFSIZE (10 * 1024)
int int
mtd_unlock(const char *mtd) mtd_unlock(const char *mtd)
{ {
@ -84,7 +77,6 @@ mtd_unlock(const char *mtd)
mtdLockInfo.start = 0; mtdLockInfo.start = 0;
mtdLockInfo.length = mtdInfo.size; mtdLockInfo.length = mtdInfo.size;
if(ioctl(fd, MEMUNLOCK, &mtdLockInfo)) { if(ioctl(fd, MEMUNLOCK, &mtdLockInfo)) {
fprintf(stderr, "Could not unlock MTD device: %s\n", mtd);
close(fd); close(fd);
return 0; return 0;
} }
@ -156,38 +148,55 @@ mtd_erase(const char *mtd)
int int
mtd_write(const char *trxfile, const char *mtd) mtd_write(const char *trxfile, const char *mtd)
{ {
int fd; int fd,trxfd,i;
int trxfd; struct trx_header trx;
int i; size_t count,result,size,written;
size_t result,size,written;
struct mtd_info_user mtdInfo; struct mtd_info_user mtdInfo;
struct erase_info_user mtdEraseInfo; struct erase_info_user mtdEraseInfo;
struct stat trxstat; struct stat trxstat;
unsigned char src[BUFSIZE],dest[BUFSIZE]; unsigned char src[BUFSIZE],dest[BUFSIZE];
fd = mtd_open(mtd, O_RDWR); trxfd = open(trxfile,O_RDONLY);
if(fd < 0) { if(trxfd < 0) {
fprintf(stderr, "Could not open mtd device: %s\n", mtd); fprintf(stderr, "Could not open trx image: %s\n", trxfile);
exit(1); exit(1);
} }
if(ioctl(fd, MEMGETINFO, &mtdInfo)) { if (fstat(trxfd,&trxstat) < 0) {
fprintf(stderr, "Could not get MTD device info from %s\n", mtd); fprintf(stderr, "Could not get trx image file status: %s\n", trxfile);
close(fd); close(trxfd);
exit(1); exit(1);
} }
trxfd = open(trxfile,O_RDONLY); count = read(trxfd, &trx, sizeof(struct trx_header));
if(trxfd < 0) { if (count < sizeof(struct trx_header)) {
fprintf(stderr, "Could not open trx image: %s\n", trxfile); fprintf(stderr, "Could not trx header, file too small (%ld bytes)\n", count);
close(trxfd);
exit(1); exit(1);
} }
if (fstat (trxfd,&trxstat) < 0) { if (trx.magic != TRX_MAGIC || trx.len < sizeof(struct trx_header)) {
fprintf(stderr, "Could not get trx image file status: %s\n", trxfile); fprintf(stderr, "Bad trx header\n");
fprintf(stderr, "If this is a firmware in bin format, like some of the\n"
"original firmware files are, use following command to convert to trx:\n"
"dd if=firmware.bin of=firmware.trx bs=32 skip=1\n");
close(trxfd); close(trxfd);
exit(1); exit(1);
} }
lseek(trxfd, 0, SEEK_SET);
fd = mtd_open(mtd, O_RDWR);
if(fd < 0) {
fprintf(stderr, "Could not open mtd device: %s\n", mtd);
exit(1);
}
if(ioctl(fd, MEMGETINFO, &mtdInfo)) {
fprintf(stderr, "Could not get MTD device info from %s\n", mtd);
close(fd);
exit(1);
}
if(mtdInfo.size < trxstat.st_size) { if(mtdInfo.size < trxstat.st_size) {
fprintf(stderr, "Image too big for partition: %s\n", mtd); fprintf(stderr, "Image too big for partition: %s\n", mtd);

Loading…
Cancel
Save