NAND: Always skip blocks on read/write/boot.
Use of the non-skipping versions was almost always (if not always) an error, and no valid use case has been identified. Signed-off-by: Scott Wood <scottwood@freescale.com>
This commit is contained in:
parent
e1c3dbada3
commit
984e03cdf1
|
@ -332,8 +332,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
s = strchr(cmd, '.');
|
s = strchr(cmd, '.');
|
||||||
if (s != NULL &&
|
if (!s || !strcmp(s, ".jffs2") ||
|
||||||
(!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i"))) {
|
!strcmp(s, ".e") || !strcmp(s, ".i")) {
|
||||||
if (read) {
|
if (read) {
|
||||||
/* read */
|
/* read */
|
||||||
nand_read_options_t opts;
|
nand_read_options_t opts;
|
||||||
|
@ -372,10 +372,8 @@ int do_nand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
|
||||||
else
|
else
|
||||||
ret = nand->write_oob(nand, off, &ops);
|
ret = nand->write_oob(nand, off, &ops);
|
||||||
} else {
|
} else {
|
||||||
if (read)
|
printf("Unknown nand command suffix '%s'.\n", s);
|
||||||
ret = nand_read(nand, off, &size, (u_char *)addr);
|
return 1;
|
||||||
else
|
|
||||||
ret = nand_write(nand, off, &size, (u_char *)addr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printf(" %d bytes %s: %s\n", size,
|
printf(" %d bytes %s: %s\n", size,
|
||||||
|
@ -492,10 +490,10 @@ U_BOOT_CMD(nand, 5, 1, do_nand,
|
||||||
"nand - NAND sub-system\n",
|
"nand - NAND sub-system\n",
|
||||||
"info - show available NAND devices\n"
|
"info - show available NAND devices\n"
|
||||||
"nand device [dev] - show or set current device\n"
|
"nand device [dev] - show or set current device\n"
|
||||||
"nand read[.jffs2] - addr off|partition size\n"
|
"nand read - addr off|partition size\n"
|
||||||
"nand write[.jffs2] - addr off|partition size\n"
|
"nand write - addr off|partition size\n"
|
||||||
" read/write 'size' bytes starting at offset 'off'\n"
|
" read/write 'size' bytes starting at offset 'off'\n"
|
||||||
" to/from memory address 'addr'\n"
|
" to/from memory address 'addr', skipping bad blocks.\n"
|
||||||
"nand erase [clean] [off size] - erase 'size' bytes from\n"
|
"nand erase [clean] [off size] - erase 'size' bytes from\n"
|
||||||
" offset 'off' (entire device if not specified)\n"
|
" offset 'off' (entire device if not specified)\n"
|
||||||
"nand bad - show bad blocks\n"
|
"nand bad - show bad blocks\n"
|
||||||
|
@ -514,15 +512,17 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
|
||||||
char *ep, *s;
|
char *ep, *s;
|
||||||
size_t cnt;
|
size_t cnt;
|
||||||
image_header_t *hdr;
|
image_header_t *hdr;
|
||||||
int jffs2 = 0;
|
|
||||||
#if defined(CONFIG_FIT)
|
#if defined(CONFIG_FIT)
|
||||||
const void *fit_hdr = NULL;
|
const void *fit_hdr = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
s = strchr(cmd, '.');
|
s = strchr(cmd, '.');
|
||||||
if (s != NULL &&
|
if (s != NULL &&
|
||||||
(!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")))
|
(strcmp(s, ".jffs2") && !strcmp(s, ".e") && !strcmp(s, ".i"))) {
|
||||||
jffs2 = 1;
|
printf("Unknown nand load suffix '%s'\n", s);
|
||||||
|
show_boot_progress(-53);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
printf("\nLoading from %s, offset 0x%lx\n", nand->name, offset);
|
printf("\nLoading from %s, offset 0x%lx\n", nand->name, offset);
|
||||||
|
|
||||||
|
@ -559,6 +559,7 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
|
||||||
}
|
}
|
||||||
show_boot_progress (57);
|
show_boot_progress (57);
|
||||||
|
|
||||||
|
/* FIXME: skip bad blocks */
|
||||||
r = nand_read(nand, offset, &cnt, (u_char *) addr);
|
r = nand_read(nand, offset, &cnt, (u_char *) addr);
|
||||||
if (r) {
|
if (r) {
|
||||||
puts("** Read error\n");
|
puts("** Read error\n");
|
||||||
|
@ -680,7 +681,7 @@ usage:
|
||||||
|
|
||||||
U_BOOT_CMD(nboot, 4, 1, do_nandboot,
|
U_BOOT_CMD(nboot, 4, 1, do_nandboot,
|
||||||
"nboot - boot from NAND device\n",
|
"nboot - boot from NAND device\n",
|
||||||
"[.jffs2] [partition] | [[[loadAddr] dev] offset]\n");
|
"[partition] | [[[loadAddr] dev] offset]\n");
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -57,14 +57,9 @@ Commands:
|
||||||
Print information about all of the NAND devices found.
|
Print information about all of the NAND devices found.
|
||||||
|
|
||||||
nand read addr ofs|partition size
|
nand read addr ofs|partition size
|
||||||
Read `size' bytes from `ofs' in NAND flash to `addr'. If a page
|
Read `size' bytes from `ofs' in NAND flash to `addr'. Blocks that
|
||||||
cannot be read because it is marked bad or an uncorrectable data
|
are marked bad are skipped. If a page cannot be read because an
|
||||||
error is found the command stops with an error.
|
uncorrectable data error is found, the command stops with an error.
|
||||||
|
|
||||||
nand read.jffs2 addr ofs|partition size
|
|
||||||
Like `read', but the data for blocks that are marked bad is read as
|
|
||||||
0xff. This gives a readable JFFS2 image that can be processed by
|
|
||||||
the JFFS2 commands such as ls and fsload.
|
|
||||||
|
|
||||||
nand read.oob addr ofs|partition size
|
nand read.oob addr ofs|partition size
|
||||||
Read `size' bytes from the out-of-band data area corresponding to
|
Read `size' bytes from the out-of-band data area corresponding to
|
||||||
|
@ -73,17 +68,15 @@ Commands:
|
||||||
for bad blocks or ECC errors.
|
for bad blocks or ECC errors.
|
||||||
|
|
||||||
nand write addr ofs|partition size
|
nand write addr ofs|partition size
|
||||||
Write `size' bytes from `addr' to `ofs' in NAND flash. If a page
|
Write `size' bytes from `addr' to `ofs' in NAND flash. Blocks that
|
||||||
cannot be written because it is marked bad or the write fails the
|
are marked bad are skipped. If a page cannot be read because an
|
||||||
command stops with an error.
|
uncorrectable data error is found, the command stops with an error.
|
||||||
|
|
||||||
nand write.jffs2 addr ofs|partition size
|
As JFFS2 skips blocks similarly, this allows writing a JFFS2 image,
|
||||||
Like `write', but blocks that are marked bad are skipped and the
|
as long as the image is short enough to fit even after skipping the
|
||||||
data is written to the next block instead. This allows writing
|
bad blocks. Compact images, such as those produced by mkfs.jffs2
|
||||||
a JFFS2 image, as long as the image is short enough to fit even
|
should work well, but loading an image copied from another flash is
|
||||||
after skipping the bad blocks. Compact images, such as those
|
going to be trouble if there are any bad blocks.
|
||||||
produced by mkfs.jffs2 should work well, but loading an image copied
|
|
||||||
from another flash is going to be trouble if there are any bad blocks.
|
|
||||||
|
|
||||||
nand write.oob addr ofs|partition size
|
nand write.oob addr ofs|partition size
|
||||||
Write `size' bytes from `addr' to the out-of-band data area
|
Write `size' bytes from `addr' to the out-of-band data area
|
||||||
|
@ -215,12 +208,6 @@ JFFS2 related commands:
|
||||||
using both the new code which is able to skip bad blocks
|
using both the new code which is able to skip bad blocks
|
||||||
"nand erase clean" additionally writes JFFS2-cleanmarkers in the oob.
|
"nand erase clean" additionally writes JFFS2-cleanmarkers in the oob.
|
||||||
|
|
||||||
"nand write.jffs2"
|
|
||||||
like "nand write" but skip found bad eraseblocks
|
|
||||||
|
|
||||||
"nand read.jffs2"
|
|
||||||
like "nand read" but skip found bad eraseblocks
|
|
||||||
|
|
||||||
Miscellaneous and testing commands:
|
Miscellaneous and testing commands:
|
||||||
"markbad [offset]"
|
"markbad [offset]"
|
||||||
create an artificial bad block (for testing bad block handling)
|
create an artificial bad block (for testing bad block handling)
|
||||||
|
|
Loading…
Reference in New Issue