Bad block skipping for command nboot
PATCH 1/1 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 ...".
common/cmd_nand.c +34 -5
@@ -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) */
PATCH 1/1 Bad block skipping for command nboot
Hi Thomas,
Quoted 6 lines · Thomas Knobloch
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:
Quoted 10 lines
Signed-off-by Thomas Knobloch <[email protected]>common/cmd_nand.c +1
-1@@ -476,14 +476,33 @@ ulong offset, ulong addr, char *cmd) { int r; -char *ep; +char *ep, *s;
common/cmd_nand.c line 489
Quoted 10 lines
common/cmd_nand.c +8
-0ulong 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 at denx.de
=====================================================================
PATCH 1/1 Bad block skipping for command nboot
Quoted 3 lines · Stefan Roese
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.
Quoted 7 lines
common/cmd_nand.c line 489
Quoted 5 lines
common/cmd_nand.c +5
-0+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
PATCH 1/1 Bad block skipping for command nboot
Hi Thomas,
Quoted 11 lines · Thomas Knobloch
Quoted 3 lines
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.
Quoted 4 lines
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 at denx.de
=====================================================================
PATCH 1/1 Bad block skipping for command nboot
In reply to Stefan RoeseThe 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 ...".
common/cmd_nand.c +32 -5
@@ -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 *cmprint_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 fif (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) */
PATCH 1/1 Bad block skipping for command nboot
Hi Thomas,
Quoted 6 lines · Thomas Knobloch
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 at denx.de
=====================================================================