@@ -160,6 +160,26 @@ void ff_memfree(void *p)
160
160
}
161
161
162
162
// Implementation of diskio functions (see ChaN/diskio.h)
163
+ static WORD disk_get_sector_size (BYTE pdrv)
164
+ {
165
+ WORD ssize = _ffs[pdrv]->get_erase_size ();
166
+ if (ssize < 512 ) {
167
+ ssize = 512 ;
168
+ }
169
+
170
+ MBED_ASSERT (ssize >= _MIN_SS && ssize <= _MAX_SS);
171
+ MBED_ASSERT (_ffs[pdrv]->get_read_size () <= _ffs[pdrv]->get_erase_size ());
172
+ MBED_ASSERT (_ffs[pdrv]->get_program_size () <= _ffs[pdrv]->get_erase_size ());
173
+ return ssize;
174
+ }
175
+
176
+ static DWORD disk_get_sector_count (BYTE pdrv)
177
+ {
178
+ DWORD scount = _ffs[pdrv]->size () / disk_get_sector_size (pdrv);
179
+ MBED_ASSERT (scount >= 64 );
180
+ return scount;
181
+ }
182
+
163
183
DSTATUS disk_status (BYTE pdrv)
164
184
{
165
185
debug_if (FFS_DBG, " disk_status on pdrv [%d]\n " , pdrv);
@@ -175,15 +195,15 @@ DSTATUS disk_initialize(BYTE pdrv)
175
195
DRESULT disk_read (BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
176
196
{
177
197
debug_if (FFS_DBG, " disk_read(sector %d, count %d) on pdrv [%d]\n " , sector, count, pdrv);
178
- bd_size_t ssize = _ffs[pdrv]-> get_erase_size ( );
198
+ DWORD ssize = disk_get_sector_size (pdrv );
179
199
int err = _ffs[pdrv]->read (buff, sector*ssize, count*ssize);
180
200
return err ? RES_PARERR : RES_OK;
181
201
}
182
202
183
203
DRESULT disk_write (BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
184
204
{
185
205
debug_if (FFS_DBG, " disk_write(sector %d, count %d) on pdrv [%d]\n " , sector, count, pdrv);
186
- bd_size_t ssize = _ffs[pdrv]-> get_erase_size ( );
206
+ DWORD ssize = disk_get_sector_size (pdrv );
187
207
int err = _ffs[pdrv]->erase (sector*ssize, count*ssize);
188
208
if (err) {
189
209
return RES_PARERR;
@@ -211,16 +231,14 @@ DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
211
231
if (_ffs[pdrv] == NULL ) {
212
232
return RES_NOTRDY;
213
233
} else {
214
- DWORD count = _ffs[pdrv]->size () / _ffs[pdrv]->get_erase_size ();
215
- *((DWORD*)buff) = count;
234
+ *((DWORD*)buff) = disk_get_sector_count (pdrv);
216
235
return RES_OK;
217
236
}
218
237
case GET_SECTOR_SIZE:
219
238
if (_ffs[pdrv] == NULL ) {
220
239
return RES_NOTRDY;
221
240
} else {
222
- WORD size = _ffs[pdrv]->get_erase_size ();
223
- *((WORD*)buff) = size;
241
+ *((WORD*)buff) = disk_get_sector_size (pdrv);
224
242
return RES_OK;
225
243
}
226
244
case GET_BLOCK_SIZE:
@@ -295,7 +313,7 @@ int FATFileSystem::unmount()
295
313
296
314
/* See http://elm-chan.org/fsw/ff/en/mkfs.html for details of f_mkfs() and
297
315
* associated arguments. */
298
- int FATFileSystem::format (BlockDevice *bd, int allocation_unit ) {
316
+ int FATFileSystem::format (BlockDevice *bd, bd_size_t cluster_size ) {
299
317
FATFileSystem fs;
300
318
int err = fs.mount (bd, false );
301
319
if (err) {
@@ -304,7 +322,7 @@ int FATFileSystem::format(BlockDevice *bd, int allocation_unit) {
304
322
305
323
// Logical drive number, Partitioning rule, Allocation unit size (bytes per cluster)
306
324
fs.lock ();
307
- FRESULT res = f_mkfs (fs._fsid , 1 , allocation_unit );
325
+ FRESULT res = f_mkfs (fs._fsid , 1 , cluster_size );
308
326
fs.unlock ();
309
327
if (res != FR_OK) {
310
328
return fat_error_remap (res);
0 commit comments