MindSDK_MM32F5270/components/sdspi/src/sdspi.h
Yilin Sun 3977144e90
Initial MM32F527x commit.
Signed-off-by: Yilin Sun <imi415@imi.moe>
2023-03-27 21:54:40 +08:00

151 lines
7.2 KiB
C

/* sdspi.h */
#ifndef __SDSPI_H__
#define __SDSPI_H__
#include <stdint.h>
#include "sdmmc_spec.h"
/******************************************************************************
* Definitions
*****************************************************************************/
#define SDSPI_DEFAULT_BLOCK_SIZE (512U)
#define SDSPI_DUMMY_DATA (0xff)
#ifndef SDSPI_CARD_CRC_PROTECTION_ENABLE
#define SDSPI_CARD_CRC_PROTECTION_ENABLE 0U
#endif
/*!
* @addtogroup SDSPI
* @{
*/
/*! @brief SDSPI API status */
typedef enum
{
SDSPI_ApiRetStatus_Success = 0,
SDSPI_ApiRetStatus_InvalidArgument,
SDSPI_ApiRetStatus_Fail,
SDSPI_ApiRetStatus_SDSPI_SetFreqFail, /*!< Set frequency failed */
SDSPI_ApiRetStatus_SDSPI_XferFail, /*!< Exchange data on SPI bus failed */
SDSPI_ApiRetStatus_SDSPI_WaitReadyFail, /*!< Wait card ready failed */
SDSPI_ApiRetStatus_SDSPI_ResponseError, /*!< Response is error */
SDSPI_ApiRetStatus_SDSPI_WriteProtected, /*!< Write protected */
SDSPI_ApiRetStatus_SDSPI_GoIdleFail, /*!< Go idle failed */
SDSPI_ApiRetStatus_SDSPI_SendCmdFail, /*!< Send command failed */
SDSPI_ApiRetStatus_SDSPI_ReadFail, /*!< Read data failed */
SDSPI_ApiRetStatus_SDSPI_WriteFail, /*!< Write data failed */
SDSPI_ApiRetStatus_SDSPI_SendIfCondFail, /*!< Send interface condition failed */
SDSPI_ApiRetStatus_SDSPI_SendOpCondFail, /*!< Send operation condition failed */
SDSPI_ApiRetStatus_SDSPI_ReadOcrFail, /*!< Read OCR failed */
SDSPI_ApiRetStatus_SDSPI_SetBlockSizeFail, /*!< Set block size failed */
SDSPI_ApiRetStatus_SDSPI_SendCsdFail, /*!< Send CSD failed */
SDSPI_ApiRetStatus_SDSPI_SendCidFail, /*!< Send CID failed */
SDSPI_ApiRetStatus_SDSPI_StopTransFail, /*!< Stop transmission failed */
SDSPI_ApiRetStatus_SDSPI_SendAppCmdFail, /*!< Send application command failed */
SDSPI_ApiRetStatus_SDSPI_InvalidVoltage, /*!< invaild supply voltage */
SDSPI_ApiRetStatus_SDSPI_SwitchCmdFail, /*!< switch command crc protection on/off */
SDSPI_ApiRetStatus_SDSPI_NotSupportYet, /*!< not support */
SDSPI_ApiRetStatus_SDSPI_SpiInitFail, /*!< not support */
} SDSPI_ApiRetStatus_Type;
/*! @brief SDSPI card flag */
enum _sdspi_card_type
{
SDSPI_CardType_HighCapacity = (1U << 0U), /*!< Card is high capacity */
SDSPI_CardType_Sdhc = (1U << 1U), /*!< Card is SDHC */
SDSPI_CardType_Sdxc = (1U << 2U), /*!< Card is SDXC */
SDSPI_CardType_Sdsc = (1U << 3U), /*!< Card is SDSC */
};
/*! @brief SDSPI response type */
enum _sdspi_resp_type
{
SDSPI_RespType_R1 = 0U, /*!< Response 1 */
SDSPI_RespType_R1b = 1U, /*!< Response 1 with busy */
SDSPI_RespType_R2 = 2U, /*!< Response 2 */
SDSPI_RespType_R3 = 3U, /*!< Response 3 */
SDSPI_RespType_R7 = 4U, /*!< Response 7 */
};
#define SDSPI_MAKE_CMD(resp, cmd) ( (resp) | ((cmd) << 8u) )
enum _sdspi_cmd
{
SDSPI_Cmd_GoIdle = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_GoIdleState),
SDSPI_Cmd_Crc = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDSPI_CmdCrc),
SDSPI_Cmd_SendIfCond = SDSPI_MAKE_CMD(SDSPI_RespType_R7 , SD_SendInterfaceCondition),
SDSPI_Cmd_AppCmd = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_ApplicationCommand),
SDSPI_Cmd_AppSendOpCond = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_ApplicationSendOperationCondition),
SDSPI_Cmd_ReadOcr = SDSPI_MAKE_CMD(SDSPI_RespType_R3 , SDMMC_ReadOcr),
SDSPI_Cmd_SetBlockLength = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_SetBlockLength),
SDSPI_Cmd_SendCsd = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_SendCsd),
SDSPI_Cmd_SendCid = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_SendCid),
SDSPI_Cmd_SendScr = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_ApplicationSendScr),
SDSPI_Cmd_StopTrans = SDSPI_MAKE_CMD(SDSPI_RespType_R1b, SDMMC_StopTransmission),
SDSPI_Cmd_WriteSigleBlock = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_WriteSingleBlock),
SDSPI_Cmd_WriteMultiBlock = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_WriteMultipleBlock),
SDSPI_Cmd_ReadSigleBlock = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_ReadSingleBlock),
SDSPI_Cmd_ReadMultiBlock = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SDMMC_ReadMultipleBlock),
SDSPI_Cmd_WriteBlockEraseCount = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_ApplicationSetWriteBlockEraseCount),
SDSPI_Cmd_WriteBlockEraseStart = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_EraseWriteBlockStart),
SDSPI_Cmd_WriteBlockEraseEnd = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_EraseWriteBlockEnd),
SDSPI_Cmd_WriteBlockErase = SDSPI_MAKE_CMD(SDSPI_RespType_R1b, SDMMC_Erase),
SDSPI_Cmd_Switch = SDSPI_MAKE_CMD(SDSPI_RespType_R1 , SD_Switch),
};
typedef struct _sdspi_interface
{
uint32_t baudrate; /*!< Bus baud rate */
SDSPI_ApiRetStatus_Type (*spi_init)(void); /*!< init spi hardware. */
SDSPI_ApiRetStatus_Type (*spi_freq)(uint32_t hz); /*!< Set frequency of SPI */
SDSPI_ApiRetStatus_Type (*spi_xfer)(uint8_t *in, uint8_t *out, uint32_t size); /*!< Exchange data over SPI */
} SDSPI_Interface_Type;
typedef struct _sdspi_card
{
SDSPI_Interface_Type *interface; /*!< interface state information */
uint32_t relativeAddress; /*!< Relative address of the card */
uint32_t cardType; /*!< Flags defined in _sdspi_card_type. */
uint8_t rawCid[16U]; /*!< Raw CID content */
uint8_t rawCsd[16U]; /*!< Raw CSD content */
uint8_t rawScr[8U]; /*!< Raw SCR content */
uint32_t ocr; /*!< Raw OCR content */
sd_cid_t cid; /*!< CID */
sd_csd_t csd; /*!< CSD */
sd_scr_t scr; /*!< SCR */
uint32_t blockCount; /*!< Card total block number */
uint32_t blockSize; /*!< Card block size */
} SDSPI_CardHandler_Type;
/*************************************************************************************************
* API
************************************************************************************************/
#if defined(__cplusplus)
extern "C" {
#endif
SDSPI_ApiRetStatus_Type SDSPI_Init(SDSPI_CardHandler_Type *card, const SDSPI_Interface_Type *interface);
SDSPI_ApiRetStatus_Type SDSPI_ReadBlocks(SDSPI_CardHandler_Type *card, uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
SDSPI_ApiRetStatus_Type SDSPI_WriteBlocks(SDSPI_CardHandler_Type *card, uint8_t *buffer, uint32_t startBlock, uint32_t blockCount);
SDSPI_ApiRetStatus_Type SDSPI_SendCid(SDSPI_CardHandler_Type *card);
SDSPI_ApiRetStatus_Type SDSPI_EraseBlocksPre(SDSPI_CardHandler_Type *card, uint32_t blockCount);
SDSPI_ApiRetStatus_Type SDSPI_EraseBlocks(SDSPI_CardHandler_Type *card, uint32_t startBlock, uint32_t blockCount);
SDSPI_ApiRetStatus_Type SDSPI_SwitchToHighSpeed(SDSPI_CardHandler_Type *card);
void SDSPI_Deinit(SDSPI_CardHandler_Type *card);
bool SDSPI_CheckReadOnly(SDSPI_CardHandler_Type *card);
#if SDSPI_CARD_CMD_CRC_PROTECTION_ENABLE
SDSPI_ApiRetStatus_Type SDSPI_EnableCmdCrc(SDSPI_CardHandler_Type *card, bool enable);
#endif
extern const char * sdspi_card_type_str[];
#if defined(__cplusplus)
}
#endif
#endif /* __SDSPI_H__ */