初始版本

This commit is contained in:
2026-05-14 18:22:49 +08:00
parent 788329d50e
commit d04067afda
92 changed files with 30817 additions and 0 deletions
+204
View File
@@ -0,0 +1,204 @@
#include "bsp.h"
#include "sd_diskio.h"
#define SDIOC_SD_UINT SDIOC_UNIT
#define SDIOC_SD_CLK (PWC_FCG1_SDIOC1)
/* Local pre-processor symbols/macros ('#define') */
/* Block size is 512 bytes */
#define SD_DEFAULT_BLOCK_SIZE (512U)
/* SD read/write timeout time */
#define SD_RW_TIMEOUT_TIME (30000UL)
/* Local variable definitions ('static') */
static volatile DSTATUS SdStat = (DSTATUS)STA_NOINIT;
/**
* @brief Get SD card insert status.
* @param None
* @retval An en_flag_status_t enumeration value:
* - Set: SD card inserted
* - Reset: No SD card insert
*/
//static en_flag_status_t SDCard_GetInsertStatus(void)
//{
//// en_flag_status_t enFlagSta = Set;
//// /* Check SD card detect pin */
//// if (0U != BSP_IO_ReadPortPin(EIO_PORT0, EIO_SDIC1_CD))
//// {
//// enFlagSta = Reset;
//// }
//// return enFlagSta;
// return Set;
//}
/**
* @brief SD card configuration.
* @param None
* @retval An en_result_t enumeration value:
* - Ok: Configuration success
* - Error: Configuration failed
*/
static en_result_t SDCard_Config(void)
{
return SdioInit();
}
/**
* @brief Get SD card state.
* @param None
* @retval An en_result_t enumeration value:
* - Ok: Data transfer is acting
* - Error: No data transfer is acting
*/
static en_result_t SDCard_GetCardTransState(void)
{
en_result_t enRet;
en_sd_card_state_t enCardState;
enRet = SD_GetCardState(&stcSdhandle, &enCardState);
if (Ok == enRet) {
if (SD_CARD_STAT_TRANS == enCardState) {
enRet = Ok;
}
}
return enRet;
}
/**
* @brief Check the SD card status.
* @param lun: Not used
* @retval DSTATUS: Operation status
*/
static DSTATUS SD_CheckStatus(BYTE lun)
{
SdStat = (DSTATUS)STA_NOINIT;
en_result_t enRet;
enRet = SDCard_GetCardTransState();
if (Ok == enRet) {
SdStat &= (DSTATUS)(~(DSTATUS)STA_NOINIT);
}
return SdStat;
}
/**
* @brief Gets Disk Status
* @param lun: Not used
* @retval DSTATUS: Operation status
*/
DSTATUS SD_Status(BYTE lun)
{
return SD_CheckStatus(lun);
}
/**
* @brief Initializes a Drive
* @param lun: Not used
* @retval DSTATUS: Operation status
*/
DSTATUS SD_Initialize(BYTE lun)
{
SdStat = (DSTATUS)STA_NOINIT;
if (Ok == SDCard_Config()) {
SdStat = SD_CheckStatus(lun);
}
return SdStat;
}
/**
* @brief Reads Sector(s)
* @param lun: Not used
* @param buff: Pointer to data buffer used to store read data
* @param sector: Sector address (LBA)
* @param count: Number of sectors to read (1..128)
* @retval DRESULT: Operation result
*/
DRESULT SD_Read(BYTE lun, BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
if (Ok == SDCARD_ReadBlocks(&stcSdhandle, (uint32_t)sector, (uint16_t)count, (uint8_t *)buff, SD_RW_TIMEOUT_TIME)) {
/* Wait until the read operation is finished */
while (Ok != SDCard_GetCardTransState()){
}
res = RES_OK;
}
return res;
}
/**
* @brief Writes Sector(s)
* @param lun: Not used
* @param buff: Pointer to data to be written
* @param sector: Sector address (LBA)
* @param count: Number of sectors to write (1..128)
* @retval DRESULT: Operation result
*/
DRESULT SD_Write(BYTE lun, const BYTE *buff, DWORD sector, UINT count)
{
DRESULT res = RES_ERROR;
if (Ok == SDCARD_WriteBlocks(&stcSdhandle, (uint32_t)sector, (uint16_t)count, (uint8_t *)buff, SD_RW_TIMEOUT_TIME)) {
/* Wait until the Write operation is finished */
while (Ok != SDCard_GetCardTransState()) {
}
res = RES_OK;
}
return res;
}
/**
* @brief I/O control operation
* @param lun: Not used
* @param cmd: Control code
* @param buff: Pointer to buffer used to send/receive data
* @retval DRESULT: Operation result
*/
DRESULT SD_Ioctl(BYTE lun, BYTE cmd, void *buff)
{
DRESULT res;
//stc_sd_card_info_t stcCardInfo;
if (0U != (SdStat & (DSTATUS)STA_NOINIT)) {
res = RES_NOTRDY;
}
else
{
switch (cmd) {
/* Make sure that no pending write process */
case CTRL_SYNC :
res = RES_OK;
break;
/* Get number of sectors on the disk (DWORD) */
case GET_SECTOR_COUNT :
SDCARD_GetCardCSD(&stcSdhandle);
*(DWORD*)buff =stcSdhandle.stcSdCardInfo.u32LogBlockNbr;
res = RES_OK;
break;
/* Get R/W sector size (WORD) */
case GET_SECTOR_SIZE :
SDCARD_GetCardCSD(&stcSdhandle);
*(WORD*)buff = (uint16_t)stcSdhandle.stcSdCardInfo.u32LogBlockSize;
res = RES_OK;
break;
/* Get erase block size in unit of sector (DWORD) */
case GET_BLOCK_SIZE :
SDCARD_GetCardCSD(&stcSdhandle);
*(DWORD*)buff = stcSdhandle.stcSdCardInfo.u32LogBlockSize / SD_DEFAULT_BLOCK_SIZE;
res = RES_OK;
break;
default:
res = RES_PARERR;
break;
}
}
return res;
}