DRESULT disk_read(BYTE pdrv, BYTE *buff, DWORD sector, UINT count) { debug_if(FFS_DBG, "disk_read(sector %d, count %d) on pdrv [%d]\n", sector, count, pdrv); DWORD ssize = disk_get_sector_size(pdrv); int err = _ffs[pdrv]->read(buff, sector*ssize, count*ssize); return err ? RES_PARERR : RES_OK; }
DRESULT disk_ioctl(BYTE pdrv, BYTE cmd, void *buff) { debug_if(FFS_DBG, "disk_ioctl(%d)\n", cmd); switch (cmd) { case CTRL_SYNC: if (_ffs[pdrv] == NULL) { return RES_NOTRDY; } else { return RES_OK; } case GET_SECTOR_COUNT: if (_ffs[pdrv] == NULL) { return RES_NOTRDY; } else { *((DWORD*)buff) = disk_get_sector_count(pdrv); return RES_OK; } case GET_SECTOR_SIZE: if (_ffs[pdrv] == NULL) { return RES_NOTRDY; } else { *((WORD*)buff) = disk_get_sector_size(pdrv); return RES_OK; } case GET_BLOCK_SIZE: *((DWORD*)buff) = 1; // default when not known return RES_OK; case CTRL_TRIM: if (_ffs[pdrv] == NULL) { return RES_NOTRDY; } else { DWORD *sectors = (DWORD*)buff; DWORD ssize = disk_get_sector_size(pdrv); bd_addr_t addr = (bd_addr_t)sectors[0]*ssize; bd_size_t size = (bd_size_t)(sectors[1]-sectors[0]+1)*ssize; int err = _ffs[pdrv]->trim(addr, size); return err ? RES_PARERR : RES_OK; } } return RES_PARERR; }
DRESULT disk_write(BYTE pdrv, const BYTE *buff, DWORD sector, UINT count) { debug_if(FFS_DBG, "disk_write(sector %d, count %d) on pdrv [%d]\n", sector, count, pdrv); DWORD ssize = disk_get_sector_size(pdrv); int err = _ffs[pdrv]->erase(sector*ssize, count*ssize); if (err) { return RES_PARERR; } err = _ffs[pdrv]->program(buff, sector*ssize, count*ssize); if (err) { return RES_PARERR; } return RES_OK; }
static DWORD disk_get_sector_count(BYTE pdrv) { DWORD scount = _ffs[pdrv]->size() / disk_get_sector_size(pdrv); MBED_ASSERT(scount >= 64); return scount; }