diff options
-rw-r--r-- | nand-utils/nanddump.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/nand-utils/nanddump.c b/nand-utils/nanddump.c index a8ad334..bebb48e 100644 --- a/nand-utils/nanddump.c +++ b/nand-utils/nanddump.c @@ -52,6 +52,8 @@ static void display_help(int status) "-p --prettyprint Print nice (hexdump)\n" "-q --quiet Don't display progress and status messages\n" "-s addr --startaddress=addr Start address\n" +" --skip-bad-blocks-to-start\n" +" Skip bad blocks when seeking to the start address\n" "\n" "--bb=METHOD, where METHOD can be `padbad', `dumpbad', or `skipbad':\n" " padbad: dump flash data, substituting 0xFF for any bad blocks\n" @@ -86,6 +88,7 @@ static const char *dumpfile; // dump file name static bool quiet = false; // suppress diagnostic output static bool canonical = false; // print nice + ascii static bool forcebinary = false; // force printing binary to tty +static bool skip_bad_blocks_to_start = false; static enum { padbad, // dump flash data, substituting 0xFF for any bad blocks @@ -105,6 +108,7 @@ static void process_options(int argc, char * const argv[]) {"version", no_argument, 0, 'V'}, {"bb", required_argument, 0, 0}, {"omitoob", no_argument, 0, 0}, + {"skip-bad-blocks-to-start", no_argument, 0, 0 }, {"help", no_argument, 0, 'h'}, {"forcebinary", no_argument, 0, 'a'}, {"canonicalprint", no_argument, 0, 'c'}, @@ -146,6 +150,9 @@ static void process_options(int argc, char * const argv[]) errmsg_die("--oob and --oomitoob are mutually exclusive"); } break; + case 3: /* --skip-bad-blocks-to-start */ + skip_bad_blocks_to_start = true; + break; } break; case 'V': @@ -397,6 +404,22 @@ int main(int argc, char * const argv[]) mtd.min_io_size); goto closeall; } + if (skip_bad_blocks_to_start) { + long long bbs_offset = 0; + while (bbs_offset < start_addr) { + err = mtd_is_bad(&mtd, fd, bbs_offset / mtd.eb_size); + if (err < 0) { + sys_errmsg("%s: MTD get bad block failed", mtddev); + goto closeall; + } else if (err == 1) { + if (!quiet) + fprintf(stderr, "Bad block at %llx\n", bbs_offset); + start_addr += mtd.eb_size; + } + bbs_offset += mtd.eb_size; + } + } + if (length) end_addr = start_addr + length; if (!length || end_addr > mtd.size) |