unsigned long mmc_bread(int dev_num, unsigned long start, unsigned blkcnt, void *dst) { unsigned cur, blocks_todo = blkcnt; struct mmc *mmc = find_mmc_device(dev_num); if (blkcnt == 0) return 0; if (!mmc) return 0; if ((start + blkcnt) > mmc->lba) { mmcdbg("MMC: block number 0x%x exceeds max(0x%x)\n", start + blkcnt, mmc->lba); return 0; } if (mmc_set_blocklen(mmc, mmc->read_bl_len)) return 0; do { cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo; if(mmc_read_blocks(mmc, dst, start, cur) != cur) return 0; blocks_todo -= cur; start += cur; // dst += cur * mmc->read_bl_len; dst = (char*)dst + cur * mmc->read_bl_len; } while (blocks_todo > 0); return blkcnt; }
/* Read data from a file on the mmc device */ static int mmc_block_read(io_entity_t *entity, uintptr_t buffer, size_t length, size_t *length_read) { *length_read = mmc_read_blocks(seek_offset / MMC_BLOCK_SIZE, buffer, length); if (*length_read != length) { return -EIO; } return 0; }
unsigned long mmc_bread(int dev_num, unsigned long start, unsigned blkcnt, void *dst) { unsigned cur, blocks_todo = blkcnt; struct mmc *mmc = find_mmc_device(dev_num); if (blkcnt == 0){ mmcinfo("mmc %d blkcnt should not be 0\n",mmc->control_num); return 0; } if (!mmc){ mmcinfo("Can not find mmc dev %d\n",dev_num); return 0; } if ((start + blkcnt) > mmc->lba) { mmcinfo("mmc %d: block number 0x%x exceeds max(0x%x)\n",mmc->control_num, start + blkcnt, mmc->lba); return 0; } if (mmc_set_blocklen(mmc, mmc->read_bl_len)){ mmcinfo("mmc %d Set block len failed\n",mmc->control_num); return 0; } do { cur = (blocks_todo > mmc->b_max) ? mmc->b_max : blocks_todo; if(mmc_read_blocks(mmc, dst, start, cur) != cur){ mmcinfo("mmc %d block read failed\n",mmc->control_num); return 0; } blocks_todo -= cur; start += cur; // dst += cur * mmc->read_bl_len; dst = (char*)dst + cur * mmc->read_bl_len; } while (blocks_todo > 0); return blkcnt; }