[U-Boot-Users] IMPORTANT NOTE to all maintainers with NAND flash

Ladislav Michl ladis at linux-mips.org
Fri Mar 24 02:23:27 CET 2006


On Fri, Mar 24, 2006 at 01:55:35AM +0100, Wolfgang Denk wrote:
> Meaning - the comment is IMHO necessary. Thanks.

I hope it makes enough sense...

Best regards,
	ladis

Signed-off-by Ladislav Michl <ladis at linux-mips.org>

CHANGELOG
* Implement NAND OOB erase command
  Patch by Ladislav Michl, 24 Mar 2006

diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index 21adb1b..d443086 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -197,14 +197,23 @@ int do_nand(cmd_tbl_t * cmdtp, int flag,
 		return 0;
 	}
 
+	/*
+	 * Syntax is:
+	 *    0    1     2       3    4
+	 *   nand erase [clean] [off size]
+	 */
 	if (strcmp(cmd, "erase") == 0) {
-		arg_off_size(argc - 2, argv + 2, &off, &size, nand->size);
+		/* "clean" at index 2 means request to erase OOB */
+		int clean = (argc > 2 && strcmp(argv[2], "clean") == 0) ? 1 : 0;
+		int o = clean ? 3 : 2;
+		/* skip first two or three arguments, look for offset and size */
+		arg_off_size(argc - o, argv + o, &off, &size, nand->size);
 		if (off == 0 && size == 0)
-			return 1;
+			size = nand->size;
 
 		printf("\nNAND erase: device %d offset 0x%x, size 0x%x ",
 		       nand_curr_device, off, size);
-		ret = nand_erase(nand, off, size);
+		ret = nand_erase(nand, off, size, clean);
 		printf("%s\n", ret ? "ERROR" : "OK");
 
 		return ret == 0 ? 0 : 1;
@@ -275,7 +284,6 @@ U_BOOT_CMD(nand, 5, 1, do_nand,
 	"    offset `off' (entire device if not specified)\n"
 	"nand bad - show bad blocks\n"
 	"nand dump[.oob] off - dump page\n"
-	"nand scrub - really clean NAND erasing bad blocks (UNSAFE)\n"
 	"nand markbad off - mark bad block at offset (UNSAFE)\n"
 	"nand biterr off - make a bit error at offset (UNSAFE)\n");
 
diff --git a/common/env_nand.c b/common/env_nand.c
index dd27f7b..97371e9 100644
--- a/common/env_nand.c
+++ b/common/env_nand.c
@@ -116,7 +116,7 @@ int saveenv(void)
 	int ret = 0;
 
 	puts ("Erasing Nand...");
-	if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE))
+	if (nand_erase(&nand_info[0], CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))
 		return 1;
 
 	puts ("Writing to Nand... ");
diff --git a/include/nand.h b/include/nand.h
index 905115b..ccac9c1 100644
--- a/include/nand.h
+++ b/include/nand.h
@@ -48,7 +48,7 @@ static inline int nand_block_isbad(nand_
 	return info->block_isbad(info, ofs);
 }
 
-static inline int nand_erase(nand_info_t *info, ulong off, ulong size)
+static inline int nand_erase(nand_info_t *info, ulong off, ulong size, int clean)
 {
 	struct erase_info instr;
 
@@ -57,7 +57,7 @@ static inline int nand_erase(nand_info_t
 	instr.len = size;
 	instr.callback = 0;
 
-	return info->erase(info, &instr);
+	return nand_erase_nand(info, &instr, clean);
 }
 
 #endif





More information about the U-Boot mailing list