lark1fq/driver/sdcard/fatfs_drv.c

193 lines
4.2 KiB
C
Raw Permalink Normal View History

2024-03-16 22:28:04 +08:00
#include "diskio.h"
#include "sdio_sd.h"
#include "sdio_lowlevel.h"
static volatile DSTATUS Stat = STA_NOINIT; /* Disk status */
/**
* @brief Initialize Disk Drive
* @param drv : driver index
* @retval DSTATUS : operation status
*/
DSTATUS disk_initialize ( BYTE drv )
{
NVIC_InitTypeDef NVIC_InitStructure;
Stat = STA_NOINIT;
if (drv == 0)
{
NVIC_InitStructure.NVIC_IRQChannel = SDIO_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = SD_SDIO_DMA_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_Init(&NVIC_InitStructure);
if( SD_Init() == 0)
{
Stat &= ~STA_NOINIT;
}
}
return Stat;
}
/**
* @brief Get Disk Status
* @param drv : driver index
* @retval DSTATUS : operation status
*/
DSTATUS disk_status ( BYTE drv )
{
Stat = STA_NOINIT;
if ((drv == 0) && (SD_GetStatus() == 0))
{
Stat &= ~STA_NOINIT;
}
return Stat;
}
/**
* @brief Read Sector(s)
* @param drv : driver index
* @retval DSTATUS : operation status
*/
DRESULT disk_read (
BYTE drv, /* Physical drive number (0) */
BYTE *buff, /* Pointer to the data buffer to store read data */
DWORD sector, /* Start sector number (LBA) */
BYTE count /* Sector count (1..255) */
)
{
SD_Error sdstatus = SD_OK;
if (drv == 0)
{
SD_ReadMultiBlocks(buff, sector << 9, 512, count);
/* Check if the Transfer is finished */
sdstatus = SD_WaitReadOperation();
while(SD_GetStatus() != SD_TRANSFER_OK);
if (sdstatus == SD_OK)
{
return RES_OK;
}
}
return RES_ERROR;
}
/**
* @brief write Sector(s)
* @param drv : driver index
* @retval DSTATUS : operation status
*/
#if _READONLY == 0
DRESULT disk_write (
BYTE drv, /* Physical drive number (0) */
const BYTE *buff, /* Pointer to the data to be written */
DWORD sector, /* Start sector number (LBA) */
BYTE count /* Sector count (1..255) */
)
{
SD_Error sdstatus = SD_OK;
if (drv == 0)
{
SD_WriteMultiBlocks((BYTE *)buff, sector << 9, 512, count);
/* Check if the Transfer is finished */
sdstatus = SD_WaitWriteOperation();
while(SD_GetStatus() != SD_TRANSFER_OK);
if (sdstatus == SD_OK)
{
return RES_OK;
}
}
return RES_ERROR;
}
#endif /* _READONLY == 0 */
/**
* @brief I/O control operation
* @param drv : driver index
* @retval DSTATUS : operation status
*/
#if _USE_IOCTL != 0
DRESULT disk_ioctl (
BYTE drv, /* Physical drive number (0) */
BYTE ctrl, /* Control code */
void *buff /* Buffer to send/receive control data */
)
{
DRESULT res;
SD_CardInfo SDCardInfo;
if (drv) return RES_PARERR;
res = RES_ERROR;
if (Stat & STA_NOINIT) return RES_NOTRDY;
switch (ctrl) {
case CTRL_SYNC : /* Make sure that no pending write process */
res = RES_OK;
break;
case GET_SECTOR_COUNT : /* Get number of sectors on the disk (DWORD) */
if(drv == 0)
{
SD_GetCardInfo(&SDCardInfo);
*(DWORD*)buff = SDCardInfo.CardCapacity / 512;
}
res = RES_OK;
break;
case GET_SECTOR_SIZE : /* Get R/W sector size (WORD) */
*(WORD*)buff = 512;
res = RES_OK;
break;
case GET_BLOCK_SIZE : /* Get erase block size in unit of sector (DWORD) */
if(drv == 0)
*(DWORD*)buff = 512;
else
*(DWORD*)buff = 32;
break;
default:
res = RES_PARERR;
}
return res;
}
#endif /* _USE_IOCTL != 0 */
/**
* @brief Get Time from RTC
* @param None
* @retval Time in DWORD
*/
DWORD get_fattime (void)
{
return 0;
}