diff options
author | Mike Frysinger <vapier@gentoo.org> | 2010-09-11 23:50:27 -0400 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2010-09-12 11:10:55 +0300 |
commit | 2c681d34611bf5b4a92efd51642ebd4723711679 (patch) | |
tree | a7740c00fcd98d21aa724dead280dfc7f32fa80e | |
parent | e5a8bd7061921a9a787ffbb2c47a5af8f439d342 (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.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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)"); |