DRESULT disk_read ( BYTE drv, /* Physical drive number (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector address (LBA) */ BYTE count /* Number of sectors to read (1..255) */ ) { unsigned char result; DRESULT res = RES_ERROR; unsigned int addr, len; if (medias[drv].blockSize < SECTOR_SIZE_DEFAULT) { addr = sector * (SECTOR_SIZE_DEFAULT / medias[drv].blockSize); len = count * (SECTOR_SIZE_DEFAULT / medias[drv].blockSize); } else { addr = sector; len = count; } result = MED_Read(&medias[drv], addr, (void*)buff, len, NULL, NULL); if( result == MED_STATUS_SUCCESS ) { res = RES_OK; } else { TRACE_ERROR("MED_Read pb: 0x%X\n\r", result); res = RES_ERROR; } return res; }
DRESULT disk_read ( BYTE drv, /* Physical drive number (0..) */ BYTE *buff, /* Data buffer to store read data */ DWORD sector, /* Sector number (LBA) */ BYTE count /* Sector count (1..255) */ ) { unsigned char result; DRESULT res = RES_ERROR; unsigned sectorSize = 0; if (drv == DRV_SDRAM) { sectorSize = SECTOR_SIZE_SDRAM; } else if(drv == DRV_MMC) { sectorSize = SECTOR_SIZE_SDCARD; } result = MED_Read(&medias[drv], medias[drv].baseAddress + (sector * sectorSize), // address (void*)buff, // data count * sectorSize, // data size NULL, NULL); if( result == MED_STATUS_SUCCESS ) { res = RES_OK; } else { TRACE_ERROR("MED_Read pb: 0x%X\n\r", result); res = RES_ERROR; } return res; }
//------------------------------------------------------------------------------ //! \brief Reads data from a LUN, starting at the specified block address. //! \param pLUN Pointer to a MSDLun instance //! \param blockAddress First block address to read //! \param data Pointer to a data buffer in which to store the data //! \param length Number of blocks to read //! \param callback Optional callback to invoke when the read finishes //! \return Operation result code //------------------------------------------------------------------------------ unsigned char LUN_Read(MSDLun *lun, unsigned int blockAddress, void *data, unsigned int length, TransferCallback callback, void *argument) { unsigned int address; unsigned char status; // Check that the data is not too big if ((length * lun->blockSize) > (lun->size - lun->blockSize * blockAddress)) { TRACE_WARNING("LUN_Read: Data too big\n\r"); status = USBD_STATUS_ABORTED; } else { TRACE_INFO_WP("LUNRead(%u) ", blockAddress); // Compute read start address address = lun->media->baseAddress + lun->baseAddress + blockAddress * lun->blockSize; // Start write operation status = MED_Read(lun->media, address, data, length * lun->blockSize, (MediaCallback) callback, argument); // Check result code if (status == MED_STATUS_SUCCESS) { status = USBD_STATUS_SUCCESS; } else { TRACE_WARNING("LUN_Read: Cannot read media\n\r"); status = USBD_STATUS_ABORTED; } } return status; }
esint8 if_readBuf(hwInterface* file,euint32 address,euint8* buf) { unsigned int result; euint32 addr, len; translate_media(file->pMedia, address, &addr, &len); result = MED_Read(file->pMedia, addr, (void*)buf, len, NULL, NULL); if( result != MED_STATUS_SUCCESS ) { TRACE_INFO("MED_Read pb: 0x%X\n\r", result); } return(0); }