[PATCH 3/3] Place the cleanmarker in OOB area according to the mode MTD_OOB_AUTO
Stanley.Miao
stanley.miao at windriver.com
Fri Jun 11 05:36:15 EDT 2010
In the current linux kernel, Jffs2 writes the cleanmarker according to the
mode MTD_OOB_AUTO, so modify the layout of the cleanmarker from
MTD_OOB_PLACE to MTD_OOB_AUTO in flash_eraseall.
Signed-off-by: Stanley.Miao <stanley.miao at windriver.com>
---
flash_eraseall.c | 40 ++++++++++++++++++++++------------------
1 files changed, 22 insertions(+), 18 deletions(-)
diff --git a/flash_eraseall.c b/flash_eraseall.c
index 4e2108b..f0f0371 100644
--- a/flash_eraseall.c
+++ b/flash_eraseall.c
@@ -34,7 +34,7 @@
#include <time.h>
#include <getopt.h>
#include <sys/ioctl.h>
-#include <sys/mount.h>
+#include <sys/param.h>
#include "crc32.h"
#include <mtd/mtd-user.h>
@@ -75,9 +75,11 @@ static int get_linux_version(void)
int main (int argc, char *argv[])
{
mtd_info_t meminfo;
- int fd, clmpos = 0, clmlen = 8;
+ int fd;
erase_info_t erase;
int isNAND, bbtest = 1;
+ unsigned char oobbuf[128];
+ memset(oobbuf, 0xFF, 128);
process_options(argc, argv);
@@ -98,11 +100,18 @@ int main (int argc, char *argv[])
if (jffs2) {
cleanmarker.magic = cpu_to_je16 (JFFS2_MAGIC_BITMASK);
cleanmarker.nodetype = cpu_to_je16 (JFFS2_NODETYPE_CLEANMARKER);
- if (!isNAND)
+ if (!isNAND) {
cleanmarker.totlen = cpu_to_je32 (sizeof (struct jffs2_unknown_node));
- else {
+ cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, \
+ sizeof(struct jffs2_unknown_node) - 4));
+ } else {
+ int already_read, num, i, start;
struct nand_ecclayout ecclayout;
+ cleanmarker.totlen = cpu_to_je32(8);
+ cleanmarker.hdr_crc = cpu_to_je32(crc32(0, &cleanmarker, \
+ sizeof(struct jffs2_unknown_node) - 4));
+
memset(&ecclayout, 0, sizeof(ecclayout));
if (get_linux_version() > LINUX_VERSION(2, 6, 17)) {
if (ioctl(fd, ECCGETLAYOUT, &ecclayout) != 0) {
@@ -122,19 +131,14 @@ int main (int argc, char *argv[])
memcpy(&ecclayout.oobfree, &oi.oobfree, sizeof(oi.oobfree));
ecclayout.eccbytes = oi.eccbytes;
}
-
- /* Get the position of the free bytes */
- if (!ecclayout.oobfree[0].length) {
- fprintf(stderr, " Eeep. Autoplacement selected and no empty space in oob\n");
- return 1;
+ already_read = 0;
+ for (i = 0; (already_read < 8) && ecclayout.oobfree[i].length; i++) {
+ num = MIN(8 - already_read, ecclayout.oobfree[i].length);
+ start = ecclayout.oobfree[i].offset;
+ memcpy(oobbuf + start, (unsigned char *)&cleanmarker + already_read, num);
+ already_read += num;
}
- clmpos = ecclayout.oobfree[0].offset;
- clmlen = ecclayout.oobfree[0].length;
- if (clmlen > 8)
- clmlen = 8;
- cleanmarker.totlen = cpu_to_je32(8);
}
- cleanmarker.hdr_crc = cpu_to_je32 (crc32 (0, &cleanmarker, sizeof (struct jffs2_unknown_node) - 4));
}
for (erase.start = 0; erase.start < meminfo.size; erase.start += meminfo.erasesize) {
@@ -174,9 +178,9 @@ int main (int argc, char *argv[])
/* write cleanmarker */
if (isNAND) {
struct mtd_oob_buf oob;
- oob.ptr = (unsigned char *) &cleanmarker;
- oob.start = erase.start + clmpos;
- oob.length = clmlen;
+ oob.ptr = oobbuf;
+ oob.start = erase.start;
+ oob.length = meminfo.oobsize;
if (ioctl (fd, MEMWRITEOOB, &oob) != 0) {
fprintf(stderr, "\n%s: %s: MTD writeoob failure: %s\n", exe_name, mtd_device, strerror(errno));
continue;
--
1.5.4.3
More information about the linux-mtd
mailing list