struct yaffs_dev *yflash2_install_drv(const char *name) { struct yaffs_dev *dev = NULL; struct yaffs_param *param; struct yaffs_driver *drv; dev = malloc(sizeof(*dev)); if(!dev) return NULL; memset(dev, 0, sizeof(*dev)); dev->param.name = strdup(name); if(!dev->param.name) { free(dev); return NULL; } drv = &dev->drv; drv->drv_write_chunk_fn = yflash2_WriteChunk; drv->drv_read_chunk_fn = yflash2_ReadChunk; drv->drv_erase_fn = yflash2_EraseBlock; drv->drv_mark_bad_fn = yflash2_MarkBad; drv->drv_check_bad_fn = yflash2_CheckBad; drv->drv_initialise_fn = yflash2_Initialise; param = &dev->param; param->total_bytes_per_chunk = 2048; param->chunks_per_block = 64; param->start_block = 0; param->end_block = yflash2_GetNumberOfBlocks()-1; param->is_yaffs2 = 1; param->use_nand_ecc=1; param->n_reserved_blocks = 5; param->wide_tnodes_disabled=0; param->refresh_period = 1000; param->n_caches = 10; // Use caches param->enable_xattr = 1; /* dev->driver_context is not used by this simulator */ yaffs_add_device(dev); return dev; }
int yaffs_StartUp(void) { // Stuff to configure YAFFS // Stuff to initialise anything special (eg lock semaphore). yaffsfs_LocalInitialisation(); // Set up devices // /ram1 ram, yaffs1 memset(&ram1Dev,0,sizeof(ram1Dev)); ram1Dev.param.totalBytesPerChunk = 512; ram1Dev.param.nChunksPerBlock = 32; ram1Dev.param.nReservedBlocks = 2; // Set this smaller for RAM ram1Dev.param.startBlock = 0; // Can use block 0 ram1Dev.param.endBlock = 127; // Last block in 2MB. //ram1Dev.param.useNANDECC = 1; ram1Dev.param.nShortOpCaches = 0; // Disable caching on this device. ram1Dev.context = (void *) 0; // Used to identify the device in fstat. ram1Dev.param.writeChunkWithTagsToNAND = yramdisk_WriteChunkWithTagsToNAND; ram1Dev.param.readChunkWithTagsFromNAND = yramdisk_ReadChunkWithTagsFromNAND; ram1Dev.param.eraseBlockInNAND = yramdisk_EraseBlockInNAND; ram1Dev.param.initialiseNAND = yramdisk_InitialiseNAND; // /M18-1 yaffs1 on M18 nor sim memset(&m18_1Dev,0,sizeof(m18_1Dev)); m18_1Dev.param.totalBytesPerChunk = 1024; m18_1Dev.param.nChunksPerBlock =248; m18_1Dev.param.nReservedBlocks = 2; m18_1Dev.param.startBlock = 0; // Can use block 0 m18_1Dev.param.endBlock = 31; // Last block m18_1Dev.param.useNANDECC = 0; // use YAFFS's ECC m18_1Dev.param.nShortOpCaches = 10; // Use caches m18_1Dev.context = (void *) 1; // Used to identify the device in fstat. m18_1Dev.param.writeChunkToNAND = ynorif1_WriteChunkToNAND; m18_1Dev.param.readChunkFromNAND = ynorif1_ReadChunkFromNAND; m18_1Dev.param.eraseBlockInNAND = ynorif1_EraseBlockInNAND; m18_1Dev.param.initialiseNAND = ynorif1_InitialiseNAND; m18_1Dev.param.deinitialiseNAND = ynorif1_DeinitialiseNAND; // /yaffs2 // Set this puppy up to use // the file emulation space as // 2kpage/64chunk per block // memset(&flashDev,0,sizeof(flashDev)); flashDev.param.totalBytesPerChunk = 2048; flashDev.param.nChunksPerBlock = 64; flashDev.param.nReservedBlocks = 5; flashDev.param.inbandTags = 0; flashDev.param.startBlock = 0; flashDev.param.endBlock = yflash2_GetNumberOfBlocks()-1; flashDev.param.isYaffs2 = 1; flashDev.param.useNANDECC=1; flashDev.param.wideTnodesDisabled=0; flashDev.param.refreshPeriod = 10000; flashDev.param.nShortOpCaches = 10; // Use caches flashDev.context = (void *) 2; // Used to identify the device in fstat. flashDev.param.writeChunkWithTagsToNAND = yflash2_WriteChunkWithTagsToNAND; flashDev.param.readChunkWithTagsFromNAND = yflash2_ReadChunkWithTagsFromNAND; flashDev.param.eraseBlockInNAND = yflash2_EraseBlockInNAND; flashDev.param.initialiseNAND = yflash2_InitialiseNAND; flashDev.param.markNANDBlockBad = yflash2_MarkNANDBlockBad; flashDev.param.queryNANDBlock = yflash2_QueryNANDBlock; yaffs_initialise(yaffsfs_config); return 0; }