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