Mercurial > yaffs-ecoscentric
changeset 6:ffe653f3cb4f
*** empty log message ***
| author | charles |
|---|---|
| date | Mon, 22 Nov 2004 03:22:25 +0000 |
| parents | 8750ac5d976a |
| children | ddfefbbf40d3 |
| files | direct/Makefile direct/dtest.c direct/yaffs_fileem2k.c direct/yaffs_ramdisk.c direct/yaffscfg2k.c direct/yaffsfs.c yaffs_guts.c yaffs_packedtags.c yaffs_packedtags.h yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h yportenv.h |
| diffstat | 14 files changed, 205 insertions(+), 90 deletions(-) [+] |
line wrap: on
line diff
--- a/direct/Makefile +++ b/direct/Makefile @@ -17,13 +17,14 @@ CFLAGS = -Wall -DCONFIG_YAFFS_DIRECT #CFLAGS+= -Wmissing-prototypes -Wredundant-decls -Wnested-externs -Winline -DIRECTTESTOBJS = dtest.o yaffscfg2k.o yaffs_ecc.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o yaffs_packedtags.o yaffs_ramdisk.o yaffs_tagscompat.o +DIRECTTESTOBJS = dtest.o yaffscfg2k.o yaffs_ecc.o yaffs_fileem2k.o yaffsfs.o yaffs_guts.o yaffs_packedtags1.o yaffs_ramdisk.o yaffs_tagscompat.o yaffs_packedtags2.o BOOTTESTOBJS = bootldtst.o yboot.o yaffs_fileem.o nand_ecc.o -ALLOBJS = dtest.o nand_ecc.o yaffscfg.o yaffs_fileem.o yaffsfs.o yaffs_ramdisk.o bootldtst.o yboot.o +ALLOBJS = dtest.o nand_ecc.o yaffscfg.o yaffs_fileem.o yaffsfs.o yaffs_ramdisk.o bootldtst.o yboot.o yaffs_ramem2k.o -SYMLINKS = devextras.h yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffsinterface.h yportenv.h yaffs_tagscompat.c yaffs_tagscompat.h yaffs_packedtags.c yaffs_packedtags.h +SYMLINKS = devextras.h yaffs_ecc.c yaffs_ecc.h yaffs_guts.c yaffs_guts.h yaffsinterface.h yportenv.h yaffs_tagscompat.c yaffs_tagscompat.h \ + yaffs_packedtags1.c yaffs_packedtags1.h yaffs_packedtags2.c yaffs_packedtags2.h yaffs_ramem2k.c yaffs_nandemul2k.h #all: directtest2k boottest
--- a/direct/dtest.c +++ b/direct/dtest.c @@ -1318,12 +1318,12 @@ int main(int argc, char *argv[]) - scan_pattern_test("/boot",40000,10); + scan_pattern_test("/ram2k",40000,10); //short_scan_test("/flash",40000,200); return 0; - long_test_on_path("/flash"); - long_test_on_path("/flash"); + long_test_on_path("/ram2k"); + long_test_on_path("/ram2k"); // cache_bypass_bug_test();
--- a/direct/yaffs_fileem2k.c +++ b/direct/yaffs_fileem2k.c @@ -30,7 +30,7 @@ const char *yaffs_flashif_c_version = "$ #include <unistd.h> #include "yaffs_fileem2k.h" -#include "yaffs_packedtags.h" +#include "yaffs_packedtags2.h" @@ -141,8 +141,8 @@ int yflash_WriteChunkWithTagsToNAND(yaff } else { - yaffs_PackedTags pt; - yaffs_PackTags(&pt,tags); + yaffs_PackedTags2 pt; + yaffs_PackTags2(&pt,tags); written = write(filedisk.handle,&pt,sizeof(pt)); if(written != sizeof(pt)) return YAFFS_FAIL; @@ -158,7 +158,7 @@ int yflash_MarkNANDBlockBad(struct yaffs { int written; - yaffs_PackedTags pt; + yaffs_PackedTags2 pt; CheckInit(dev); @@ -222,9 +222,9 @@ int yflash_ReadChunkWithTagsFromNAND(yaf } else { - yaffs_PackedTags pt; + yaffs_PackedTags2 pt; nread= read(filedisk.handle,&pt,sizeof(pt)); - yaffs_UnpackTags(tags,&pt); + yaffs_UnpackTags2(tags,&pt); if(nread != sizeof(pt)) return YAFFS_FAIL; } }
--- a/direct/yaffs_ramdisk.c +++ b/direct/yaffs_ramdisk.c @@ -24,7 +24,7 @@ const char *yaffs_ramdisk_c_version = "$ #include "yaffs_ramdisk.h" #include "yaffs_guts.h" #include "devextras.h" -#include "yaffs_packedtags.h" +#include "yaffs_packedtags1.h" @@ -136,9 +136,9 @@ int yramdisk_WriteChunkWithTagsToNAND(ya if(tags) { - yaffs_PackedTags pt; + yaffs_PackedTags1 pt; - yaffs_PackTags(&pt,tags); + yaffs_PackTags1(&pt,tags); memcpy(&ramdisk.block[blk]->page[pg].data[512],&pt,sizeof(pt)); } @@ -167,10 +167,10 @@ int yramdisk_ReadChunkWithTagsFromNAND(y if(tags) { - yaffs_PackedTags pt; + yaffs_PackedTags1 pt; memcpy(&pt,&ramdisk.block[blk]->page[pg].data[512],sizeof(pt)); - yaffs_UnpackTags(tags,&pt); + yaffs_UnpackTags1(tags,&pt); }
--- a/direct/yaffscfg2k.c +++ b/direct/yaffscfg2k.c @@ -9,6 +9,7 @@ #include "yaffscfg.h" #include "yaffsfs.h" #include "yaffs_fileem2k.h" +#include "yaffs_nandemul2k.h" #include <errno.h> @@ -50,16 +51,19 @@ void yaffsfs_LocalInitialisation(void) #include "yaffs_ramdisk.h" #include "yaffs_flashif.h" +#include "yaffs_nandemul2k.h" static yaffs_Device ramDev; static yaffs_Device bootDev; static yaffs_Device flashDev; +static yaffs_Device ram2kDev; static yaffsfs_DeviceConfiguration yaffsfs_config[] = { { "/ram", &ramDev}, { "/boot", &bootDev}, { "/flash", &flashDev}, + { "/ram2k", &ram2kDev}, {(void *)0,(void *)0} }; @@ -127,6 +131,28 @@ int yaffs_StartUp(void) flashDev.markNANDBlockBad = yflash_MarkNANDBlockBad; flashDev.queryNANDBlock = yflash_QueryNANDBlock; + // /ram2k + // Set this puppy up to use + // the file emulation space as + // 2kpage/64chunk per block/128MB device + memset(&ram2kDev,0,sizeof(ram2kDev)); + + ram2kDev.nBytesPerChunk = nandemul2k_GetBytesPerChunk(); + ram2kDev.nChunksPerBlock = nandemul2k_GetChunksPerBlock(); + ram2kDev.nReservedBlocks = 5; + ram2kDev.startBlock = 1; // First block after /boot + //ram2kDev.endBlock = 127; // Last block in 16MB + ram2kDev.endBlock = nandemul2k_GetNumberOfBlocks() - 1; // Last block in 512MB + ram2kDev.isYaffs2 = 1; + ram2kDev.nShortOpCaches = 10; // Use caches + ram2kDev.genericDevice = (void *) 3; // Used to identify the device in fstat. + ram2kDev.writeChunkWithTagsToNAND = nandemul2k_WriteChunkWithTagsToNAND; + ram2kDev.readChunkWithTagsFromNAND = nandemul2k_ReadChunkWithTagsFromNAND; + ram2kDev.eraseBlockInNAND = nandemul2k_EraseBlockInNAND; + ram2kDev.initialiseNAND = nandemul2k_InitialiseNAND; + ram2kDev.markNANDBlockBad = nandemul2k_MarkNANDBlockBad; + ram2kDev.queryNANDBlock = nandemul2k_QueryNANDBlock; + yaffs_initialise(yaffsfs_config); return 0;
--- a/direct/yaffsfs.c +++ b/direct/yaffsfs.c @@ -180,7 +180,7 @@ static yaffs_Device *yaffsfs_FindDevice( p++; leftOver++; } - if(!*p) + if(!*p && (!*leftOver || *leftOver == '/')) { // Matched prefix *restOfPath = (char *)leftOver;
--- a/yaffs_guts.c +++ b/yaffs_guts.c @@ -201,7 +201,7 @@ int yaffs_EraseBlockInNAND(struct yaffs_ return result; } -int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) +static int yaffs_InitialiseNAND(struct yaffs_DeviceStruct *dev) { return dev->initialiseNAND(dev); } @@ -4524,6 +4524,8 @@ static int yaffs_Scan(yaffs_Device *dev) __u8 *chunkData; yaffs_BlockIndex *blockIndex = NULL; + + T(YAFFS_TRACE_SCAN,(TSTR("yaffs_Scan starts..." TENDSTR))); chunkData = yaffs_GetTempBuffer(dev,__LINE__); @@ -4947,6 +4949,9 @@ static int yaffs_Scan(yaffs_Device *dev) } yaffs_ReleaseTempBuffer(dev,chunkData,__LINE__); + + T(YAFFS_TRACE_SCAN,(TSTR("yaffs_Scan ends" TENDSTR))); + return YAFFS_OK; } @@ -5313,11 +5318,12 @@ int yaffs_GutsInitialise(yaffs_Device *d int extraBits; int nBlocks; + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: yaffs_GutsInitialise()" TENDSTR))); // Check stuff that must be set if(!dev) { - T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Need a device\n" TENDSTR))); + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: Need a device" TENDSTR))); return YAFFS_FAIL; } @@ -5332,10 +5338,16 @@ int yaffs_GutsInitialise(yaffs_Device *d dev->endBlock <= (dev->startBlock + dev->nReservedBlocks + 2) // otherwise it is too small ) { - T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: nand geometry problems\n" TENDSTR))); + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: NAND geometry problems: chunk size %d, type is yaffs%s " TENDSTR), + dev->nBytesPerChunk, dev->isYaffs2 ? "2" : "")); return YAFFS_FAIL; } + if(yaffs_InitialiseNAND(dev) != YAFFS_OK) + { + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: InitialiseNAND failed" TENDSTR))); + return YAFFS_FAIL; + } // Got the right mix of functions? // @@ -5442,7 +5454,6 @@ int yaffs_GutsInitialise(yaffs_Device *d - yaffs_InitialiseBlocks(dev,nBlocks); yaffs_InitialiseTnodes(dev); @@ -5502,7 +5513,7 @@ int yaffs_GutsInitialise(yaffs_Device *d dev->nRetiredBlocks = 0; - + T(YAFFS_TRACE_ALWAYS,(TSTR("yaffs: yaffs_GutsInitialise() done.\n" TENDSTR))); return YAFFS_OK; }
deleted file mode 100644 --- a/yaffs_packedtags.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "yaffs_packedtags.h" -#include "yportenv.h" - -void yaffs_PackTags(yaffs_PackedTags *pt, yaffs_ExtendedTags *t) -{ - pt->chunkId = t->chunkId; - pt->serialNumber = t->serialNumber; - pt->byteCount = t->byteCount; - pt->objectId = t->objectId; - pt->ecc = 0; - pt->deleted = (t->chunkDeleted) ? 0 : 1; - pt->unusedStuff = 0; - pt->shouldBeFF = 0xFFFFFFFF; - -} - -void yaffs_UnpackTags(yaffs_ExtendedTags *t, yaffs_PackedTags *pt) -{ - static const __u8 allFF[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff}; - - if(memcmp(allFF,pt,sizeof(yaffs_PackedTags))) - { - t->blockBad = 0; - if(pt->shouldBeFF != 0xFFFFFFFF) - { - t->blockBad = 1; - } - t->chunkUsed = 1; - t->objectId = pt->objectId; - t->chunkId = pt->chunkId; - t->byteCount = pt->byteCount; - t->eccResult = YAFFS_ECC_RESULT_NO_ERROR; - t->chunkDeleted = (pt->deleted) ? 0 : 1; - t->serialNumber = pt->serialNumber; - } - else - { - memset(t,0,sizeof(yaffs_ExtendedTags)); - - } -} -
deleted file mode 100644 --- a/yaffs_packedtags.h +++ /dev/null @@ -1,24 +0,0 @@ - -#ifndef __YAFFS_PACKEDTAGS_H__ -#define __YAFFS_PACKEDTAGS_H__ - -#include "yaffs_guts.h" - -typedef struct -{ - unsigned chunkId:20; - unsigned serialNumber:2; - unsigned byteCount:10; - unsigned objectId:18; - unsigned ecc:12; - unsigned deleted:1; - unsigned unusedStuff:1; - unsigned shouldBeFF; - -} yaffs_PackedTags; - -void yaffs_PackTags(yaffs_PackedTags *pt, yaffs_ExtendedTags *t); -void yaffs_UnpackTags(yaffs_ExtendedTags *t, yaffs_PackedTags *pt); -#endif - -
new file mode 100644 --- /dev/null +++ b/yaffs_packedtags1.c @@ -0,0 +1,42 @@ +#include "yaffs_packedtags1.h" +#include "yportenv.h" + +void yaffs_PackTags1(yaffs_PackedTags1 *pt, yaffs_ExtendedTags *t) +{ + pt->chunkId = t->chunkId; + pt->serialNumber = t->serialNumber; + pt->byteCount = t->byteCount; + pt->objectId = t->objectId; + pt->ecc = 0; + pt->deleted = (t->chunkDeleted) ? 0 : 1; + pt->unusedStuff = 0; + pt->shouldBeFF = 0xFFFFFFFF; + +} + +void yaffs_UnpackTags1(yaffs_ExtendedTags *t, yaffs_PackedTags1 *pt) +{ + static const __u8 allFF[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,0xff, 0xff, 0xff, 0xff}; + + if(memcmp(allFF,pt,sizeof(yaffs_PackedTags1))) + { + t->blockBad = 0; + if(pt->shouldBeFF != 0xFFFFFFFF) + { + t->blockBad = 1; + } + t->chunkUsed = 1; + t->objectId = pt->objectId; + t->chunkId = pt->chunkId; + t->byteCount = pt->byteCount; + t->eccResult = YAFFS_ECC_RESULT_NO_ERROR; + t->chunkDeleted = (pt->deleted) ? 0 : 1; + t->serialNumber = pt->serialNumber; + } + else + { + memset(t,0,sizeof(yaffs_ExtendedTags)); + + } +} +
new file mode 100644 --- /dev/null +++ b/yaffs_packedtags1.h @@ -0,0 +1,28 @@ +// This is used to pack YAFFS1 tags, not YAFFS2 tags. + +#ifndef __YAFFS_PACKEDTAGS1_H__ +#define __YAFFS_PACKEDTAGS1_H__ + + +#include "yaffs_guts.h" + +typedef struct +{ + unsigned chunkId:20; + unsigned serialNumber:2; + unsigned byteCount:10; + unsigned objectId:18; + unsigned ecc:12; + unsigned deleted:1; + unsigned unusedStuff:1; + unsigned shouldBeFF; + +} yaffs_PackedTags1; + + + +void yaffs_PackTags1(yaffs_PackedTags1 *pt, yaffs_ExtendedTags *t); +void yaffs_UnpackTags1(yaffs_ExtendedTags *t, yaffs_PackedTags1 *pt); +#endif + +
new file mode 100644 --- /dev/null +++ b/yaffs_packedtags2.c @@ -0,0 +1,42 @@ +#include "yaffs_packedtags2.h" +#include "yportenv.h" + + + +void yaffs_PackTags2(yaffs_PackedTags2 *pt, yaffs_ExtendedTags *t) +{ + pt->t.chunkId = t->chunkId; + pt->t.sequenceNumber = t->sequenceNumber; + pt->t.byteCount = t->byteCount; + pt->t.objectId = t->objectId; + + yaffs_ECCCalculateOther((unsigned char *)&pt->t,sizeof(yaffs_PackedTags2TagsPart),&pt->ecc); + +} + +void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt) +{ + + + if(pt->t.sequenceNumber == 0xFFFFFFFF) + { + memset(t,0,sizeof(yaffs_ExtendedTags)); + + } + else + { + // Page is in use + yaffs_ECCOther ecc; + yaffs_ECCCalculateOther((unsigned char *)&pt->t,sizeof(yaffs_PackedTags2TagsPart),&ecc); + t->eccResult = yaffs_ECCCorrectOther((unsigned char *)&pt->t,sizeof(yaffs_PackedTags2TagsPart),&pt->ecc,&ecc); + t->blockBad = 0; + t->chunkUsed = 1; + t->objectId = pt->t.objectId; + t->chunkId = pt->t.chunkId; + t->byteCount = pt->t.byteCount; + t->chunkDeleted = 0; + t->serialNumber = 0; + t->sequenceNumber = pt->t.sequenceNumber; + } +} +
new file mode 100644 --- /dev/null +++ b/yaffs_packedtags2.h @@ -0,0 +1,31 @@ +// This is used to pack YAFFS2 tags, not YAFFS1tags. + +#ifndef __YAFFS_PACKEDTAGS2_H__ +#define __YAFFS_PACKEDTAGS2_H__ + + +#include "yaffs_guts.h" +#include "yaffs_ecc.h" + +typedef struct +{ + unsigned sequenceNumber; + unsigned chunkId; + unsigned objectId; + unsigned byteCount; + unsigned nandTagsEcc; + +} yaffs_PackedTags2TagsPart; + +typedef struct +{ + yaffs_PackedTags2TagsPart t; + yaffs_ECCOther ecc; +} yaffs_PackedTags2; + + +void yaffs_PackTags2(yaffs_PackedTags2 *pt, yaffs_ExtendedTags *t); +void yaffs_UnpackTags2(yaffs_ExtendedTags *t, yaffs_PackedTags2 *pt); +#endif + +
