patch for branch mtd-2.6.22.1 on git://git.denx.de/u-boot-nand-flash.git
nand read(.jffs2|.e|.i) skips bad blocks during read.
write(.jffs2|.e|.i) skips bad blocks during write
nand read will read 0xff for bad block.
Update documentation.
---
common/cmd_nand.c| 73 ++---
doc/README.nand | 16 +-
drivers/mtd/nand/nand_util.c | 814 --
include/nand.h |9 +-
4 files changed, 278 insertions(+), 634 deletions(-)
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index eff9173..64e825e 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -73,9 +73,10 @@ static int nand_dump(nand_info_t *nand, ulong off, int
only_oob)
while (i--) {
if (!only_oob) {
printf( \t%02x %02x %02x %02x %02x %02x %02x %02x
- %02x %02x %02x %02x %02x %02x %02x
%02x\n,
- p[0], p[1], p[2], p[3], p[4], p[5],
p[6], p[7],
- p[8], p[9], p[10], p[11], p[12], p[13],
p[14], p[15]);
+ %02x %02x %02x %02x %02x %02x %02x %02x\n,
+ p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7],
+ p[8], p[9], p[10], p[11], p[12], p[13], p[14],
+ p[15]);
}
p += 16;
}
@@ -319,7 +320,6 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char
*argv[])
}
- /* read write */
if (strncmp(cmd, read, 4) == 0 || strncmp(cmd, write, 5) == 0) {
int read;
@@ -334,33 +334,13 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char
*argv[])
return 1;
s = strchr(cmd, '.');
- if (s != NULL
- (!strcmp(s, .jffs2) || !strcmp(s, .e) || !strcmp(s,
.i))) {
- if (read) {
- /* read */
- nand_read_options_t opts;
- memset(opts, 0, sizeof(opts));
- opts.buffer = (u_char*) addr;
- opts.length = size;
- opts.offset = off;
- opts.quiet = quiet;
-/*
- * ! BROKEN !
- *
- * TODO: Function must be implemented
- *
- * ret = nand_read_opts(nand, opts);
- */
- } else {
- /* write */
- mtd_oob_ops_t opts;
- memset(opts, 0, sizeof(opts));
- opts.datbuf = (u_char*) addr;
- opts.len= size;
- opts.ooblen = 64;
- opts.mode = MTD_OOB_AUTO;
- ret = nand_write_opts(nand, off, opts);
- }
+ if (s != NULL (!strcmp(s, .jffs2) ||
+ !strcmp(s, .e) || !strcmp(s, .i))) {
+ if (read)
+ ret = nand_read_skip_bad(nand, off, size,
(u_char *)addr);
+ else
+ ret = nand_write_skip_bad(nand, off, size,
(u_char *)addr);
+
} else if (s != NULL !strcmp(s, .oob)) {
struct mtd_oob_ops ops;
@@ -374,7 +354,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char
*argv[])
ret = nand-write_oob(nand, off, ops);
} else {
if (read)
- ret = nand_read(nand, off, size, (u_char
*)addr);
+ ret = nand_read_ff_upon_bad(nand, off, size,
(u_char *)addr);
else
ret = nand_write(nand, off, size, (u_char
*)addr);
}
@@ -399,6 +379,7 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char
*argv[])
}
return 1;
}
+
if (strcmp(cmd, biterr) == 0) {
/* todo */
return 1;
@@ -489,23 +470,31 @@ usage:
return 1;
}
-U_BOOT_CMD(nand, 5, 1, do_nand,
- nand- NAND sub-system\n,
- info - show available NAND devices\n
- nand device [dev] - show or set current device\n
- nand read[.jffs2] - addr off|partition size\n
- nand write[.jffs2]- addr off|partition size - read/write `size'
bytes starting\n
- at offset `off' to/from memory address `addr'\n
- nand erase [clean] [off size] - erase `size' bytes from\n
- offset `off' (entire device if not specified)\n
+U_BOOT_CMD(
+nand, 5, 1, do_nand,
+ nand - NAND sub-system\n,
+ info - show available NAND devices\n
+