DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to read (1..128) */ ) { switch (pdrv) { case PD_FLASH: for (int i = 0; i < count; i++) { if (!storage_read_block(buff + i * FLASH_BLOCK_SIZE, sector + i)) { return RES_ERROR; } } return RES_OK; #if MICROPY_HW_HAS_SDCARD case PD_SDCARD: if (!sdcard_read_blocks(buff, sector, count)) { return RES_ERROR; } return RES_OK; #endif } return RES_PARERR; }
mp_uint_t storage_read_blocks(uint8_t *dest, uint32_t block_num, uint32_t num_blocks) { for (size_t i = 0; i < num_blocks; i++) { if (!storage_read_block(dest + i * FLASH_BLOCK_SIZE, block_num + i)) { return 1; // error } } return 0; // success }
DRESULT disk_read ( BYTE pdrv, /* Physical drive nmuber (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ UINT count /* Number of sectors to read (1..128) */ ) { switch (pdrv) { case PD_FLASH: for (int i = 0; i < count; i++) { if (!storage_read_block(buff + i * FLASH_BLOCK_SIZE, sector + i)) { return RES_ERROR; } } return RES_OK; #if MICROPY_HW_HAS_SDCARD case PD_SDCARD: if (sdcard_read_blocks(buff, sector, count) != 0) { return RES_ERROR; } return RES_OK; #endif case PD_USER: if (MP_STATE_PORT(fs_user_mount) == NULL) { // nothing mounted return RES_ERROR; } MP_STATE_PORT(fs_user_mount)->readblocks[2] = MP_OBJ_NEW_SMALL_INT(sector); MP_STATE_PORT(fs_user_mount)->readblocks[3] = mp_obj_new_bytearray_by_ref(count * 512, buff); mp_call_method_n_kw(2, 0, MP_STATE_PORT(fs_user_mount)->readblocks); return RES_OK; } return RES_PARERR; }