*** empty log message ***
[yaffs/.git] / yaffs_fileem.c
index dbbe5f8b3a4d593d68f767e82a3ffad5fbc9094e..dd77b37fca0fd0ab946a6b241c2ff5abce38b1af 100644 (file)
@@ -54,6 +54,62 @@ static int IsAMarkedBadBlock(int blk)
 }
 
 
+static __u8 yaffs_WriteFailCorruption(int chunkInNAND)
+{
+       switch(chunkInNAND)
+       {
+               case 2000:
+               case 2003:
+               case 3000:
+               case 3001:
+                                       return 3;// ding two bits
+               case 2001:
+               case 3003:
+               case 3004:
+               case 3005:
+               case 3006:
+               case 3007:  return 1;// ding one bit
+               
+               default: return 0;
+               
+       }
+}
+
+static void yaffs_ModifyWriteData(int chunkInNAND,__u8 *data)
+{
+       if(data)
+       {
+               *data ^= yaffs_WriteFailCorruption(chunkInNAND);        
+       }
+}
+
+static __u8 yaffs_ReadFailCorruption(int chunkInNAND)
+{
+       switch(chunkInNAND)
+       {
+               case 500:
+                                       return 3;// ding two bits
+               case 700:
+               case 750:
+                                       return 1;// ding one bit
+               
+               default: return 0;
+               
+       }
+}
+
+static void yaffs_ModifyReadData(int chunkInNAND,__u8 *data)
+{
+       if(data)
+       {
+               *data ^= yaffs_ReadFailCorruption(chunkInNAND); 
+       }
+}
+
+
+
+
+
 static void  CheckInit(yaffs_Device *dev)
 {
        static int initialised = 0;
@@ -100,6 +156,8 @@ static void  CheckInit(yaffs_Device *dev)
 
 int yaffs_FEWriteChunkToNAND(yaffs_Device *dev,int chunkInNAND,const __u8 *data, yaffs_Spare *spare)
 {
+       __u8 localData[512];
+       
        int pos;
        
        pos = chunkInNAND * 528;
@@ -109,8 +167,10 @@ int yaffs_FEWriteChunkToNAND(yaffs_Device *dev,int chunkInNAND,const __u8 *data,
        
        if(data)
        {
+               memcpy(localData,data,512);
+               yaffs_ModifyWriteData(chunkInNAND,localData);
                lseek(h,pos,SEEK_SET);
-               write(h,data,512);
+               write(h,localData,512);
        }
        
        pos += 512;
@@ -138,6 +198,7 @@ int yaffs_FEReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaf
        {
                lseek(h,pos,SEEK_SET);
                read(h,data,512);
+               yaffs_ModifyReadData(chunkInNAND,data);
        }
        
        pos += 512;
@@ -168,6 +229,13 @@ int yaffs_FEEraseBlockInNAND(yaffs_Device *dev,int blockInNAND)
        {
                write(h,ffChunk,528);
        }
+       
+       switch(blockInNAND)
+       {
+               case 10: 
+               case 15: return YAFFS_FAIL;
+               
+       }
        return YAFFS_OK;
 }