2 * Modified verion of yramsim.c.
4 #include "yaffs-rtems-flashsim.h"
7 #include "../../yaffs_guts.h"
11 #define N_RAM_SIM_DEVS 1
13 #define DATA_SIZE 2048
15 #define PAGE_SIZE (DATA_SIZE + SPARE_SIZE)
16 #define PAGES_PER_BLOCK 64
22 #define dout(...) do { } while(0)
28 uint32_t stats_writes;
29 uint32_t stats_erases;
32 unsigned char page[PAGES_PER_BLOCK][PAGE_SIZE];
42 SimData *simDevs[N_RAM_SIM_DEVS];
44 static SimData *DevToSim(struct yaffs_dev *dev)
46 return (SimData*)(dev->driver_context);
50 static void CheckInitialised(void)
55 static int yramsim_erase_internal(SimData *sim, unsigned blockId,int force)
57 if(blockId < 0 || blockId >= sim->nBlocks){
61 if(!sim->blockList[blockId]){
65 if(!force && !sim->blockList[blockId]->blockOk){
69 memset(sim->blockList[blockId],0xff,sizeof(Block));
70 sim->blockList[blockId]->blockOk = 1;
78 static int yramsim_initialise(struct yaffs_dev *dev)
80 SimData *sim = DevToSim(dev);
81 Block **blockList = sim->blockList;
82 return blockList != NULL;
86 static int yramsim_deinitialise(struct yaffs_dev *dev)
91 static int yramsim_rd_chunk (struct yaffs_dev *dev, int pageId,
92 u8 *data, int dataLength,
93 u8 *spare, int spareLength,
94 enum yaffs_ecc_result *ecc_result)
96 SimData *sim = DevToSim(dev);
97 Block **blockList = sim->blockList;
99 unsigned blockId = pageId / PAGES_PER_BLOCK;
100 unsigned pageOffset = pageId % PAGES_PER_BLOCK;
106 if(blockId >= sim->nBlocks ||
107 pageOffset >= PAGES_PER_BLOCK ||
108 dataLength >DATA_SIZE ||
109 spareLength > SPARE_SIZE ||
110 !blockList[blockId]->blockOk){
114 d = blockList[blockId]->page[pageOffset];
118 memcpy(data,d,dataLength);
121 memcpy(spare,s,spareLength);
124 *ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
129 static int yramsim_wr_chunk (struct yaffs_dev *dev, int pageId,
130 const u8 *data, int dataLength,
131 const u8 *spare, int spareLength)
133 SimData *sim = DevToSim(dev);
134 Block **blockList = sim->blockList;
136 unsigned blockId = pageId / PAGES_PER_BLOCK;
137 unsigned pageOffset = pageId % PAGES_PER_BLOCK;
145 if(blockId >= sim->nBlocks ||
146 pageOffset >= PAGES_PER_BLOCK ||
147 dataLength >DATA_SIZE ||
148 spareLength > SPARE_SIZE ||
149 !blockList[blockId]->blockOk){
153 d = blockList[blockId]->page[pageOffset];
157 memcpy(d,data,dataLength);
160 memcpy(s,spare,spareLength);
166 static int yramsim_erase(struct yaffs_dev *dev, int blockId)
168 SimData *sim = DevToSim(dev);
173 return yramsim_erase_internal(sim,blockId,0);
176 static int yramsim_check_block_bad(struct yaffs_dev *dev, int blockId)
178 SimData *sim = DevToSim(dev);
179 Block **blockList = sim->blockList;
180 if(blockId >= sim->nBlocks){
184 return blockList[blockId]->blockOk ? YAFFS_OK : YAFFS_FAIL;
187 static int yramsim_mark_block_bad(struct yaffs_dev *dev, int blockId)
189 SimData *sim = DevToSim(dev);
190 Block **blockList = sim->blockList;
191 if(blockId >= sim->nBlocks){
195 blockList[blockId]->blockOk = 0;
201 static SimData *yramsim_alloc_sim_data(u32 devId, u32 nBlocks)
210 if(devId >= N_RAM_SIM_DEVS)
213 sim = simDevs[devId];
218 sim = malloc(sizeof (SimData));
222 simDevs[devId] = sim;
224 blockList = malloc(nBlocks * sizeof(Block *));
226 sim->blockList = blockList;
227 sim->nBlocks = nBlocks;
233 for(i = 0; i < nBlocks; i++)
236 for(i = 0; i < nBlocks && ok; i++){
237 b= malloc(sizeof(Block));
240 yramsim_erase_internal(sim,i,1);
247 for(i = 0; i < nBlocks; i++)
262 struct yaffs_dev *yramsim_CreateRamSim(const YCHAR *name,
263 u32 devId, u32 nBlocks,
264 u32 start_block, u32 end_block)
267 struct yaffs_dev *dev;
268 struct yaffs_param *p;
269 struct yaffs_driver *d;
271 sim = yramsim_alloc_sim_data(devId, nBlocks);
273 dev = malloc(sizeof(*dev));
278 printf("Flash Sim creation failed. sim = %p, dev = %p\n",
283 memset(dev, 0, sizeof(*dev));
285 if(start_block >= sim->nBlocks)
287 if(end_block == 0 || end_block >= sim->nBlocks)
288 end_block = sim->nBlocks - 1;
291 p->name = strdup(name);
292 p->start_block = start_block;
293 p->end_block = end_block;
294 p->total_bytes_per_chunk = DATA_SIZE;
295 p->spare_bytes_per_chunk= SPARE_SIZE;
296 p->chunks_per_block = PAGES_PER_BLOCK;
297 p->n_reserved_blocks = 2;
303 d->drv_initialise_fn = yramsim_initialise;
304 d->drv_deinitialise_fn = yramsim_deinitialise;
305 d->drv_read_chunk_fn = yramsim_rd_chunk;
306 d->drv_write_chunk_fn = yramsim_wr_chunk;
307 d->drv_erase_fn = yramsim_erase;
308 d->drv_check_bad_fn = yramsim_check_block_bad;
309 d->drv_mark_bad_fn = yramsim_mark_block_bad;
311 dev->driver_context= (void *)sim;
313 printf("Created simulated flash device %p\n", dev);
317 struct yaffs_dev *yaffs_rtems_flashsim_setup(void)
319 return yramsim_CreateRamSim("ramsim",
325 void yaffs_rtems_flashsim_dump_status(void)
327 printf("\nFlashsim stats\n");
328 printf("reads.....%d\n", stats_reads);
329 printf("writes....%d\n", stats_writes);
330 printf("erases....%d\n", stats_erases);