diff options
author | Brian Norris <computersforpeace@gmail.com> | 2010-10-15 19:12:25 -0700 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-10-17 11:02:32 +0300 |
commit | 00fc2d4d47e87536c89509f234777fc7d93cab9e (patch) | |
tree | 1c9bcf172dea273e3be562d5d9f2e11ee29ae5f3 | |
parent | 96a5eeaf754c34bf684b6957ab8479d8557b3e95 (diff) |
mtd-utils: nandwrite: Large page+oob support
Dynamic allocation of the oob buffer provides the necessary
support for removing the oob size check. Now, new unknown OOB
sizes can be handled correctly (for example, 8KB page + 448B
OOB).
Included common.h for the use of xmalloc.
Memory freeing should occur on "restoreoob" as well as on
"closeall."
[Conflicts resolved by Artem]
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-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"); |