From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ladislav Michl Date: Fri, 24 Mar 2006 02:23:27 +0100 Subject: [U-Boot-Users] IMPORTANT NOTE to all maintainers with NAND flash In-Reply-To: <20060324005535.BEA42353B50@atlas.denx.de> References: <20060324004338.GA14228@orphique> <20060324005535.BEA42353B50@atlas.denx.de> Message-ID: <20060324012327.GA14685@orphique> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de 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 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