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;
}
Example #3
0
//------------------------------------------------------------------------------
//! \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;
}
Example #4
0
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);
}