summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2010-09-11 23:50:27 -0400
committerArtem Bityutskiy <Artem.Bityutskiy@nokia.com>2010-09-12 11:10:55 +0300
commit2c681d34611bf5b4a92efd51642ebd4723711679 (patch)
treea7740c00fcd98d21aa724dead280dfc7f32fa80e
parente5a8bd7061921a9a787ffbb2c47a5af8f439d342 (diff)
nanddump: add --nobad to read bad blocks
Sometimes dumping bad blocks is useful, like when the data isn't actually bad but the OOB layout isn't what the kernel is expecting or is otherwise screwed up. The --nobad option allows just that. Signed-off-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r--nanddump.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/nanddump.c b/nanddump.c
index 70b78f0..8b3d4a1 100644
--- a/nanddump.c
+++ b/nanddump.c
@@ -50,6 +50,7 @@ static void display_help (void)
"-f file --file=file Dump to file\n"
"-l length --length=length Length\n"
"-n --noecc Read without error correction\n"
+"-N --nobad Read without bad block skipping\n"
"-o --omitoob Omit oob data\n"
"-b --omitbad Omit bad blocks from the dump\n"
"-p --prettyprint Print nice (hexdump)\n"
@@ -76,6 +77,7 @@ static void display_version (void)
static bool pretty_print = false; // print nice
static bool noecc = false; // don't error correct
+static bool nobad = false; // don't skip bad blocks
static bool omitoob = false; // omit oob data
static unsigned long start_addr; // start address
static unsigned long length; // dump length
@@ -92,7 +94,7 @@ static void process_options (int argc, char * const argv[])
for (;;) {
int option_index = 0;
- static const char *short_options = "bs:f:l:opqnca";
+ static const char *short_options = "bs:f:l:opqnNca";
static const struct option long_options[] = {
{"help", no_argument, 0, 0},
{"version", no_argument, 0, 0},
@@ -105,6 +107,7 @@ static void process_options (int argc, char * const argv[])
{"startaddress", required_argument, 0, 's'},
{"length", required_argument, 0, 'l'},
{"noecc", no_argument, 0, 'n'},
+ {"nobad", no_argument, 0, 'N'},
{"quiet", no_argument, 0, 'q'},
{0, 0, 0, 0},
};
@@ -158,6 +161,9 @@ static void process_options (int argc, char * const argv[])
case 'n':
noecc = true;
break;
+ case 'N':
+ nobad = true;
+ break;
case '?':
error++;
break;
@@ -390,7 +396,9 @@ int main(int argc, char * const argv[])
for (ofs = start_addr; ofs < end_addr ; ofs+=bs) {
// new eraseblock , check for bad block
- if (blockstart != (ofs & (~meminfo.erasesize + 1))) {
+ if (nobad) {
+ badblock = 0;
+ } else if (blockstart != (ofs & (~meminfo.erasesize + 1))) {
blockstart = ofs & (~meminfo.erasesize + 1);
if ((badblock = ioctl(fd, MEMGETBADBLOCK, &blockstart)) < 0) {
perror("ioctl(MEMGETBADBLOCK)");