mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 11:21:23 +00:00
sdmmc v2: Move address alignment check in driver
This commit is contained in:
parent
eac6426125
commit
10e7e06048
4 changed files with 52 additions and 40 deletions
|
@ -46,16 +46,7 @@ DRESULT disk_read (
|
||||||
UINT count /* Number of sectors to read */
|
UINT count /* Number of sectors to read */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
return sdmmc_storage_read(&sd_storage, sector, count, buff) ? RES_OK : RES_ERROR;
|
||||||
if (((u32)buff >= DRAM_START) && !((u32)buff % 8))
|
|
||||||
return sdmmc_storage_read(&sd_storage, sector, count, buff) ? RES_OK : RES_ERROR;
|
|
||||||
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
|
||||||
if (sdmmc_storage_read(&sd_storage, sector, count, buf))
|
|
||||||
{
|
|
||||||
memcpy(buff, buf, 512 * count);
|
|
||||||
return RES_OK;
|
|
||||||
}
|
|
||||||
return RES_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -68,14 +59,7 @@ DRESULT disk_write (
|
||||||
UINT count /* Number of sectors to write */
|
UINT count /* Number of sectors to write */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
return sdmmc_storage_write(&sd_storage, sector, count, (void *)buff) ? RES_OK : RES_ERROR;
|
||||||
if (((u32)buff >= DRAM_START) && !((u32)buff % 8))
|
|
||||||
return sdmmc_storage_write(&sd_storage, sector, count, (void *)buff) ? RES_OK : RES_ERROR;
|
|
||||||
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
|
||||||
memcpy(buf, buff, 512 * count);
|
|
||||||
if (sdmmc_storage_write(&sd_storage, sector, count, buf))
|
|
||||||
return RES_OK;
|
|
||||||
return RES_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -202,12 +202,34 @@ DPRINTF("readwrite: %08X\n", blkcnt);
|
||||||
|
|
||||||
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
||||||
|
if (((u32)buf >= DRAM_START) && !((u32)buf % 8))
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
||||||
|
|
||||||
|
if (num_sectors > (SDMMC_UP_BUF_SZ / 512))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8 *tmp_buf = (u8 *)SDMMC_UPPER_BUFFER;
|
||||||
|
if (_sdmmc_storage_readwrite(storage, sector, num_sectors, tmp_buf, 0))
|
||||||
|
{
|
||||||
|
memcpy(buf, tmp_buf, 512 * num_sectors);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
||||||
|
if (((u32)buf >= DRAM_START) && !((u32)buf % 8))
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
||||||
|
|
||||||
|
if (num_sectors > (SDMMC_UP_BUF_SZ / 512))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8 *tmp_buf = (u8 *)SDMMC_UPPER_BUFFER;
|
||||||
|
memcpy(tmp_buf, buf, 512 * num_sectors);
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, tmp_buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -44,16 +44,7 @@ DRESULT disk_read (
|
||||||
UINT count /* Number of sectors to read */
|
UINT count /* Number of sectors to read */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
return sdmmc_storage_read(&sd_storage, sector, count, buff) ? RES_OK : RES_ERROR;
|
||||||
if (((u32)buff >= DRAM_START) && !((u32)buff % 8))
|
|
||||||
return sdmmc_storage_read(&sd_storage, sector, count, buff) ? RES_OK : RES_ERROR;
|
|
||||||
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
|
||||||
if (sdmmc_storage_read(&sd_storage, sector, count, buf))
|
|
||||||
{
|
|
||||||
memcpy(buff, buf, 512 * count);
|
|
||||||
return RES_OK;
|
|
||||||
}
|
|
||||||
return RES_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -66,14 +57,7 @@ DRESULT disk_write (
|
||||||
UINT count /* Number of sectors to write */
|
UINT count /* Number of sectors to write */
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
return sdmmc_storage_write(&sd_storage, sector, count, (void *)buff) ? RES_OK : RES_ERROR;
|
||||||
if (((u32)buff >= DRAM_START) && !((u32)buff % 8))
|
|
||||||
return sdmmc_storage_write(&sd_storage, sector, count, (void *)buff) ? RES_OK : RES_ERROR;
|
|
||||||
u8 *buf = (u8 *)SDMMC_UPPER_BUFFER;
|
|
||||||
memcpy(buf, buff, 512 * count);
|
|
||||||
if (sdmmc_storage_write(&sd_storage, sector, count, buf))
|
|
||||||
return RES_OK;
|
|
||||||
return RES_ERROR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
|
|
@ -202,12 +202,34 @@ DPRINTF("readwrite: %08X\n", blkcnt);
|
||||||
|
|
||||||
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_read(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
||||||
|
if (((u32)buf >= DRAM_START) && !((u32)buf % 8))
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 0);
|
||||||
|
|
||||||
|
if (num_sectors > (SDMMC_UP_BUF_SZ / 512))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8 *tmp_buf = (u8 *)SDMMC_UPPER_BUFFER;
|
||||||
|
if (_sdmmc_storage_readwrite(storage, sector, num_sectors, tmp_buf, 0))
|
||||||
|
{
|
||||||
|
memcpy(buf, tmp_buf, 512 * num_sectors);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
int sdmmc_storage_write(sdmmc_storage_t *storage, u32 sector, u32 num_sectors, void *buf)
|
||||||
{
|
{
|
||||||
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
// Ensure that buffer resides in DRAM and it's DMA aligned.
|
||||||
|
if (((u32)buf >= DRAM_START) && !((u32)buf % 8))
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, buf, 1);
|
||||||
|
|
||||||
|
if (num_sectors > (SDMMC_UP_BUF_SZ / 512))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
u8 *tmp_buf = (u8 *)SDMMC_UPPER_BUFFER;
|
||||||
|
memcpy(tmp_buf, buf, 512 * num_sectors);
|
||||||
|
return _sdmmc_storage_readwrite(storage, sector, num_sectors, tmp_buf, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue