summaryrefslogtreecommitdiff
path: root/common/cmd_nand.c
diff options
context:
space:
mode:
authorThomas Knobloch <knobloch@siemens.com>2007-07-06 14:58:39 +0200
committerStefan Roese <sr@denx.de>2007-07-06 14:58:39 +0200
commit10e038932f22ee80ebd53de312531e70e6590a2f (patch)
tree82886b9cc125d979bd856fa893506bec9d4a0b84 /common/cmd_nand.c
parent461f2274f8d5e15a354ff92648f17c7b2aa76faa (diff)
downloadu-boot-imx-10e038932f22ee80ebd53de312531e70e6590a2f.zip
u-boot-imx-10e038932f22ee80ebd53de312531e70e6590a2f.tar.gz
u-boot-imx-10e038932f22ee80ebd53de312531e70e6590a2f.tar.bz2
[NAND] Bad block skipping for command nboot
The old implementation of command nboot does not support reading the image from NAND flash with skipping of bad blocks. The patch implements a new version of the nboot command: by calling nboot.jffs2 from the u-boot command line the command will load the image from NAND flash with respect to bad blocks (by using nand_read_opts()). This is similar to e.g. the NAND read command: "nand read.jffs2 ...". Signed-off-by: Thomas Knobloch <knobloch@siemens.com> Signed-off-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'common/cmd_nand.c')
-rw-r--r--common/cmd_nand.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index b011b5e..9ef31d4 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -476,14 +476,31 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
ulong offset, ulong addr, char *cmd)
{
int r;
- char *ep;
+ char *ep, *s;
ulong cnt;
image_header_t *hdr;
+ int jffs2 = 0;
+
+ s = strchr(cmd, '.');
+ if (s != NULL &&
+ (!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")))
+ jffs2 = 1;
printf("\nLoading from %s, offset 0x%lx\n", nand->name, offset);
cnt = nand->oobblock;
- r = nand_read(nand, offset, &cnt, (u_char *) addr);
+ if (jffs2) {
+ nand_read_options_t opts;
+ memset(&opts, 0, sizeof(opts));
+ opts.buffer = (u_char*) addr;
+ opts.length = cnt;
+ opts.offset = offset;
+ opts.quiet = 1;
+ r = nand_read_opts(nand, &opts);
+ } else {
+ r = nand_read(nand, offset, &cnt, (u_char *) addr);
+ }
+
if (r) {
puts("** Read error\n");
SHOW_BOOT_PROGRESS(-1);
@@ -501,8 +518,18 @@ static int nand_load_image(cmd_tbl_t *cmdtp, nand_info_t *nand,
print_image_hdr(hdr);
cnt = (ntohl(hdr->ih_size) + sizeof (image_header_t));
+ if (jffs2) {
+ nand_read_options_t opts;
+ memset(&opts, 0, sizeof(opts));
+ opts.buffer = (u_char*) addr;
+ opts.length = cnt;
+ opts.offset = offset;
+ opts.quiet = 1;
+ r = nand_read_opts(nand, &opts);
+ } else {
+ r = nand_read(nand, offset, &cnt, (u_char *) addr);
+ }
- r = nand_read(nand, offset, &cnt, (u_char *) addr);
if (r) {
puts("** Read error\n");
SHOW_BOOT_PROGRESS(-1);
@@ -550,7 +577,7 @@ int do_nandboot(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
if (argc > 3)
goto usage;
if (argc == 3)
- addr = simple_strtoul(argv[2], NULL, 16);
+ addr = simple_strtoul(argv[1], NULL, 16);
else
addr = CFG_LOAD_ADDR;
return nand_load_image(cmdtp, &nand_info[dev->id->num],
@@ -605,7 +632,7 @@ usage:
U_BOOT_CMD(nboot, 4, 1, do_nandboot,
"nboot - boot from NAND device\n",
- "[partition] | [[[loadAddr] dev] offset]\n");
+ "[.jffs2] [partition] | [[[loadAddr] dev] offset]\n");
#endif /* (CONFIG_COMMANDS & CFG_CMD_NAND) */