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)
26 unsigned char page[PAGES_PER_BLOCK][PAGE_SIZE];
36 SimData *simDevs[N_RAM_SIM_DEVS];
38 static SimData *DevToSim(struct yaffs_dev *dev)
40 return (SimData*)(dev->driver_context);
44 static void CheckInitialised(void)
49 static int yramsim_erase_internal(SimData *sim, unsigned blockId,int force)
51 if(blockId < 0 || blockId >= sim->nBlocks){
55 if(!sim->blockList[blockId]){
59 if(!force && !sim->blockList[blockId]->blockOk){
63 memset(sim->blockList[blockId],0xff,sizeof(Block));
64 sim->blockList[blockId]->blockOk = 1;
72 static int yramsim_initialise(struct yaffs_dev *dev)
74 SimData *sim = DevToSim(dev);
75 Block **blockList = sim->blockList;
76 return blockList != NULL;
80 static int yramsim_deinitialise(struct yaffs_dev *dev)
85 static int yramsim_rd_chunk (struct yaffs_dev *dev, int pageId,
86 u8 *data, int dataLength,
87 u8 *spare, int spareLength,
88 enum yaffs_ecc_result *ecc_result)
90 SimData *sim = DevToSim(dev);
91 Block **blockList = sim->blockList;
93 unsigned blockId = pageId / PAGES_PER_BLOCK;
94 unsigned pageOffset = pageId % PAGES_PER_BLOCK;
98 if(blockId >= sim->nBlocks ||
99 pageOffset >= PAGES_PER_BLOCK ||
100 dataLength >DATA_SIZE ||
101 spareLength > SPARE_SIZE ||
102 !blockList[blockId]->blockOk){
106 d = blockList[blockId]->page[pageOffset];
110 memcpy(data,d,dataLength);
113 memcpy(spare,s,spareLength);
116 *ecc_result = YAFFS_ECC_RESULT_NO_ERROR;
121 static int yramsim_wr_chunk (struct yaffs_dev *dev, int pageId,
122 const u8 *data, int dataLength,
123 const u8 *spare, int spareLength)
125 SimData *sim = DevToSim(dev);
126 Block **blockList = sim->blockList;
128 unsigned blockId = pageId / PAGES_PER_BLOCK;
129 unsigned pageOffset = pageId % PAGES_PER_BLOCK;
135 if(blockId >= sim->nBlocks ||
136 pageOffset >= PAGES_PER_BLOCK ||
137 dataLength >DATA_SIZE ||
138 spareLength > SPARE_SIZE ||
139 !blockList[blockId]->blockOk){
143 d = blockList[blockId]->page[pageOffset];
147 memcpy(d,data,dataLength);
150 memcpy(s,spare,spareLength);
156 static int yramsim_erase(struct yaffs_dev *dev, int blockId)
158 SimData *sim = DevToSim(dev);
161 return yramsim_erase_internal(sim,blockId,0);
164 static int yramsim_check_block_bad(struct yaffs_dev *dev, int blockId)
166 SimData *sim = DevToSim(dev);
167 Block **blockList = sim->blockList;
168 if(blockId >= sim->nBlocks){
172 return blockList[blockId]->blockOk ? YAFFS_OK : YAFFS_FAIL;
175 static int yramsim_mark_block_bad(struct yaffs_dev *dev, int blockId)
177 SimData *sim = DevToSim(dev);
178 Block **blockList = sim->blockList;
179 if(blockId >= sim->nBlocks){
183 blockList[blockId]->blockOk = 0;
189 static SimData *yramsim_alloc_sim_data(u32 devId, u32 nBlocks)
198 if(devId >= N_RAM_SIM_DEVS)
201 sim = simDevs[devId];
206 sim = malloc(sizeof (SimData));
210 simDevs[devId] = sim;
212 blockList = malloc(nBlocks * sizeof(Block *));
214 sim->blockList = blockList;
215 sim->nBlocks = nBlocks;
221 for(i = 0; i < nBlocks; i++)
224 for(i = 0; i < nBlocks && ok; i++){
225 b= malloc(sizeof(Block));
228 yramsim_erase_internal(sim,i,1);
235 for(i = 0; i < nBlocks; i++)
250 struct yaffs_dev *yramsim_CreateRamSim(const YCHAR *name,
251 u32 devId, u32 nBlocks,
252 u32 start_block, u32 end_block)
255 struct yaffs_dev *dev;
256 struct yaffs_param *p;
257 struct yaffs_driver *d;
259 sim = yramsim_alloc_sim_data(devId, nBlocks);
261 dev = malloc(sizeof(*dev));
266 printf("Flash Sim creation failed. sim = %p, dev = %p\n",
271 memset(dev, 0, sizeof(*dev));
273 if(start_block >= sim->nBlocks)
275 if(end_block == 0 || end_block >= sim->nBlocks)
276 end_block = sim->nBlocks - 1;
279 p->name = strdup(name);
280 p->start_block = start_block;
281 p->end_block = end_block;
282 p->total_bytes_per_chunk = DATA_SIZE;
283 p->spare_bytes_per_chunk= SPARE_SIZE;
284 p->chunks_per_block = PAGES_PER_BLOCK;
285 p->n_reserved_blocks = 2;
291 d->drv_initialise_fn = yramsim_initialise;
292 d->drv_deinitialise_fn = yramsim_deinitialise;
293 d->drv_read_chunk_fn = yramsim_rd_chunk;
294 d->drv_write_chunk_fn = yramsim_wr_chunk;
295 d->drv_erase_fn = yramsim_erase;
296 d->drv_check_bad_fn = yramsim_check_block_bad;
297 d->drv_mark_bad_fn = yramsim_mark_block_bad;
299 dev->driver_context= (void *)sim;
301 printf("Created simulated flash device %p\n", dev);
305 struct yaffs_dev *yaffs_rtems_flashsim_setup(void)
307 return yramsim_CreateRamSim("ramsim",