aboutsummaryrefslogtreecommitdiff
path: root/miscutils/flash_eraseall.c
diff options
context:
space:
mode:
authorBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2009-02-18 13:26:29 +0000
committerBernhard Reutner-Fischer <rep.dot.nop@gmail.com>2009-02-18 13:26:29 +0000
commit7d9d25154359d6ce16edc59ed202cfa2e998fdcb (patch)
tree334be9578f4b78e44dbbd8ba8b5b3de44c167dce /miscutils/flash_eraseall.c
parent0d22d1755c2c55ad45b01458bbf2f09aab4308d2 (diff)
downloadbusybox-w32-7d9d25154359d6ce16edc59ed202cfa2e998fdcb.tar.gz
busybox-w32-7d9d25154359d6ce16edc59ed202cfa2e998fdcb.tar.bz2
busybox-w32-7d9d25154359d6ce16edc59ed202cfa2e998fdcb.zip
- make it compile and shrink it a little bit (~-110 bytes)
text data bss dec hex filename 1533 4 0 1537 601 miscutils/flash_eraseall.o.old 1415 4 0 1419 58b miscutils/flash_eraseall.o - add some FIXMEs
Diffstat (limited to 'miscutils/flash_eraseall.c')
-rw-r--r--miscutils/flash_eraseall.c69
1 files changed, 33 insertions, 36 deletions
diff --git a/miscutils/flash_eraseall.c b/miscutils/flash_eraseall.c
index 79028d780..e0e07ae69 100644
--- a/miscutils/flash_eraseall.c
+++ b/miscutils/flash_eraseall.c
@@ -1,35 +1,30 @@
1/* vi: set sw=4 ts=4: */
1/* eraseall.c -- erase the whole of a MTD device 2/* eraseall.c -- erase the whole of a MTD device
2 3 *
3 Ported to busybox from mtd-utils. 4 * Ported to busybox from mtd-utils.
4 5 *
5 Copyright (C) 2000 Arcom Control System Ltd 6 * Copyright (C) 2000 Arcom Control System Ltd
6 7 *
7 Renamed to flash_eraseall.c 8 * Renamed to flash_eraseall.c
8 9 *
9 This program is free software; you can redistribute it and/or modify 10 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
22 */ 11 */
23 12
24#include "libbb.h" 13#include "libbb.h"
25
26#include <mtd/mtd-user.h> 14#include <mtd/mtd-user.h>
27#include <mtd/jffs2-user.h> 15#include <mtd/jffs2-user.h>
28 16
29#define OPTION_J (1 << 0) 17#define OPTION_J (1 << 0)
30#define OPTION_Q (1 << 1) 18#define OPTION_Q (1 << 1)
19#define _bitNAND (2)
20#define isNAND (1 << _bitNAND)
21#define bbtest (1 << 3)
31 22
32int target_endian = __BYTE_ORDER; 23/* This is used in the cpu_to_je/je_to_cpu macros in jffs2_user.h */
24/* FIXME: target_endian should be const!
25 * FIXME: Also it sounds more sensible to use our own existing SWAP_ macros.
26 */
27/* const */ int target_endian = __BYTE_ORDER;
33 28
34static uint32_t crc32(uint32_t val, const void *ss, int len, 29static uint32_t crc32(uint32_t val, const void *ss, int len,
35 uint32_t *crc32_table) 30 uint32_t *crc32_table)
@@ -49,14 +44,13 @@ static void show_progress(mtd_info_t *meminfo, erase_info_t *erase)
49} 44}
50 45
51int flash_eraseall_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; 46int flash_eraseall_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
52int flash_eraseall_main(int argc, char **argv) 47int flash_eraseall_main(int argc UNUSED_PARAM, char **argv)
53{ 48{
54 struct jffs2_unknown_node cleanmarker; 49 struct jffs2_unknown_node cleanmarker;
55 mtd_info_t meminfo; 50 mtd_info_t meminfo;
56 int fd, clmpos = 0, clmlen = 8; 51 int fd, clmpos = 0, clmlen = 8;
57 erase_info_t erase; 52 erase_info_t erase;
58 struct stat st; 53 struct stat st;
59 int isNAND, bbtest = 1;
60 unsigned int flags; 54 unsigned int flags;
61 char *mtd_name; 55 char *mtd_name;
62 56
@@ -73,7 +67,7 @@ int flash_eraseall_main(int argc, char **argv)
73 xioctl(fd, MEMGETINFO, &meminfo); 67 xioctl(fd, MEMGETINFO, &meminfo);
74 68
75 erase.length = meminfo.erasesize; 69 erase.length = meminfo.erasesize;
76 isNAND = meminfo.type == MTD_NANDFLASH ? 1 : 0; 70 flags |= bbtest | ((meminfo.type == MTD_NANDFLASH) << _bitNAND);
77 71
78 if (flags & OPTION_J) { 72 if (flags & OPTION_J) {
79 uint32_t *crc32_table; 73 uint32_t *crc32_table;
@@ -82,7 +76,7 @@ int flash_eraseall_main(int argc, char **argv)
82 76
83 cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK); 77 cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);
84 cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER); 78 cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);
85 if (!isNAND) 79 if (!(flags & isNAND))
86 cleanmarker.totlen = cpu_to_je32 (sizeof (struct jffs2_unknown_node)); 80 cleanmarker.totlen = cpu_to_je32 (sizeof (struct jffs2_unknown_node));
87 else { 81 else {
88 struct nand_oobinfo oobinfo; 82 struct nand_oobinfo oobinfo;
@@ -125,10 +119,10 @@ int flash_eraseall_main(int argc, char **argv)
125 119
126 for (erase.start = 0; erase.start < meminfo.size; 120 for (erase.start = 0; erase.start < meminfo.size;
127 erase.start += meminfo.erasesize) { 121 erase.start += meminfo.erasesize) {
128 if (bbtest) { 122 if (flags & bbtest) {
129 int ret; 123 int ret;
130
131 loff_t offset = erase.start; 124 loff_t offset = erase.start;
125
132 ret = ioctl(fd, MEMGETBADBLOCK, &offset); 126 ret = ioctl(fd, MEMGETBADBLOCK, &offset);
133 if (ret > 0) { 127 if (ret > 0) {
134 if (!(flags & OPTION_Q)) 128 if (!(flags & OPTION_Q))
@@ -139,13 +133,13 @@ int flash_eraseall_main(int argc, char **argv)
139 * types e.g. NOR 133 * types e.g. NOR
140 */ 134 */
141 if (errno == EOPNOTSUPP) { 135 if (errno == EOPNOTSUPP) {
142 bbtest = 0; 136 flags =~ bbtest;
143 if (isNAND) 137 if (flags & isNAND)
144 bb_error_msg_and_die("%s: Bad block check not available", 138 bb_error_msg_and_die("%s: Bad block check not available",
145 mtd_name); 139 mtd_name);
146 } else { 140 } else {
147 bb_error_msg_and_die("\n%s: MTD get bad block failed: %s", 141 bb_perror_msg_and_die("\n%s: MTD %s failure",
148 mtd_name, strerror(errno)); 142 mtd_name, "get bad block ");
149 } 143 }
150 } 144 }
151 } 145 }
@@ -160,19 +154,20 @@ int flash_eraseall_main(int argc, char **argv)
160 continue; 154 continue;
161 155
162 /* write cleanmarker */ 156 /* write cleanmarker */
163 if (isNAND) { 157 if (flags & isNAND) {
164 struct mtd_oob_buf oob; 158 struct mtd_oob_buf oob;
159
165 oob.ptr = (unsigned char *) &cleanmarker; 160 oob.ptr = (unsigned char *) &cleanmarker;
166 oob.start = erase.start + clmpos; 161 oob.start = erase.start + clmpos;
167 oob.length = clmlen; 162 oob.length = clmlen;
168 xioctl (fd, MEMWRITEOOB, &oob); 163 xioctl (fd, MEMWRITEOOB, &oob);
169 } else { 164 } else {
170 if (lseek (fd, erase.start, SEEK_SET) < 0) { 165 if (lseek (fd, erase.start, SEEK_SET) < 0) {
171 bb_error_msg("\n%s: MTD lseek failure: %s", mtd_name, strerror(errno)); 166 bb_perror_msg("\n%s: MTD %s failure", mtd_name, "seek");
172 continue; 167 continue;
173 } 168 }
174 if (write (fd , &cleanmarker, sizeof (cleanmarker)) != sizeof (cleanmarker)) { 169 if (write (fd , &cleanmarker, sizeof (cleanmarker)) != sizeof (cleanmarker)) {
175 bb_error_msg("\n%s: MTD write failure: %s", mtd_name, strerror(errno)); 170 bb_perror_msg("\n%s: MTD %s failure", mtd_name, "write");
176 continue; 171 continue;
177 } 172 }
178 } 173 }
@@ -181,8 +176,10 @@ int flash_eraseall_main(int argc, char **argv)
181 } 176 }
182 if (!(flags & OPTION_Q)) { 177 if (!(flags & OPTION_Q)) {
183 show_progress(&meminfo, &erase); 178 show_progress(&meminfo, &erase);
184 printf("\n"); 179 bb_putchar('\n');
185 } 180 }
186 181
182 if (ENABLE_FEATURE_CLEAN_UP)
183 close(fd);
187 return EXIT_SUCCESS; 184 return EXIT_SUCCESS;
188} 185}