diff options
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/flash_eraseall.c | 74 |
1 files changed, 39 insertions, 35 deletions
diff --git a/miscutils/flash_eraseall.c b/miscutils/flash_eraseall.c index ece2500..0411c5a 100644 --- a/miscutils/flash_eraseall.c +++ b/miscutils/flash_eraseall.c @@ -16,9 +16,8 @@ #define OPTION_J (1 << 0) #define OPTION_Q (1 << 1) -#define _bitNAND (2) -#define isNAND (1 << _bitNAND) -#define bbtest (1 << 3) +#define IS_NAND (1 << 2) +#define BBTEST (1 << 3) struct globals { /* This is used in the cpu_to_je/je_to_cpu macros in jffs2_user.h */ @@ -42,7 +41,7 @@ static uint32_t crc32(uint32_t val, const void *ss, int len, static void show_progress(mtd_info_t *meminfo, erase_info_t *erase) { printf("\rErasing %d Kibyte @ %x -- %2llu %% complete.", - meminfo->erasesize / 1024, erase->start, + (unsigned)meminfo->erasesize / 1024, erase->start, (unsigned long long) erase->start * 100 / meminfo->size); fflush(stdout); } @@ -52,7 +51,7 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) { struct jffs2_unknown_node cleanmarker; mtd_info_t meminfo; - int fd, clmpos = 0, clmlen = 8; + int fd, clmpos, clmlen; erase_info_t erase; struct stat st; unsigned int flags; @@ -60,9 +59,9 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) INIT_G(); opt_complementary = "=1"; - flags = getopt32(argv, "jq"); + flags = BBTEST | getopt32(argv, "jq"); - mtd_name = *(argv + optind); + mtd_name = argv[optind]; xstat(mtd_name, &st); if (!S_ISCHR(st.st_mode)) bb_error_msg_and_die("%s: not a char device", mtd_name); @@ -70,19 +69,21 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) fd = xopen(mtd_name, O_RDWR); xioctl(fd, MEMGETINFO, &meminfo); - erase.length = meminfo.erasesize; - flags |= bbtest | ((meminfo.type == MTD_NANDFLASH) << _bitNAND); + if (meminfo.type == MTD_NANDFLASH) + flags |= IS_NAND; + clmpos = 0; + clmlen = 8; if (flags & OPTION_J) { uint32_t *crc32_table; crc32_table = crc32_filltable(NULL, 0); - cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK); - cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER); - if (!(flags & isNAND)) - cleanmarker.totlen = cpu_to_je32 (sizeof (struct jffs2_unknown_node)); + cleanmarker.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); + cleanmarker.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER); + if (!(flags & IS_NAND)) + cleanmarker.totlen = cpu_to_je32(sizeof(struct jffs2_unknown_node)); else { struct nand_oobinfo oobinfo; @@ -91,13 +92,12 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) /* Check for autoplacement */ if (oobinfo.useecc == MTD_NANDECC_AUTOPLACE) { /* Get the position of the free bytes */ - if (!oobinfo.oobfree[0][1]) - bb_error_msg_and_die("Autoplacement selected and no empty space in oob"); - clmpos = oobinfo.oobfree[0][0]; clmlen = oobinfo.oobfree[0][1]; if (clmlen > 8) clmlen = 8; + if (clmlen == 0) + bb_error_msg_and_die("Autoplacement selected and no empty space in oob"); } else { /* Legacy mode */ switch (meminfo.oobsize) { @@ -107,24 +107,27 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) break; case 16: clmpos = 8; - clmlen = 8; + /*clmlen = 8;*/ break; case 64: clmpos = 16; - clmlen = 8; + /*clmlen = 8;*/ break; } } cleanmarker.totlen = cpu_to_je32(8); } - cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, sizeof(struct jffs2_unknown_node) - 4, + cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, sizeof(struct jffs2_unknown_node) - 4, crc32_table)); } + /* Don't want to destroy progress indicator by bb_error_msg's */ + applet_name = xasprintf("\n%s: %s", applet_name, mtd_name); + for (erase.start = 0; erase.start < meminfo.size; erase.start += meminfo.erasesize) { - if (flags & bbtest) { + if (flags & BBTEST) { int ret; loff_t offset = erase.start; @@ -133,18 +136,17 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) if (!(flags & OPTION_Q)) bb_info_msg("\nSkipping bad block at 0x%08x", erase.start); continue; - } else if (ret < 0) { + } + if (ret < 0) { /* Black block table is not available on certain flash * types e.g. NOR */ if (errno == EOPNOTSUPP) { - flags =~ bbtest; - if (flags & isNAND) - bb_error_msg_and_die("%s: Bad block check not available", - mtd_name); + flags = ~BBTEST; + if (flags & IS_NAND) + bb_error_msg_and_die("bad block check not available"); } else { - bb_perror_msg_and_die("\n%s: MTD %s failure", - mtd_name, "get bad block "); + bb_perror_msg_and_die("MEMGETBADBLOCK error"); } } } @@ -159,22 +161,24 @@ int flash_eraseall_main(int argc UNUSED_PARAM, char **argv) continue; /* write cleanmarker */ - if (flags & isNAND) { + if (flags & IS_NAND) { struct mtd_oob_buf oob; oob.ptr = (unsigned char *) &cleanmarker; oob.start = erase.start + clmpos; oob.length = clmlen; - xioctl (fd, MEMWRITEOOB, &oob); + xioctl(fd, MEMWRITEOOB, &oob); } else { - if (lseek (fd, erase.start, SEEK_SET) < 0) { - bb_perror_msg("\n%s: MTD %s failure", mtd_name, "seek"); + xlseek(fd, erase.start, SEEK_SET); + /* if (lseek(fd, erase.start, SEEK_SET) < 0) { + bb_perror_msg("MTD %s failure", "seek"); continue; - } - if (write (fd , &cleanmarker, sizeof (cleanmarker)) != sizeof (cleanmarker)) { - bb_perror_msg("\n%s: MTD %s failure", mtd_name, "write"); + } */ + xwrite(fd, &cleanmarker, sizeof(cleanmarker)); + /* if (write(fd, &cleanmarker, sizeof(cleanmarker)) != sizeof(cleanmarker)) { + bb_perror_msg("MTD %s failure", "write"); continue; - } + } */ } if (!(flags & OPTION_Q)) printf(" Cleanmarker written at %x.", erase.start); |