[PATCH 1/2] nandwrite: Add --output-skip
Mike Crowe
mac at mcrowe.com
Tue Dec 6 10:04:16 PST 2016
Skip the specified number of bytes (which must be page aligned) before
writing. This differs from --start when there are bad blocks: --start
always seeks to the specified offset in the flash, --output-skip works its
way through the flash a page at a time from the specified start, skipping
bad blocks provided --noskipbad was not also passed.
This can be useful when writing part way through a partition that will be
read using a simple bad-block-skipping algorithm.
---
nand-utils/nandwrite.c | 20 ++++++++++++++++++--
1 file changed, 18 insertions(+), 2 deletions(-)
diff --git a/nand-utils/nandwrite.c b/nand-utils/nandwrite.c
index b376869..b4a6d8c 100644
--- a/nand-utils/nandwrite.c
+++ b/nand-utils/nandwrite.c
@@ -60,6 +60,7 @@ static void display_help(int status)
" -b, --blockalign=1|2|4 Set multiple of eraseblocks to align to\n"
" --input-skip=length Skip |length| bytes of the input file\n"
" --input-size=length Only read |length| bytes of the input file\n"
+" --output-skip=length Skip |length| bytes before writing\n"
" -q, --quiet Don't display progress messages\n"
" -h, --help Display this help and exit\n"
" -V, --version Output version information and exit\n"
@@ -87,6 +88,7 @@ static const char *mtd_device, *img;
static long long mtdoffset = 0;
static long long inputskip = 0;
static long long inputsize = 0;
+static long long outputskip = 0;
static bool quiet = false;
static bool writeoob = false;
static bool onlyoob = false;
@@ -110,6 +112,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},
+ {"output-skip", required_argument, 0, 0},
{"help", no_argument, 0, 'h'},
{"blockalign", required_argument, 0, 'b'},
{"markbad", no_argument, 0, 'm'},
@@ -139,6 +142,9 @@ static void process_options(int argc, char * const argv[])
case 2: /* --input-size */
inputsize = simple_strtoll(optarg, &error);
break;
+ case 3: /* --output-skip */
+ outputskip = simple_strtoll(optarg, &error);
+ break;
}
break;
case 'V':
@@ -286,6 +292,11 @@ int main(int argc, char * const argv[])
"The pagesize of this NAND Flash is 0x%x.\n",
mtd.min_io_size);
+ if (outputskip % ebsize_aligned)
+ errmsg_die("The output skip length is not page-aligned !\n"
+ "The pagesize of this NAND flash is 0x%x.\n",
+ mtd.min_io_size);
+
/* Select OOB write mode */
if (noecc)
write_mode = MTD_OPS_RAW;
@@ -350,7 +361,7 @@ int main(int argc, char * const argv[])
}
/* Check, if length fits into device */
- if ((imglen / pagelen) * mtd.min_io_size > mtd.size - mtdoffset) {
+ if ((imglen / pagelen) * mtd.min_io_size > mtd.size - mtdoffset - outputskip) {
fprintf(stderr, "Image %lld bytes, NAND page %d bytes, OOB area %d"
" bytes, device size %lld bytes\n",
imglen, pagelen, mtd.oob_size, mtd.size);
@@ -400,7 +411,7 @@ int main(int argc, char * const argv[])
}
baderaseblock = false;
- if (!quiet)
+ if (!quiet && (outputskip == 0))
fprintf(stdout, "Writing data to block %lld at offset 0x%llx\n",
blockstart / ebsize_aligned, blockstart);
@@ -432,7 +443,12 @@ int main(int argc, char * const argv[])
offs += ebsize_aligned / blockalign;
} while (offs < blockstart + ebsize_aligned);
+ }
+ if (outputskip > 0) {
+ mtdoffset += mtd.min_io_size;
+ outputskip -= mtd.min_io_size;
+ continue;
}
/* Read more data from the input if there isn't enough in the buffer */
--
2.1.4
More information about the linux-mtd
mailing list