X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=yaffs_fileem.c;h=dd77b37fca0fd0ab946a6b241c2ff5abce38b1af;hb=e7944bf67d156b9ecb1c8cdf9223dfb0e3154ba4;hp=dbbe5f8b3a4d593d68f767e82a3ffad5fbc9094e;hpb=aa39fbf7616e8b26833a09cb64c6a40859494599;p=yaffs%2F.git diff --git a/yaffs_fileem.c b/yaffs_fileem.c index dbbe5f8..dd77b37 100644 --- a/yaffs_fileem.c +++ b/yaffs_fileem.c @@ -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; }