diff options
Diffstat (limited to 'nanddump.c')
-rw-r--r-- | nanddump.c | 55 |
1 files changed, 21 insertions, 34 deletions
@@ -32,6 +32,7 @@ #include <asm/types.h> #include <mtd/mtd-user.h> +#include "common.h" static struct nand_oobinfo none_oobinfo = { .useecc = MTD_NANDECC_OFF, @@ -264,13 +265,6 @@ nil: linebuf[lx++] = '\0'; } -/* - * Buffers for reading data from flash - */ -#define NAND_MAX_PAGESIZE 4096 -#define NAND_MAX_OOBSIZE 256 -static unsigned char readbuf[NAND_MAX_PAGESIZE]; -static unsigned char oobbuf[NAND_MAX_OOBSIZE]; /* * Main program @@ -279,14 +273,15 @@ int main(int argc, char * const argv[]) { unsigned long ofs, end_addr = 0; unsigned long long blockstart = 1; - int ret, i, fd, ofd, bs, badblock = 0; - struct mtd_oob_buf oob = {0, 16, oobbuf}; + int ret, i, fd, ofd = 0, bs, badblock = 0; + struct mtd_oob_buf oob; mtd_info_t meminfo; char pretty_buf[PRETTY_BUF_LEN]; int oobinfochanged = 0, firstblock = 1; struct nand_oobinfo old_oobinfo; struct mtd_ecc_stats stat1, stat2; bool eccstats = false; + unsigned char *readbuf = NULL, *oobbuf = NULL; process_options(argc, argv); @@ -303,21 +298,14 @@ int main(int argc, char * const argv[]) exit (EXIT_FAILURE); } - /* Make sure device page sizes are valid */ - if (!(meminfo.oobsize == 224 && meminfo.writesize == 4096) && - !(meminfo.oobsize == 218 && meminfo.writesize == 4096) && - !(meminfo.oobsize == 128 && meminfo.writesize == 4096) && - !(meminfo.oobsize == 64 && meminfo.writesize == 4096) && - !(meminfo.oobsize == 64 && meminfo.writesize == 2048) && - !(meminfo.oobsize == 32 && meminfo.writesize == 1024) && - !(meminfo.oobsize == 16 && meminfo.writesize == 512) && - !(meminfo.oobsize == 8 && meminfo.writesize == 256)) { - fprintf(stderr, "Unknown flash (not normal NAND)\n"); - close(fd); - exit(EXIT_FAILURE); - } - /* Read the real oob length */ + /* Allocate buffers */ + oobbuf = xmalloc(sizeof(oobbuf) * meminfo.oobsize); + readbuf = xmalloc(sizeof(readbuf) * meminfo.writesize); + + /* Fill in oob info */ + oob.start = 0; oob.length = meminfo.oobsize; + oob.ptr = oobbuf; if (noecc) { ret = ioctl(fd, MTDFILEMODE, (void *) MTD_MODE_RAW); @@ -328,20 +316,17 @@ int main(int argc, char * const argv[]) case ENOTTY: if (ioctl (fd, MEMGETOOBSEL, &old_oobinfo) != 0) { perror ("MEMGETOOBSEL"); - close (fd); - exit (EXIT_FAILURE); + goto closeall; } if (ioctl (fd, MEMSETOOBSEL, &none_oobinfo) != 0) { perror ("MEMSETOOBSEL"); - close (fd); - exit (EXIT_FAILURE); + goto closeall; } oobinfochanged = 1; break; default: perror ("MTDFILEMODE"); - close (fd); - exit (EXIT_FAILURE); + goto closeall; } } } else { @@ -365,15 +350,13 @@ int main(int argc, char * const argv[]) ofd = STDOUT_FILENO; } else if ((ofd = open(dumpfile, O_WRONLY | O_TRUNC | O_CREAT, 0644))== -1) { perror (dumpfile); - close(fd); - exit(EXIT_FAILURE); + goto closeall; } if (!pretty_print && !forcebinary && isatty(ofd)) { fprintf(stderr, "Not printing binary garbage to tty. Use '-a'\n" "or '--forcebinary' to override.\n"); - close(fd); - exit(EXIT_FAILURE); + goto closeall; } /* Initialize start/end addresses and block size */ @@ -484,9 +467,11 @@ int main(int argc, char * const argv[]) return EXIT_FAILURE; } } - /* Close the output file and MTD device */ + /* Close the output file and MTD device, free memory */ close(fd); close(ofd); + free(oobbuf); + free(readbuf); /* Exit happy */ return EXIT_SUCCESS; @@ -500,5 +485,7 @@ closeall: } close(fd); close(ofd); + free(oobbuf); + free(readbuf); exit(EXIT_FAILURE); } |