summaryrefslogtreecommitdiff
path: root/nanddump.c
diff options
context:
space:
mode:
Diffstat (limited to 'nanddump.c')
-rw-r--r--nanddump.c55
1 files changed, 21 insertions, 34 deletions
diff --git a/nanddump.c b/nanddump.c
index 396c8ca..fbc8557 100644
--- a/nanddump.c
+++ b/nanddump.c
@@ -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);
}