Skip to content

Commit f927996

Browse files
committed
fatfs: Added lower bound to block sizes
Some block devices (for example I2C EEPROM) can be erased at the byte level. These aren't really block devices, but fall under the block device API. For these devices, the fat filesystem needs to use a lower bound on the block size. In this case we used 512 bytes is used since it is already a standard.
1 parent 2305a8c commit f927996

File tree

1 file changed

+19
-6
lines changed

1 file changed

+19
-6
lines changed

features/filesystem/fat/FATFileSystem.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,21 @@ void ff_memfree(void *p)
160160
}
161161

162162
// 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+
return ssize;
171+
}
172+
173+
static DWORD disk_get_sector_count(BYTE pdrv)
174+
{
175+
return _ffs[pdrv]->size() / disk_get_sector_size(pdrv);
176+
}
177+
163178
DSTATUS disk_status(BYTE pdrv)
164179
{
165180
debug_if(FFS_DBG, "disk_status on pdrv [%d]\n", pdrv);
@@ -175,15 +190,15 @@ DSTATUS disk_initialize(BYTE pdrv)
175190
DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count)
176191
{
177192
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();
193+
DWORD ssize = disk_get_sector_size(pdrv);
179194
int err = _ffs[pdrv]->read(buff, sector*ssize, count*ssize);
180195
return err ? RES_PARERR : RES_OK;
181196
}
182197

183198
DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count)
184199
{
185200
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();
201+
DWORD ssize = disk_get_sector_size(pdrv);
187202
int err = _ffs[pdrv]->erase(sector*ssize, count*ssize);
188203
if (err) {
189204
return RES_PARERR;
@@ -211,16 +226,14 @@ DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff)
211226
if (_ffs[pdrv] == NULL) {
212227
return RES_NOTRDY;
213228
} else {
214-
DWORD count = _ffs[pdrv]->size() / _ffs[pdrv]->get_erase_size();
215-
*((DWORD*)buff) = count;
229+
*((DWORD*)buff) = disk_get_sector_count(pdrv);
216230
return RES_OK;
217231
}
218232
case GET_SECTOR_SIZE:
219233
if (_ffs[pdrv] == NULL) {
220234
return RES_NOTRDY;
221235
} else {
222-
WORD size = _ffs[pdrv]->get_erase_size();
223-
*((WORD*)buff) = size;
236+
*((WORD*)buff) = disk_get_sector_size(pdrv);
224237
return RES_OK;
225238
}
226239
case GET_BLOCK_SIZE:

0 commit comments

Comments
 (0)