[Yaffs] [PATCH] mkyaffsimage: update yaffs tags data structu…

Top Page
Attachments:
Message as email
+ (text/plain)
Delete this message
Reply to this message
Author: Stanley.Miao
Date:  
To: manningc2
CC: yaffs
Subject: [Yaffs] [PATCH] mkyaffsimage: update yaffs tags data structure
Linux mtd subsysterm has updated the nand spare data layout and YAFFS
filesystem has changed to use yaffs_Packedtags1 data structure. Therefore,
mkyaffsimage should discard the "yaffs_Spare" data structure and use
"yaffs_Packedtags1" according to the new YAFFS filesystem implementation.

Signed-off-by: Stanley.Miao <>
---
 utils/Makefile       |    3 +-
 utils/mkyaffsimage.c |  167 ++++++++++++++-----------------------------------
 2 files changed, 50 insertions(+), 120 deletions(-)


diff --git a/utils/Makefile b/utils/Makefile
index 49bf03b..45554eb 100644
--- a/utils/Makefile
+++ b/utils/Makefile
@@ -29,7 +29,8 @@ COMMONLINKS = yaffs_ecc.c
COMMONOBJS = $(COMMONLINKS:.c=.o)

MKYAFFSSOURCES = mkyaffsimage.c
-MKYAFFSIMAGEOBJS = $(MKYAFFSSOURCES:.c=.o)
+MKYAFFSLINKS = yaffs_packedtags1.c yaffs_tagsvalidity.c
+MKYAFFSIMAGEOBJS = $(MKYAFFSSOURCES:.c=.o) $(MKYAFFSLINKS:.c=.o)

MKYAFFS2SOURCES = mkyaffs2image.c
MKYAFFS2LINKS = yaffs_packedtags2.c yaffs_tagsvalidity.c
diff --git a/utils/mkyaffsimage.c b/utils/mkyaffsimage.c
index e8434e8..f9d9d76 100644
--- a/utils/mkyaffsimage.c
+++ b/utils/mkyaffsimage.c
@@ -30,6 +30,9 @@
#include "yaffs_ecc.h"
#include "yaffs_guts.h"

+#include "yaffs_tagsvalidity.h"
+#include "yaffs_packedtags1.h"
+

#define MAX_OBJECTS 10000

@@ -112,151 +115,77 @@ static int find_obj_in_list(dev_t dev, ino_t ino)
     return -1;
 }


-// NCB added 10/9/2002
-static __u16 yaffs_CalcNameSum(const char *name)
+unsigned int yaffs_CalcTagsECC(yaffs_Tags *tags)
 {
-    __u16 sum = 0;
-    __u16 i = 1;
-    
-    __u8 *bname = (__u8 *)name;
-    
-    while (*bname)
-    {
-        sum += (*bname) * i;
-        i++;
-        bname++;
-    }
-    return sum;
-}
-
-
-static void yaffs_CalcECC(const __u8 *data, yaffs_Spare *spare)
-{
-    yaffs_ECCCalculate(data , spare->ecc1);
-    yaffs_ECCCalculate(&data[256] , spare->ecc2);
-}
-
-static void yaffs_CalcTagsECC(yaffs_Tags *tags)
-{
-    // Todo don't do anything yet. Need to calculate ecc
-    unsigned char *b = ((yaffs_TagsUnion *)tags)->asBytes;
-    unsigned  i,j;
-    unsigned  ecc = 0;
+    /* Calculate an ecc */
+    unsigned char *b = ((yaffs_TagsUnion *) tags)->asBytes;
+    unsigned i, j;
+    unsigned ecc = 0;
     unsigned bit = 0;


-    // Clear ECC fields
-    if (!convert_endian)
-    {
-        tags->ecc = 0;
-    }
-    else
-    {
-        // Because we're in "munged tag" mode, we have to clear it manually
-        b[6] &= 0xC0;
-        b[7] &= 0x03;
-    }
-    
-    for(i = 0; i < 8; i++)
-    {
-// NCB modified 20-9-02        for(j = 1; j &0x7f; j<<=1)
-        for(j = 1; j &0xff; j<<=1)
-        {
+    for (i = 0; i < 8; i++) {
+        for (j = 1; j & 0xff; j <<= 1) {
             bit++;
-            if(b[i] & j)
-            {
+            if (b[i] & j)
                 ecc ^= bit;
-            }
         }
     }
-    
-    // Write out ECC
-    if (!convert_endian)
-    {
-        tags->ecc = ecc;
-    }
-    else
-    {
-        // We have to munge the ECC again.
-        b[6] |= ((ecc >> 6) & 0x3F);
-        b[7] |= ((ecc & 0x3F) << 2);
-    }
-}
-static void yaffs_LoadTagsIntoSpare(yaffs_Spare *sparePtr, yaffs_Tags *tagsPtr)
-{
-    yaffs_TagsUnion *tu = (yaffs_TagsUnion *)tagsPtr;
-    
-    //yaffs_CalcTagsECC(tagsPtr);
-    
-    sparePtr->tagByte0 = tu->asBytes[0];
-    sparePtr->tagByte1 = tu->asBytes[1];
-    sparePtr->tagByte2 = tu->asBytes[2];
-    sparePtr->tagByte3 = tu->asBytes[3];
-    sparePtr->tagByte4 = tu->asBytes[4];
-    sparePtr->tagByte5 = tu->asBytes[5];
-    sparePtr->tagByte6 = tu->asBytes[6];
-    sparePtr->tagByte7 = tu->asBytes[7];
+
+    return ecc;
 }


 /* This little function converts a little endian tag to a big endian tag.
  * NOTE: The tag is not usable after this other than calculating the CRC
  * with.
  */
-static void little_to_big_endian(yaffs_Tags *tagsPtr)
+static void little_to_big_endian(yaffs_TagsUnion *temp, yaffs_Tags *tagsPtr)
 {
-    yaffs_TagsUnion * tags = (yaffs_TagsUnion* )tagsPtr; // Work in bytes.
-    yaffs_TagsUnion   temp;
-
-    memset(&temp, 0, sizeof(temp));
-    // Ick, I hate magic numbers.
-    temp.asBytes[0] = ((tags->asBytes[2] & 0x0F) << 4) | ((tags->asBytes[1] & 0xF0) >> 4);
-    temp.asBytes[1] = ((tags->asBytes[1] & 0x0F) << 4) | ((tags->asBytes[0] & 0xF0) >> 4);
-    temp.asBytes[2] = ((tags->asBytes[0] & 0x0F) << 4) | ((tags->asBytes[2] & 0x30) >> 2) | ((tags->asBytes[3] & 0xC0) >> 6);
-    temp.asBytes[3] = ((tags->asBytes[3] & 0x3F) << 2) | ((tags->asBytes[2] & 0xC0) >> 6);
-    temp.asBytes[4] = ((tags->asBytes[6] & 0x03) << 6) | ((tags->asBytes[5] & 0xFC) >> 2);
-    temp.asBytes[5] = ((tags->asBytes[5] & 0x03) << 6) | ((tags->asBytes[4] & 0xFC) >> 2);
-    temp.asBytes[6] = ((tags->asBytes[4] & 0x03) << 6) | (tags->asBytes[7] & 0x3F);
-    temp.asBytes[7] = (tags->asBytes[6] & 0xFC) | ((tags->asBytes[7] & 0xC0) >> 6);
-
-    // Now copy it back.
-    tags->asBytes[0] = temp.asBytes[0];
-    tags->asBytes[1] = temp.asBytes[1];
-    tags->asBytes[2] = temp.asBytes[2];
-    tags->asBytes[3] = temp.asBytes[3];
-    tags->asBytes[4] = temp.asBytes[4];
-    tags->asBytes[5] = temp.asBytes[5];
-    tags->asBytes[6] = temp.asBytes[6];
-    tags->asBytes[7] = temp.asBytes[7];
+    yaffs_TagsUnion * tags = (yaffs_TagsUnion *)tagsPtr;
+
+    memset(temp, 0, sizeof(*temp));
+    temp->asBytes[0] = ((tags->asBytes[2] & 0x0F) << 4) | ((tags->asBytes[1] & 0xF0) >> 4);
+    temp->asBytes[1] = ((tags->asBytes[1] & 0x0F) << 4) | ((tags->asBytes[0] & 0xF0) >> 4);
+    temp->asBytes[2] = ((tags->asBytes[0] & 0x0F) << 4) | \
+               ((tags->asBytes[2] & 0x30) >> 2) | \
+               ((tags->asBytes[3] & 0xC0) >> 6);
+    temp->asBytes[3] = ((tags->asBytes[3] & 0x3F) << 2) | ((tags->asBytes[2] & 0xC0) >> 6);
+    temp->asBytes[4] = ((tags->asBytes[6] & 0x03) << 6) | ((tags->asBytes[5] & 0xFC) >> 2);
+    temp->asBytes[5] = ((tags->asBytes[5] & 0x03) << 6) | ((tags->asBytes[4] & 0xFC) >> 2);
+    temp->asBytes[6] = ((tags->asBytes[4] & 0x03) << 6) | (tags->asBytes[7] & 0x3F);
+    temp->asBytes[7] = (tags->asBytes[6] & 0xFC) | \
+               ((tags->asBytes[7] & 0x40) >> 5) | \
+               ((tags->asBytes[7] & 0x80) >> 7);
 }


 static int write_chunk(__u8 *data, __u32 objId, __u32 chunkId, __u32 nBytes)
 {
-    yaffs_Tags t;
-    yaffs_Spare s;
+    yaffs_ExtendedTags t;
+    yaffs_PackedTags1 pt;
+    yaffs_TagsUnion temp;


     error = write(outFile,data,512);
     if(error < 0) return error;


-    memset(&t,0xff,sizeof (yaffs_Tags));
-    memset(&s,0xff,sizeof (yaffs_Spare));
-    
+    yaffs_InitialiseTags(&t);
+
     t.chunkId = chunkId;
-    t.serialNumber = 0;
-    t.byteCountLSB = nBytes;
+    t.serialNumber = 1;
+    t.byteCount = nBytes;
     t.objectId = objId;
+    t.chunkUsed = 1;


-    if (convert_endian)
-    {
-        little_to_big_endian(&t);
-    }
-    
-    yaffs_CalcTagsECC(&t);
-    yaffs_LoadTagsIntoSpare(&s,&t);
-    yaffs_CalcECC(data,&s);
-    
+    yaffs_PackTags1(&pt, &t);
     nPages++;
-    
-    return write(outFile,&s,sizeof(yaffs_Spare));
-    
+
+    if (convert_endian) {
+        little_to_big_endian(&temp, &pt);
+        pt.ecc = yaffs_CalcTagsECC((yaffs_Tags *)&temp);
+        little_to_big_endian(&temp, &pt);
+        return write(outFile, &temp, 16);
+    } else {
+        pt.ecc = yaffs_CalcTagsECC((yaffs_Tags *)&pt);
+        return write(outFile, &pt, 16);
+    }
 }


#define SWAP32(x) ((((x) & 0x000000FF) << 24) | \
--
1.5.4.3