Skip to contentSkip to conversation

Bad block skipping for command nboot

PATCH New Thomas Knobloch 2 participants 6 messages Jul 2, 2007 – Jul 6, 2007

lore
Share & tools
lore
#0 lore raw

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) */
#1 lore raw

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
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 -0
  	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 at denx.de
=====================================================================

#2 lore raw

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

#3 lore raw

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
=====================================================================

#4 lore raw

PATCH 1/1 Bad block skipping for command nboot

In reply to Stefan Roese

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 +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 *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) */
#5 lore raw

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
=====================================================================