[PATCH 1/2] Fix the bug of writing a yaffs2 image to NAND
Stanley.Miao
stanley.miao at windriver.com
Tue May 18 08:23:09 EDT 2010
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 at windriver.com>
---
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 */
--
1.5.4.3
More information about the linux-mtd
mailing list