|
@@ -37,10 +37,16 @@ int find_dev_and_part(const char *id, struct mtd_device **dev,
|
|
|
u8 *part_num, struct part_info **part);
|
|
|
#endif
|
|
|
|
|
|
-static int nand_dump(nand_info_t *nand, ulong off, int only_oob)
|
|
|
+static int nand_dump(nand_info_t *nand, ulong off, int only_oob, int repeat)
|
|
|
{
|
|
|
int i;
|
|
|
u_char *datbuf, *oobbuf, *p;
|
|
|
+ static loff_t last;
|
|
|
+
|
|
|
+ if (repeat)
|
|
|
+ off = last + nand->writesize;
|
|
|
+
|
|
|
+ last = off;
|
|
|
|
|
|
datbuf = malloc(nand->writesize + nand->oobsize);
|
|
|
oobbuf = malloc(nand->oobsize);
|
|
@@ -381,6 +387,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
|
|
#endif
|
|
|
const char *quiet_str = getenv("quiet");
|
|
|
int dev = nand_curr_device;
|
|
|
+ int repeat = flag & CMD_FLAG_REPEAT;
|
|
|
|
|
|
/* at least two arguments please */
|
|
|
if (argc < 2)
|
|
@@ -391,6 +398,10 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
|
|
|
|
|
cmd = argv[1];
|
|
|
|
|
|
+ /* Only "dump" is repeatable. */
|
|
|
+ if (repeat && strcmp(cmd, "dump"))
|
|
|
+ return 0;
|
|
|
+
|
|
|
if (strcmp(cmd, "info") == 0) {
|
|
|
|
|
|
putc('\n');
|
|
@@ -532,16 +543,10 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char * const argv[])
|
|
|
if (argc < 3)
|
|
|
goto usage;
|
|
|
|
|
|
- s = strchr(cmd, '.');
|
|
|
off = (int)simple_strtoul(argv[2], NULL, 16);
|
|
|
-
|
|
|
- if (s != NULL && strcmp(s, ".oob") == 0)
|
|
|
- ret = nand_dump(nand, off, 1);
|
|
|
- else
|
|
|
- ret = nand_dump(nand, off, 0);
|
|
|
+ ret = nand_dump(nand, off, !strcmp(&cmd[4], ".oob"), repeat);
|
|
|
|
|
|
return ret == 0 ? 1 : 0;
|
|
|
-
|
|
|
}
|
|
|
|
|
|
if (strncmp(cmd, "read", 4) == 0 || strncmp(cmd, "write", 5) == 0) {
|