diff options
author | Stanley.Miao <stanley.miao@windriver.com> | 2010-05-18 20:23:09 +0800 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-05-22 08:36:48 +0300 |
commit | f0d12d2079b8b2ea667073a6bcd603765466dc58 (patch) | |
tree | 0e375f4a4dba2542ebba8719b310ba4a8f74af2f | |
parent | 9afc1cd5c0b1e56cdd8192aadb68104aae30ae89 (diff) |
nandwrite: fix the bug of writing a yaffs2 image to NAND
The tool mkyaffs2image doesn't know the oob layout of a NAND flash, so it
puts the yaffs2 tags at the offset 0 of oob area, as a result, the image
generated by mkyaffs2image is different with the image dumped by nanddump.
Now adding a parameter "-r" for nandwrite to differentiate these images.
Write a image generated by mkyaffs2image:
$> nandwrite -a -o /dev/mtd3 yaffs2.bin
Write a image dumped by nanddump:
$> nandwrite -a -r /dev/mtd3 image.bin
Signed-off-by: Stanley.Miao <stanley.miao@windriver.com>
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r-- | nandwrite.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/nandwrite.c b/nandwrite.c index b77edd6..1e30ad1 100644 --- a/nandwrite.c +++ b/nandwrite.c @@ -80,6 +80,7 @@ static void display_help (void) " -m, --markbad Mark blocks bad if write fails\n" " -n, --noecc Write without ecc\n" " -o, --oob Image contains oob data\n" +" -r, --raw Image contains the raw oob data dumped by nanddump\n" " -s addr, --start=addr Set start address (default is 0)\n" " -p, --pad Pad to page size\n" " -b, --blockalign=1|2|4 Set multiple of eraseblocks to align to\n" @@ -110,6 +111,7 @@ static const char *mtd_device, *img; static int mtdoffset = 0; static bool quiet = false; static bool writeoob = false; +static bool rawoob = false; static bool autoplace = false; static bool markbad = false; static bool forcejffs2 = false; @@ -125,7 +127,7 @@ static void process_options (int argc, char * const argv[]) for (;;) { int option_index = 0; - static const char *short_options = "ab:fjmnopqs:y"; + static const char *short_options = "ab:fjmnopqrs:y"; static const struct option long_options[] = { {"help", no_argument, 0, 0}, {"version", no_argument, 0, 0}, @@ -138,6 +140,7 @@ static void process_options (int argc, char * const argv[]) {"oob", no_argument, 0, 'o'}, {"pad", no_argument, 0, 'p'}, {"quiet", no_argument, 0, 'q'}, + {"raw", no_argument, 0, 'r'}, {"start", required_argument, 0, 's'}, {"yaffs", no_argument, 0, 'y'}, {0, 0, 0, 0}, @@ -187,6 +190,10 @@ static void process_options (int argc, char * const argv[]) case 'p': pad = true; break; + case 'r': + rawoob = true; + writeoob = true; + break; case 's': mtdoffset = strtol (optarg, NULL, 0); break; @@ -583,6 +590,7 @@ int main(int argc, char * const argv[]) oob.ptr = oobreadbuf; } else { int i, start, len; + int tags_pos = 0; /* * We use autoplacement and have the oobinfo with the autoplacement * information from the kernel available @@ -595,9 +603,13 @@ int main(int argc, char * const argv[]) /* Set the reserved bytes to 0xff */ start = old_oobinfo.oobfree[i][0]; len = old_oobinfo.oobfree[i][1]; - memcpy(oobbuf + start, - oobreadbuf + start, - len); + if (rawoob) + memcpy(oobbuf + start, + oobreadbuf + start, len); + else + memcpy(oobbuf + start, + oobreadbuf + tags_pos, len); + tags_pos += len; } } else { /* Set at least the ecc byte positions to 0xff */ |