diff options
Diffstat (limited to 'nand-utils')
| -rw-r--r-- | nand-utils/nandwrite.c | 26 | 
1 files changed, 26 insertions, 0 deletions
diff --git a/nand-utils/nandwrite.c b/nand-utils/nandwrite.c index c7a53d1..f29fc67 100644 --- a/nand-utils/nandwrite.c +++ b/nand-utils/nandwrite.c @@ -56,6 +56,8 @@ static void display_help(int status)  "  -o, --oob               Input contains oob data\n"  "  -O, --onlyoob           Input contains oob data and only write the oob part\n"  "  -s addr, --start=addr   Set output start address (default is 0)\n" +"  --skip-bad-blocks-to-start" +"                          Skip bad blocks when seeking to the start address\n"  "  -p, --pad               Pad writes to page size\n"  "  -b, --blockalign=1|2|4  Set multiple of eraseblocks to align to\n"  "      --input-skip=length Skip |length| bytes of the input file\n" @@ -96,6 +98,7 @@ static bool		autoplace = false;  static bool		skipallffs = false;  static bool		noskipbad = false;  static bool		pad = false; +static bool		skip_bad_blocks_to_start = false;  static int		blockalign = 1; /* default to using actual block size */  static void process_options(int argc, char * const argv[]) @@ -110,6 +113,7 @@ static void process_options(int argc, char * const argv[])  			{"version", no_argument, 0, 'V'},  			{"input-skip", required_argument, 0, 0},  			{"input-size", required_argument, 0, 0}, +			{"skip-bad-blocks-to-start", no_argument, 0, 0},  			{"help", no_argument, 0, 'h'},  			{"blockalign", required_argument, 0, 'b'},  			{"markbad", no_argument, 0, 'm'}, @@ -139,6 +143,9 @@ static void process_options(int argc, char * const argv[])  			case 2: /* --input-size */  				inputsize = simple_strtoll(optarg, &error);  				break; +			case 3: /* --skip-bad-blocks-to-start */ +				skip_bad_blocks_to_start = true; +				break;  			}  			break;  		case 'V': @@ -365,6 +372,25 @@ int main(int argc, char * const argv[])  		goto closeall;  	} +	/* Skip bad blocks on the way to the start address if necessary */ +	if (skip_bad_blocks_to_start) { +		long long bbs_offset = 0; +		while (bbs_offset < mtdoffset) { +			ret = is_virt_block_bad(&mtd, fd, bbs_offset); +			if (ret < 0) { +				sys_errmsg("%s: MTD get bad block failed", mtd_device); +				goto closeall; +			} else if (ret == 1) { +				if (!quiet) +					fprintf(stderr, "Bad block at %llx, %u block(s) " +						"from %llx will be skipped\n", +						bbs_offset, blockalign, bbs_offset); +				mtdoffset += ebsize_aligned; +			} +			bbs_offset += ebsize_aligned; +		} +	} +  	/* Check, if length fits into device */  	if ((imglen / pagelen) * mtd.min_io_size > mtd.size - mtdoffset) {  		fprintf(stderr, "Image %lld bytes, NAND page %d bytes, OOB area %d"  | 
