[Yaffs] [PATCH 3/4] making mkyaffs2image more robust

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Chuck Coffing
Date:  
To: yaffs
Subject: [Yaffs] [PATCH 3/4] making mkyaffs2image more robust
nandwrite requires the image to be a multiple of the block size. (nandwrite
has an option to pad, but this only works when the image does not include OOB.)

Pad the final block of the image with 0xff.
Index: mkyaffs2image/mkyaffs2image.c
===================================================================
--- mkyaffs2image.orig/mkyaffs2image.c    2010-08-26 16:50:46.000000000 -0600
+++ mkyaffs2image/mkyaffs2image.c    2010-08-26 17:15:39.000000000 -0600
@@ -18,7 +18,7 @@
  * makeyaffs2image.c 
  *
  * Makes a YAFFS2 file system image that can be used to load up a file system.
- * Uses default Linux MTD layout - change if you need something different.
+ * Uses default Linux MTD layout - search for "NAND LAYOUT" to change.
  */


#include <stdlib.h>
@@ -41,8 +41,10 @@

#define MAX_OBJECTS 10000

+// Adjust these to match your NAND LAYOUT:
#define chunkSize 2048
#define spareSize 64
+#define pagesPerBlock 64

const char * mkyaffsimage_c_version = "$Id: mkyaffs2image.c,v 1.5 2010-01-11 21:43:18 charles Exp $";

@@ -175,7 +177,7 @@
 static void shuffle_oob(char *spareData, yaffs_PackedTags2 *pt)
 {
     assert(sizeof(*pt) <= spareSize);
-    // For non-trivial OOB orderings, here would be a good place to shuffle.
+    // NAND LAYOUT: For non-trivial OOB orderings, here would be a good place to shuffle.
     memcpy(spareData, pt, sizeof(*pt));
 }


@@ -349,6 +351,21 @@
    
}

+static void pad_image()
+{
+    __u8 data[chunkSize + spareSize];
+    int padPages = (nPages % pagesPerBlock);
+
+    if (padPages)
+    {
+        memset(data, 0xff, sizeof(data));
+        for (padPages = pagesPerBlock-padPages; padPages; padPages--)
+        {
+            if (write(outFile, data, sizeof(data)) != sizeof(data))
+                fatal("write");
+        }
+    }
+}


 static int process_directory(int parent, const char *path)
 {
@@ -555,6 +572,8 @@
     if(write_object_header(1, YAFFS_OBJECT_TYPE_DIRECTORY, &stats, 1,"", -1, NULL) == 0)
         process_directory(YAFFS_OBJECTID_ROOT,argv[1]);

    
+    pad_image();
+
     close(outFile);

    
     if(error)