summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStanley.Miao <stanley.miao@windriver.com>2010-05-18 20:23:09 +0800
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2010-05-22 08:36:48 +0300
commitf0d12d2079b8b2ea667073a6bcd603765466dc58 (patch)
tree0e375f4a4dba2542ebba8719b310ba4a8f74af2f
parent9afc1cd5c0b1e56cdd8192aadb68104aae30ae89 (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.c20
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 */