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; }
static mp_obj_t sd_read(mp_obj_t self, mp_obj_t block_num) { uint8_t *dest = m_new(uint8_t, SDCARD_BLOCK_SIZE); if (!sdcard_read_blocks(dest, mp_obj_get_int(block_num), 1)) { m_free(dest, SDCARD_BLOCK_SIZE); return mp_const_none; } return mp_obj_new_bytearray_by_ref(SDCARD_BLOCK_SIZE, dest); }
STATIC mp_obj_t sd_read(mp_obj_t self, mp_obj_t block_num) { uint8_t *dest = m_new(uint8_t, SDCARD_BLOCK_SIZE); mp_uint_t ret = sdcard_read_blocks(dest, mp_obj_get_int(block_num), 1); if (ret != 0) { m_del(uint8_t, dest, SDCARD_BLOCK_SIZE); nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_Exception, "sdcard_read_blocks failed [%u]", ret)); } return mp_obj_new_bytearray_by_ref(SDCARD_BLOCK_SIZE, dest); }
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; }
STATIC mp_obj_t pyb_sdcard_readblocks(mp_obj_t self, mp_obj_t block_num, mp_obj_t buf) { mp_buffer_info_t bufinfo; mp_get_buffer_raise(buf, &bufinfo, MP_BUFFER_WRITE); mp_uint_t ret = sdcard_read_blocks(bufinfo.buf, mp_obj_get_int(block_num), bufinfo.len / SDCARD_BLOCK_SIZE); return mp_obj_new_bool(ret == 0); }
/** * @brief Read data from the medium * @param lun : logical unit number * @param buf : Pointer to the buffer to save data * @param blk_addr : address of 1st block to be read * @param blk_len : nmber of blocks to be read * @retval Status */ int8_t SDCARD_STORAGE_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len) { if (!sdcard_read_blocks(buf, blk_addr, blk_len)) { return -1; } return 0; }