annotate yaffs_ramem.c @ 7:ddfefbbf40d3

*** empty log message ***
author charles
date Fri, 17 Dec 2004 04:39:04 +0000
parents
children 510637d0d0d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
1 /*
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
2 * YAFFS: Yet another FFS. A NAND-flash specific file system.
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
3 * yaffs_ramem.c NAND emulation on top of a chunk of RAM
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
4 *
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
5 * Copyright (C) 2002 Aleph One Ltd.
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
6 * for Toby Churchill Ltd and Brightstar Engineering
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
7 *
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
8 * Created by Charles Manning <charles@aleph1.co.uk>
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
9 *
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
10 * This program is free software; you can redistribute it and/or modify
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
11 * it under the terms of the GNU General Public License version 2 as
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
12 * published by the Free Software Foundation.
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
13 *
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
14 */
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
15 //yaffs_ramem.c
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
16 // Since this creates the RAM block at start up it is pretty useless for testing the scanner.
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
17
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
18 const char *yaffs_ramem_c_version = "$Id$";
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
19
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
20 #ifndef __KERNEL__
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
21 #define CONFIG_YAFFS_RAM_ENABLED
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
22 #endif
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
23
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
24 #ifdef CONFIG_YAFFS_RAM_ENABLED
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
25
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
26 #include "yportenv.h"
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
27
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
28 #include "yaffs_nandemul.h"
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
29 #include "yaffs_guts.h"
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
30 #include "yaffsinterface.h"
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
31 #include "devextras.h"
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
32
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
33
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
34 #define EM_SIZE_IN_MEG 2
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
35
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
36 #define BLOCK_SIZE (32 * 528)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
37 #define BLOCKS_PER_MEG ((1024*1024)/(32 * 512))
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
38 #define FILE_SIZE_IN_BLOCKS (FILE_SIZE_IN_MEG * BLOCKS_PER_MEG)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
39 #define FILE_SIZE_IN_BYTES (FILE_SIZE_IN_BLOCKS * BLOCK_SIZE)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
40
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
41
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
42
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
43 #define DEFAULT_SIZE_IN_MB 2
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
44
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
45 typedef struct
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
46 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
47 __u8 data[528]; // Data + spare
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
48 int count[3]; // The programming count for each area of
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
49 // the page (0..255,256..511,512..527
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
50 int empty; // is this empty?
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
51 } nandemul_Page;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
52
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
53 typedef struct
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
54 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
55 nandemul_Page page[32]; // The pages in the block
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
56 __u8 damaged; // Is the block damaged?
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
57
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
58 } nandemul_Block;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
59
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
60
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
61
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
62 typedef struct
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
63 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
64 nandemul_Block **block;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
65 int nBlocks;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
66 } nandemul_Device;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
67
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
68 static nandemul_Device ned;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
69
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
70 static int sizeInMB = DEFAULT_SIZE_IN_MB;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
71
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
72
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
73 static void nandemul_yield(int n)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
74 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
75 #ifdef __KERNEL__
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
76 if(n > 0) schedule_timeout(n);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
77 #endif
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
78
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
79 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
80
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
81
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
82 static void nandemul_ReallyEraseBlock(int blockNumber)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
83 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
84 int i;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
85
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
86 nandemul_Block *theBlock = ned.block[blockNumber];
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
87
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
88 for(i = 0; i < 32; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
89 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
90 memset(theBlock->page[i].data,0xff,528);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
91 theBlock->page[i].count[0] = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
92 theBlock->page[i].count[1] = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
93 theBlock->page[i].count[2] = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
94 theBlock->page[i].empty = 1;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
95 nandemul_yield(2);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
96 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
97
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
98 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
99
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
100
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
101 int nandemul_CalcNBlocks(void)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
102 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
103 switch(sizeInMB)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
104 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
105 case 8:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
106 case 16:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
107 case 32:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
108 case 64:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
109 case 128:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
110 case 256:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
111 case 512:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
112 break;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
113 default:
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
114 sizeInMB = DEFAULT_SIZE_IN_MB;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
115 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
116 return sizeInMB * 64;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
117 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
118
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
119
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
120
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
121 static int CheckInit(void)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
122 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
123 static int initialised = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
124
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
125 int i;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
126 int fail = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
127 int nBlocks;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
128 int nAllocated = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
129
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
130 if(initialised)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
131 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
132 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
133 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
134
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
135
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
136 nBlocks = nandemul_CalcNBlocks();
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
137
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
138 ned.block = YMALLOC(sizeof(nandemul_Block *) * nBlocks);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
139
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
140 if(!ned.block) return 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
141
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
142 for(i=0; i <nBlocks; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
143 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
144 ned.block[i] = NULL;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
145 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
146
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
147 for(i=0; i <nBlocks && !fail; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
148 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
149 if((ned.block[i] = YMALLOC(sizeof(nandemul_Block))) == 0)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
150 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
151 fail = 1;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
152 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
153 else
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
154 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
155 nandemul_ReallyEraseBlock(i);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
156 ned.block[i]->damaged = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
157 nAllocated++;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
158 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
159 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
160
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
161 if(fail)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
162 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
163 for(i = 0; i < nAllocated; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
164 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
165 YFREE(ned.block[i]);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
166 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
167 YFREE(ned.block);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
168
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
169 T(YAFFS_TRACE_ALWAYS,("Allocation failed, could only allocate %dMB of %dMB requested.\n",
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
170 nAllocated/64,sizeInMB));
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
171 return 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
172 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
173
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
174 ned.nBlocks = nBlocks;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
175
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
176 initialised = 1;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
177
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
178 return 1;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
179 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
180
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
181 int nandemul_WriteChunkToNAND(yaffs_Device *dev,int chunkInNAND,const __u8 *data, yaffs_Spare *spare)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
182 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
183 int blk;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
184 int pg;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
185 int i;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
186
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
187 __u8 *x;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
188
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
189 __u8 *spareAsBytes = (__u8 *)spare;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
190
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
191
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
192 CheckInit();
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
193
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
194 blk = chunkInNAND/32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
195 pg = chunkInNAND%32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
196
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
197
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
198 if(data)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
199 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
200 x = ned.block[blk]->page[pg].data;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
201
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
202 for(i = 0; i < 512; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
203 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
204 x[i] &=data[i];
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
205 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
206
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
207 ned.block[blk]->page[pg].count[0]++;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
208 ned.block[blk]->page[pg].count[1]++;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
209 ned.block[blk]->page[pg].empty = 0;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
210 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
211
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
212
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
213 if(spare)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
214 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
215 x = &ned.block[blk]->page[pg].data[512];
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
216
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
217 for(i = 0; i < 16; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
218 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
219 x[i] &=spareAsBytes[i];
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
220 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
221 ned.block[blk]->page[pg].count[2]++;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
222 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
223
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
224 if(spare || data)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
225 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
226 nandemul_yield(1);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
227 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
228
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
229 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
230 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
231
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
232
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
233 int nandemul_ReadChunkFromNAND(yaffs_Device *dev,int chunkInNAND, __u8 *data, yaffs_Spare *spare)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
234 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
235 int blk;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
236 int pg;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
237
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
238
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
239 CheckInit();
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
240
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
241 blk = chunkInNAND/32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
242 pg = chunkInNAND%32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
243
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
244
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
245 if(data)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
246 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
247 memcpy(data,ned.block[blk]->page[pg].data,512);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
248 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
249
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
250
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
251 if(spare)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
252 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
253 memcpy(spare,&ned.block[blk]->page[pg].data[512],16);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
254 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
255
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
256 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
257 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
258
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
259
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
260 int nandemul_CheckChunkErased(yaffs_Device *dev,int chunkInNAND)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
261 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
262 int blk;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
263 int pg;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
264 int i;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
265
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
266
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
267 CheckInit();
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
268
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
269 blk = chunkInNAND/32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
270 pg = chunkInNAND%32;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
271
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
272
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
273 for(i = 0; i < 528; i++)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
274 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
275 if(ned.block[blk]->page[pg].data[i] != 0xFF)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
276 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
277 return YAFFS_FAIL;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
278 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
279 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
280
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
281 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
282
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
283 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
284
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
285 int nandemul_EraseBlockInNAND(yaffs_Device *dev, int blockNumber)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
286 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
287
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
288 CheckInit();
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
289
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
290 if(blockNumber < 0 || blockNumber >= ned.nBlocks)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
291 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
292 T(YAFFS_TRACE_ALWAYS,("Attempt to erase non-existant block %d\n",blockNumber));
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
293 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
294 else if(ned.block[blockNumber]->damaged)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
295 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
296 T(YAFFS_TRACE_ALWAYS,("Attempt to erase damaged block %d\n",blockNumber));
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
297 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
298 else
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
299 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
300 nandemul_ReallyEraseBlock(blockNumber);
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
301 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
302
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
303 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
304 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
305
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
306 int nandemul_InitialiseNAND(yaffs_Device *dev)
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
307 {
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
308 return YAFFS_OK;
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
309 }
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
310
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
311 #endif //YAFFS_RAM_ENABLED
ddfefbbf40d3 *** empty log message ***
charles
parents:
diff changeset
312