diff options
Diffstat (limited to 'nandwrite.c')
-rw-r--r-- | nandwrite.c | 36 |
1 files changed, 9 insertions, 27 deletions
diff --git a/nandwrite.c b/nandwrite.c index 3520c62..5cdea1e 100644 --- a/nandwrite.c +++ b/nandwrite.c @@ -41,9 +41,7 @@ #include <asm/types.h> #include "mtd/mtd-user.h" - -#define MAX_PAGE_SIZE 4096 -#define MAX_OOB_SIZE 128 +#include "common.h" // oob layouts to pass into the kernel as default static struct nand_oobinfo none_oobinfo = { @@ -276,12 +274,10 @@ int main(int argc, char * const argv[]) unsigned char *writebuf = NULL; // points to the OOB for the current page in filebuf unsigned char *oobreadbuf = NULL; - unsigned char oobbuf[MAX_OOB_SIZE]; + unsigned char *oobbuf = NULL; process_options(argc, argv); - erase_buffer(oobbuf, sizeof(oobbuf)); - if (pad && writeoob) { fprintf(stderr, "Can't pad when oob data is present.\n"); exit (EXIT_FAILURE); @@ -304,17 +300,6 @@ int main(int argc, char * const argv[]) * (virtual) block size */ meminfo.erasesize *= blockalign; - /* Make sure device page sizes are valid */ - if (!(meminfo.oobsize == 16 && meminfo.writesize == 512) && - !(meminfo.oobsize == 8 && meminfo.writesize == 256) && - !(meminfo.oobsize == 64 && meminfo.writesize == 2048) && - !(meminfo.oobsize == 64 && meminfo.writesize == 4096) && - !(meminfo.oobsize == 128 && meminfo.writesize == 4096)) { - fprintf(stderr, "Unknown flash (not normal NAND)\n"); - close(fd); - exit (EXIT_FAILURE); - } - if (mtdoffset & (meminfo.writesize - 1)) { fprintf(stderr, "The start address is not page-aligned !\n" "The pagesize of this NAND Flash is 0x%x.\n", @@ -452,14 +437,12 @@ int main(int argc, char * const argv[]) // Allocate a buffer big enough to contain all the data (OOB included) for one eraseblock filebuf_max = pagelen * meminfo.erasesize / meminfo.writesize; - filebuf = (unsigned char*)malloc(filebuf_max); - if (!filebuf) { - fprintf(stderr, "Failed to allocate memory for file buffer (%d bytes)\n", - pagelen * meminfo.erasesize / meminfo.writesize); - goto closeall; - } + filebuf = xmalloc(filebuf_max); erase_buffer(filebuf, filebuf_max); + oobbuf = xmalloc(meminfo.oobsize); + erase_buffer(oobbuf, meminfo.oobsize); + /* * Get data from input and write to the device while there is * still input to read and we are still within the device @@ -689,13 +672,12 @@ int main(int argc, char * const argv[]) failed = false; closeall: - if (filebuf) { - free(filebuf); - } - close(ifd); restoreoob: + free(filebuf); + free(oobbuf); + if (oobinfochanged == 1) { if (ioctl (fd, MEMSETOOBSEL, &old_oobinfo) != 0) { perror ("MEMSETOOBSEL"); |