]> cloudbase.mooo.com Git - z180-stamp.git/blame - fatfs/doc/res/app4.c
Merge branch 'chan-fatfs' into fatfs-integration
[z180-stamp.git] / fatfs / doc / res / app4.c
CommitLineData
53668523
L
1/*----------------------------------------------------------------------/\r
2/ Low level disk I/O module function checker\r
3/-----------------------------------------------------------------------/\r
4/ WARNING: The data on the target drive will be lost!\r
5*/\r
6\r
7#include <stdio.h>\r
8#include <string.h>\r
9#include "ff.h"\r
10#include "diskio.h"\r
11\r
12\r
13static\r
14DWORD pn (\r
15 DWORD pns\r
16)\r
17{\r
18 static DWORD lfsr;\r
19 UINT n;\r
20\r
21\r
22 if (pns) {\r
23 lfsr = pns;\r
24 for (n = 0; n < 32; n++) pn(0);\r
25 }\r
26 if (lfsr & 1) {\r
27 lfsr >>= 1;\r
28 lfsr ^= 0x80200003;\r
29 } else {\r
30 lfsr >>= 1;\r
31 }\r
32 return lfsr;\r
33}\r
34\r
35\r
36int test_diskio (\r
37 BYTE pdrv, /* Physical drive number to be checked (all data on the drive will be lost) */\r
38 UINT ncyc, /* Number of test cycles */\r
39 DWORD* buff, /* Pointer to the working buffer */\r
40 UINT sz_buff /* Size of the working buffer in unit of byte */\r
41)\r
42{\r
43 UINT n, cc, ns;\r
44 DWORD sz_drv, lba, lba2, pns = 1;\r
45 WORD sz_sect, sz_eblk;\r
46 BYTE *pbuff = (BYTE*)buff;\r
47 DSTATUS ds;\r
48 DRESULT dr;\r
49\r
50\r
53668523
L
51 printf("test_diskio(%u, %u, 0x%08X, 0x%08X)\n", pdrv, ncyc, (UINT)buff, sz_buff);\r
52\r
53 if (sz_buff < _MAX_SS + 4) {\r
54 printf("Insufficient work area to test.\n");\r
55 return 1;\r
56 }\r
57\r
58 for (cc = 1; cc <= ncyc; cc++) {\r
59 printf("**** Test cycle %u of %u start ****\n", cc, ncyc);\r
60\r
61 /* Initialization */\r
62 printf(" disk_initalize(%u)", pdrv);\r
63 ds = disk_initialize(pdrv);\r
64 if (ds & STA_NOINIT) {\r
65 printf(" - failed.\n");\r
66 return 2;\r
67 } else {\r
68 printf(" - ok.\n");\r
69 }\r
70\r
71 /* Get drive size */\r
72 printf("**** Get drive size ****\n");\r
73 printf(" disk_ioctl(%u, GET_SECTOR_COUNT, 0x%08X)", pdrv, (UINT)&sz_drv);\r
74 sz_drv = 0;\r
75 dr = disk_ioctl(pdrv, GET_SECTOR_COUNT, &sz_drv);\r
76 if (dr == RES_OK) {\r
77 printf(" - ok.\n");\r
78 } else {\r
79 printf(" - failed.\n");\r
80 return 3;\r
81 }\r
82 if (sz_drv < 128) {\r
83 printf("Failed: Insufficient drive size to test.\n");\r
84 return 4;\r
85 }\r
86 printf(" Number of sectors on the drive %u is %lu.\n", pdrv, sz_drv);\r
87\r
88#if _MAX_SS != _MIN_SS\r
89 /* Get sector size */\r
90 printf("**** Get sector size ****\n");\r
91 printf(" disk_ioctl(%u, GET_SECTOR_SIZE, 0x%X)", pdrv, (UINT)&sz_sect);\r
92 sz_sect = 0;\r
93 dr = disk_ioctl(pdrv, GET_SECTOR_SIZE, &sz_sect);\r
94 if (dr == RES_OK) {\r
95 printf(" - ok.\n");\r
96 } else {\r
97 printf(" - failed.\n");\r
98 return 5;\r
99 }\r
100 printf(" Size of sector is %u bytes.\n", sz_sect);\r
101#else\r
102 sz_sect = _MAX_SS;\r
103#endif\r
104\r
105 /* Get erase block size */\r
106 printf("**** Get block size ****\n");\r
107 printf(" disk_ioctl(%u, GET_BLOCK_SIZE, 0x%X)", pdrv, (UINT)&sz_eblk);\r
108 sz_eblk = 0;\r
109 dr = disk_ioctl(pdrv, GET_BLOCK_SIZE, &sz_eblk);\r
110 if (dr == RES_OK) {\r
111 printf(" - ok.\n");\r
112 } else {\r
113 printf(" - failed.\n");\r
114 }\r
115 if (dr == RES_OK || sz_eblk >= 2) {\r
116 printf(" Size of the erase block is %u sectors.\n", sz_eblk);\r
117 } else {\r
118 printf(" Size of the erase block is unknown.\n");\r
119 }\r
120\r
121 /* Single sector write test */\r
122 printf("**** Single sector write test 1 ****\n");\r
123 lba = 0;\r
124 for (n = 0, pn(pns); n < sz_sect; n++) pbuff[n] = (BYTE)pn(0);\r
125 printf(" disk_write(%u, 0x%X, %lu, 1)", pdrv, (UINT)pbuff, lba);\r
126 dr = disk_write(pdrv, pbuff, lba, 1);\r
127 if (dr == RES_OK) {\r
128 printf(" - ok.\n");\r
129 } else {\r
130 printf(" - failed.\n");\r
131 return 6;\r
132 }\r
133 printf(" disk_ioctl(%u, CTRL_SYNC, NULL)", pdrv);\r
134 dr = disk_ioctl(pdrv, CTRL_SYNC, 0);\r
135 if (dr == RES_OK) {\r
136 printf(" - ok.\n");\r
137 } else {\r
138 printf(" - failed.\n");\r
139 return 7;\r
140 }\r
141 memset(pbuff, 0, sz_sect);\r
142 printf(" disk_read(%u, 0x%X, %lu, 1)", pdrv, (UINT)pbuff, lba);\r
143 dr = disk_read(pdrv, pbuff, lba, 1);\r
144 if (dr == RES_OK) {\r
145 printf(" - ok.\n");\r
146 } else {\r
147 printf(" - failed.\n");\r
148 return 8;\r
149 }\r
150 for (n = 0, pn(pns); n < sz_sect && pbuff[n] == (BYTE)pn(0); n++) ;\r
151 if (n == sz_sect) {\r
152 printf(" Data matched.\n");\r
153 } else {\r
154 printf("Failed: Read data differs from the data written.\n");\r
155 return 10;\r
156 }\r
157 pns++;\r
158\r
159 /* Multiple sector write test */\r
160 printf("**** Multiple sector write test ****\n");\r
161 lba = 1; ns = sz_buff / sz_sect;\r
162 if (ns > 4) ns = 4;\r
163 for (n = 0, pn(pns); n < (UINT)(sz_sect * ns); n++) pbuff[n] = (BYTE)pn(0);\r
164 printf(" disk_write(%u, 0x%X, %lu, %u)", pdrv, (UINT)pbuff, lba, ns);\r
165 dr = disk_write(pdrv, pbuff, lba, ns);\r
166 if (dr == RES_OK) {\r
167 printf(" - ok.\n");\r
168 } else {\r
169 printf(" - failed.\n");\r
170 return 11;\r
171 }\r
172 printf(" disk_ioctl(%u, CTRL_SYNC, NULL)", pdrv);\r
173 dr = disk_ioctl(pdrv, CTRL_SYNC, 0);\r
174 if (dr == RES_OK) {\r
175 printf(" - ok.\n");\r
176 } else {\r
177 printf(" - failed.\n");\r
178 return 12;\r
179 }\r
180 memset(pbuff, 0, sz_sect * ns);\r
181 printf(" disk_read(%u, 0x%X, %lu, %u)", pdrv, (UINT)pbuff, lba, ns);\r
182 dr = disk_read(pdrv, pbuff, lba, ns);\r
183 if (dr == RES_OK) {\r
184 printf(" - ok.\n");\r
185 } else {\r
186 printf(" - failed.\n");\r
187 return 13;\r
188 }\r
189 for (n = 0, pn(pns); n < (UINT)(sz_sect * ns) && pbuff[n] == (BYTE)pn(0); n++) ;\r
190 if (n == (UINT)(sz_sect * ns)) {\r
191 printf(" Data matched.\n");\r
192 } else {\r
193 printf("Failed: Read data differs from the data written.\n");\r
194 return 14;\r
195 }\r
196 pns++;\r
197\r
198 /* Single sector write test (misaligned memory address) */\r
199 printf("**** Single sector write test 2 ****\n");\r
200 lba = 5;\r
201 for (n = 0, pn(pns); n < sz_sect; n++) pbuff[n+3] = (BYTE)pn(0);\r
202 printf(" disk_write(%u, 0x%X, %lu, 1)", pdrv, (UINT)(pbuff+3), lba);\r
203 dr = disk_write(pdrv, pbuff+3, lba, 1);\r
204 if (dr == RES_OK) {\r
205 printf(" - ok.\n");\r
206 } else {\r
207 printf(" - failed.\n");\r
208 return 15;\r
209 }\r
210 printf(" disk_ioctl(%u, CTRL_SYNC, NULL)", pdrv);\r
211 dr = disk_ioctl(pdrv, CTRL_SYNC, 0);\r
212 if (dr == RES_OK) {\r
213 printf(" - ok.\n");\r
214 } else {\r
215 printf(" - failed.\n");\r
216 return 16;\r
217 }\r
218 memset(pbuff+5, 0, sz_sect);\r
219 printf(" disk_read(%u, 0x%X, %lu, 1)", pdrv, (UINT)(pbuff+5), lba);\r
220 dr = disk_read(pdrv, pbuff+5, lba, 1);\r
221 if (dr == RES_OK) {\r
222 printf(" - ok.\n");\r
223 } else {\r
224 printf(" - failed.\n");\r
225 return 17;\r
226 }\r
227 for (n = 0, pn(pns); n < sz_sect && pbuff[n+5] == (BYTE)pn(0); n++) ;\r
228 if (n == sz_sect) {\r
229 printf(" Data matched.\n");\r
230 } else {\r
231 printf("Failed: Read data differs from the data written.\n");\r
232 return 18;\r
233 }\r
234 pns++;\r
235\r
236 /* 4GB barrier test */\r
237 printf("**** 4GB barrier test ****\n");\r
238 if (sz_drv >= 128 + 0x80000000 / (sz_sect / 2)) {\r
239 lba = 6; lba2 = lba + 0x80000000 / (sz_sect / 2);\r
240 for (n = 0, pn(pns); n < (UINT)(sz_sect * 2); n++) pbuff[n] = (BYTE)pn(0);\r
241 printf(" disk_write(%u, 0x%X, %lu, 1)", pdrv, (UINT)pbuff, lba);\r
242 dr = disk_write(pdrv, pbuff, lba, 1);\r
243 if (dr == RES_OK) {\r
244 printf(" - ok.\n");\r
245 } else {\r
246 printf(" - failed.\n");\r
247 return 19;\r
248 }\r
249 printf(" disk_write(%u, 0x%X, %lu, 1)", pdrv, (UINT)(pbuff+sz_sect), lba2);\r
250 dr = disk_write(pdrv, pbuff+sz_sect, lba2, 1);\r
251 if (dr == RES_OK) {\r
252 printf(" - ok.\n");\r
253 } else {\r
254 printf(" - failed.\n");\r
255 return 20;\r
256 }\r
257 printf(" disk_ioctl(%u, CTRL_SYNC, NULL)", pdrv);\r
258 dr = disk_ioctl(pdrv, CTRL_SYNC, 0);\r
259 if (dr == RES_OK) {\r
260 printf(" - ok.\n");\r
261 } else {\r
262 printf(" - failed.\n");\r
263 return 21;\r
264 }\r
265 memset(pbuff, 0, sz_sect * 2);\r
266 printf(" disk_read(%u, 0x%X, %lu, 1)", pdrv, (UINT)pbuff, lba);\r
267 dr = disk_read(pdrv, pbuff, lba, 1);\r
268 if (dr == RES_OK) {\r
269 printf(" - ok.\n");\r
270 } else {\r
271 printf(" - failed.\n");\r
272 return 22;\r
273 }\r
274 printf(" disk_read(%u, 0x%X, %lu, 1)", pdrv, (UINT)(pbuff+sz_sect), lba2);\r
275 dr = disk_read(pdrv, pbuff+sz_sect, lba2, 1);\r
276 if (dr == RES_OK) {\r
277 printf(" - ok.\n");\r
278 } else {\r
279 printf(" - failed.\n");\r
280 return 23;\r
281 }\r
282 for (n = 0, pn(pns); pbuff[n] == (BYTE)pn(0) && n < (UINT)(sz_sect * 2); n++) ;\r
283 if (n == (UINT)(sz_sect * 2)) {\r
284 printf(" Data matched.\n");\r
285 } else {\r
286 printf("Failed: Read data differs from the data written.\n");\r
287 return 24;\r
288 }\r
289 } else {\r
290 printf(" Test skipped.\n");\r
291 }\r
292 pns++;\r
293\r
294 printf("**** Test cycle %u of %u completed ****\n\n", cc, ncyc);\r
295 }\r
296\r
297 return 0;\r
298}\r
299\r
300\r
301\r
302int main (int argc, char* argv[])\r
303{\r
304 int rc;\r
305 DWORD buff[512]; /* 2048 byte working buffer */\r
306\r
307 /* Check function/compatibility of the physical drive #0 */\r
70702af1
L
308 rc = test_diskio(0, 3, buff, sizeof buff);\r
309 if (rc) {\r
310 printf("Sorry the function/compatibility test failed. (rc=%d)\nFatFs will not work on this disk driver.\n", rc);\r
53668523 311 } else {\r
70702af1 312 printf("Congratulations! The disk driver works well.\n");\r
53668523
L
313 }\r
314\r
315 return rc;\r
316}\r
317\r