[U-Boot-Users] [PATCH] 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
--- a/common/cmd_nand.c 2007-02-02 10:02:06.000000000 +0100 +++ b/common/cmd_nand.c 2007-07-02 10:59:26.000000000 +0200 @@ -476,14 +476,33 @@ 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 +520,18 @@ 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 +579,7 @@ 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 +634,7 @@
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) */

Hi Thomas,
On Monday 02 July 2007, Thomas Knobloch wrote:
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 ...".
And that's why I have to ask: Do we really need this command extension? Why not just use a combination of commands (e.g. "nand read.jffs2 ...;bootm ...)?
Nevertheless one short remark in the patch below:
Signed-off-by: Thomas Knobloch knobloch@siemens.com
--- a/common/cmd_nand.c 2007-02-02 10:02:06.000000000 +0100 +++ b/common/cmd_nand.c 2007-07-02 10:59:26.000000000 +0200 @@ -476,14 +476,33 @@ 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;
- }
No parentheses for one lined statements please.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================

On 7/3/2007 2:27 PM, Stefan Roese wrote:
And that's why I have to ask: Do we really need this command extension? Why not just use a combination of commands (e.g. "nand read.jffs2 ...;bootm ...)?
Using "nand read.jffs2 ...;bootm ..." has one disadvantage compared to the new "nboot.jffs2 ...". For the first command sequence u-boot has to read a fixed number of bytes from the NAND. You have to make big enough to support the largest possible image for your application. If the image is smaller u-boot will still have to read this fixed number of bytes. For "nboot" resp. "nboot.jffs2" u-boot will read only as much data from NAND as necessary. This might give some performance improvement. BTW: when you ask for the need of the command "nboot.jffs2" you probably should question the pure "nboot" as well. It can be replaced by "nand read ...;bootm ..." as well.
if (s != NULL &&
(!strcmp(s, ".jffs2") || !strcmp(s, ".e") || !strcmp(s, ".i")))
{
jffs2 = 1;
}
No parentheses for one lined statements please.
Sorry for that.
Best regards, Thomas
SECM PD Mch Siemens Enterprise Communications Manufacturing GmbH & Co KG Hertzstrasse 2 04329 Leipzig

Hi Thomas,
On Tuesday 03 July 2007, Thomas Knobloch wrote:
And that's why I have to ask: Do we really need this command extension? Why not just use a combination of commands (e.g. "nand read.jffs2 ...;bootm ...)?
Using "nand read.jffs2 ...;bootm ..." has one disadvantage compared to the new "nboot.jffs2 ...". For the first command sequence u-boot has to read a fixed number of bytes from the NAND. You have to make big enough to support the largest possible image for your application. If the image is smaller u-boot will still have to read this fixed number of bytes. For "nboot" resp. "nboot.jffs2" u-boot will read only as much data from NAND as necessary. This might give some performance improvement.
Understood.
BTW: when you ask for the need of the command "nboot.jffs2" you probably should question the pure "nboot" as well. It can be replaced by "nand read ...;bootm ..." as well.
Yep, correct. That's what was asking myself. I never used it so far.
Please resend the patch and I'll commit it to the NAND repository.
Thanks.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================

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
--- a/common/cmd_nand.c 2007-02-02 10:02:06.000000000 +0100 +++ b/common/cmd_nand.c 2007-07-03 17:21:47.000000000 +0200 @@ -476,14 +476,31 @@ static int nand_load_image(cmd_tbl_t *cm 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 *cm 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 f 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) */

Hi Thomas,
On Tuesday 03 July 2007, Thomas Knobloch wrote:
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 ...".
Applied to the u-boot-nand-flash repository.
Thanks.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================
participants (2)
-
Stefan Roese
-
Thomas Knobloch