X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs%2F.git;a=blobdiff_plain;f=yaffs_fileem.c;h=3ee50eb739ab6a39f32bff4259b985a0ec331c14;hp=dd77b37fca0fd0ab946a6b241c2ff5abce38b1af;hb=f7b95a3fb1e45ff10c22d3148ae3c97d61a9c449;hpb=e7944bf67d156b9ecb1c8cdf9223dfb0e3154ba4 diff --git a/yaffs_fileem.c b/yaffs_fileem.c index dd77b37..3ee50eb 100644 --- a/yaffs_fileem.c +++ b/yaffs_fileem.c @@ -26,7 +26,9 @@ #include #include -#define FILE_SIZE_IN_MEG 32 +#define FILE_SIZE_IN_MEG 2 + +// #define YAFFS_ERROR_TESTING #define BLOCK_SIZE (32 * 528) #define BLOCKS_PER_MEG ((1024*1024)/(32 * 512)) @@ -43,6 +45,7 @@ static int markedBadBlocks[] = { 1, 4, -1}; static int IsAMarkedBadBlock(int blk) { +#if YAFFS_ERROR_TESTING int *m = markedBadBlocks; while(*m >= 0) @@ -50,12 +53,24 @@ static int IsAMarkedBadBlock(int blk) if(*m == blk) return 1; m++; } +#endif return 0; } static __u8 yaffs_WriteFailCorruption(int chunkInNAND) { +#if YAFFS_ERROR_TESTING + + // Whole blocks that fail + switch(chunkInNAND/YAFFS_CHUNKS_PER_BLOCK) + { + case 50: + case 52: + return 7; + } + + // Single blocks that fail switch(chunkInNAND) { case 2000: @@ -70,29 +85,34 @@ static __u8 yaffs_WriteFailCorruption(int chunkInNAND) case 3006: case 3007: return 1;// ding one bit - default: return 0; } +#endif + return 0; } static void yaffs_ModifyWriteData(int chunkInNAND,__u8 *data) { +#if YAFFS_ERROR_TESTING if(data) { *data ^= yaffs_WriteFailCorruption(chunkInNAND); } +#endif } static __u8 yaffs_ReadFailCorruption(int chunkInNAND) { switch(chunkInNAND) { +#if YAFFS_ERROR_TESTING case 500: return 3;// ding two bits case 700: case 750: return 1;// ding one bit +#endif default: return 0; } @@ -100,10 +120,12 @@ static __u8 yaffs_ReadFailCorruption(int chunkInNAND) static void yaffs_ModifyReadData(int chunkInNAND,__u8 *data) { +#if YAFFS_ERROR_TESTING if(data) { *data ^= yaffs_ReadFailCorruption(chunkInNAND); } +#endif } @@ -115,13 +137,18 @@ static void CheckInit(yaffs_Device *dev) static int initialised = 0; int length; + int nWritten; if(!initialised) { memset(ffChunk,0xFF,528); +//#ifdef YAFFS_DUMP +// h = open("yaffs-em-file" , O_RDONLY); +//#else h = open("yaffs-em-file" , O_RDWR | O_CREAT, S_IREAD | S_IWRITE); +//#endif if(h < 0) { perror("Fatal error opening yaffs emulation file"); @@ -130,27 +157,26 @@ static void CheckInit(yaffs_Device *dev) initialised = 1; length = lseek(h,0,SEEK_END); - if(length != FILE_SIZE_IN_BYTES) + nWritten = 528; + while(length < FILE_SIZE_IN_BYTES && nWritten == 528) { - // Create file contents - int i; - - printf("Creating emulation file...\n"); - for(i = 0; i < FILE_SIZE_IN_BLOCKS; i++) - { - yaffs_FEEraseBlockInNAND(dev,i); - - if(IsAMarkedBadBlock(i)) - { - yaffs_Spare spare; - memset(&spare,0xff,sizeof(spare)); - spare.blockStatus = 1; - - yaffs_FEWriteChunkToNAND(dev, i * 32,NULL,&spare); - } - } + write(h,ffChunk,528); + length = lseek(h,0,SEEK_END); } - eraseDisplayEnabled = 1; + if(nWritten != 528) + { + perror("Fatal error expanding yaffs emulation file"); + exit(1); + + } + + close(h); + +#ifdef YAFFS_DUMP + h = open("yaffs-em-file" , O_RDONLY); +#else + h = open("yaffs-em-file" , O_RDWR | O_CREAT, S_IREAD | S_IWRITE); +#endif } }