From 344c4a1b2c48c9fa9e622540250de9e0e8003eea Mon Sep 17 00:00:00 2001 From: Manikandan Pillai Date: Wed, 6 Aug 2008 10:40:09 +0530 Subject: [PATCH] Fix up for ONENAND flash offset for read/write operations Signed-off-by: Manikandan Pillai --- board/omap3evm/mem.c | 2 +- common/cmd_onenand.c | 48 +++++++++++++++++++++++++++--------------------- common/env_onenand.c | 12 +++--------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/board/omap3evm/mem.c b/board/omap3evm/mem.c index ba95317..0340aa5 100644 --- a/board/omap3evm/mem.c +++ b/board/omap3evm/mem.c @@ -267,7 +267,7 @@ void gpmc_init(void) size = PISMO1_ONEN_SIZE; enable_gpmc_config(gpmc_config, gpmc_base, base, size); - f_off = (ONENAND_MAP + ONENAND_ENV_OFFSET); + f_off = ONENAND_ENV_OFFSET; f_sec = SZ_128K; is_onenand = 1; onenand_cs_base = gpmc_base; diff --git a/common/cmd_onenand.c b/common/cmd_onenand.c index 86a7420..2dfcd49 100644 --- a/common/cmd_onenand.c +++ b/common/cmd_onenand.c @@ -32,8 +32,9 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) case 1: printf("Usage:\n%s\n", cmdtp->usage); return 1; - + /* printf version info if no of arguments are not enough */ case 2: + case 3: if (strncmp(argv[1], "open", 4) == 0) { onenand_init(); return 0; @@ -47,8 +48,8 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) struct erase_info instr = { .callback = NULL, }; - ulong start, end; - ulong block; + ulong start = 0, end = 0; + ulong block = 0; char *endtail; if (strncmp(argv[2], "block", 5) == 0) { @@ -58,10 +59,6 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } else { start = simple_strtoul(argv[2], NULL, 10); end = simple_strtoul(argv[3], NULL, 10); -#ifndef CONFIG_OVERO - start -= (unsigned long)onenand_chip.base; - end -= (unsigned long)onenand_chip.base; -#endif start >>= onenand_chip.erase_shift; end >>= onenand_chip.erase_shift; /* Don't include the end block */ @@ -87,14 +84,16 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } if (strncmp(argv[1], "read", 4) == 0) { + size_t len = 0, retlen = 0; ulong addr = simple_strtoul(argv[2], NULL, 16); ulong ofs = simple_strtoul(argv[3], NULL, 16); - size_t len = simple_strtoul(argv[4], NULL, 16); - size_t retlen = 0; int oob = strncmp(argv[1], "read.oob", 8) ? 0 : 1; -#ifndef CONFIG_OVERO - ofs -= (unsigned long)onenand_chip.base; -#endif + + if (argc >= 5) + len = simple_strtoul(argv[4], NULL, 16); + else + return 1; + if (oob) onenand_read_oob(&onenand_mtd, ofs, len, &retlen, (u_char *) addr); @@ -107,13 +106,14 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } if (strncmp(argv[1], "write", 5) == 0) { + size_t len = 0, retlen = 0; ulong addr = simple_strtoul(argv[2], NULL, 16); ulong ofs = simple_strtoul(argv[3], NULL, 16); - size_t len = simple_strtoul(argv[4], NULL, 16); - size_t retlen = 0; -#ifndef CONFIG_OVERO - ofs -= (unsigned long)onenand_chip.base; -#endif + if (argc >= 5) + len = simple_strtoul(argv[4], NULL, 16); + else + return 1; + onenand_write(&onenand_mtd, ofs, len, &retlen, (u_char *) addr); printf("Done\n"); @@ -122,14 +122,19 @@ int do_onenand(cmd_tbl_t * cmdtp, int flag, int argc, char *argv[]) } if (strncmp(argv[1], "block", 5) == 0) { - ulong addr = simple_strtoul(argv[2], NULL, 16); - ulong block = simple_strtoul(argv[3], NULL, 10); - ulong page = simple_strtoul(argv[4], NULL, 10); - size_t len = simple_strtol(argv[5], NULL, 10); + ulong page = 0; + size_t len = 0; size_t retlen = 0; ulong ofs; + ulong addr = simple_strtoul(argv[2], NULL, 16); + ulong block = simple_strtoul(argv[3], NULL, 10); int oob = strncmp(argv[1], "block.oob", 9) ? 0 : 1; + if (argc >= 5) + page = simple_strtoul(argv[4], NULL, 10); + if (argc >= 6) + len = simple_strtol(argv[5], NULL, 10); + ofs = block << onenand_chip.erase_shift; if (page) ofs += page << onenand_chip.page_shift; @@ -163,6 +168,7 @@ U_BOOT_CMD( "onenand read[.oob] addr ofs len - read data at ofs with len to addr\n" "onenand write addr ofs len - write data at ofs with len from addr\n" "onenand erase saddr eaddr - erase block start addr to end addr\n" + "onenand erase block sblk-endblk - erase blocks sblk to endblk\n" "onenand block[.oob] addr block [page] [len] - " "read data with (block [, page]) to addr" ); diff --git a/common/env_onenand.c b/common/env_onenand.c index 8b214e4..ecf93c4 100644 --- a/common/env_onenand.c +++ b/common/env_onenand.c @@ -66,9 +66,7 @@ void env_relocate_spec(void) size_t retlen; env_addr = CFG_ENV_ADDR; -#ifndef CONFIG_OVERO - env_addr -= (unsigned long) onenand_chip.base; -#endif + /* Check OneNAND exist */ if (onenand_mtd.oobblock) /* Ignore read fail */ @@ -102,9 +100,7 @@ int saveenv(void) instr.len = CFG_ENV_SIZE; instr.addr = env_addr; -#ifndef CONFIG_OVERO - instr.addr -= (unsigned long)onenand_chip.base; -#endif + if (onenand_erase(&onenand_mtd, &instr)) { printf("OneNAND: erase failed at 0x%08lx\n", env_addr); return 1; @@ -113,9 +109,7 @@ int saveenv(void) /* update crc */ env_ptr->crc = crc32(0, env_ptr->data, ONENAND_ENV_SIZE(onenand_mtd)); -#ifndef CONFIG_OVERO - env_addr -= (unsigned long)onenand_chip.base; -#endif + if (onenand_write(&onenand_mtd, env_addr, onenand_mtd.oobblock, &retlen, (u_char *) env_ptr)) { printf("OneNAND: write failed at 0x%08x\n", instr.addr); -- 1.5.6