Fire_RT1052_SDIO/src/app_sdio.c

86 lines
2.8 KiB
C

#include "fsl_gpio.h"
#include "fsl_sdio.h"
#define SDIO_INSTANCE USDHC2
#define SDIO_INSTANCE_IRQ USDHC2_IRQn
#define SDIO_INSTANCE_IRQ_PRIO 5
#define SDIO_CLOCK_FREQ (198000000U)
#define SDIO_CLOCK_MAX_FREQ (200000000U)
#define SDIO_DMA_BUF_SIZE 32
#define SDIO_CARD_POWER_GPIO GPIO1
#define SDIO_CARD_POWER_PIN 0
static sdio_card_t s_card;
sdio_card_int_t s_card_int;
static sd_detect_card_t s_cd;
static sdmmchost_t s_host;
static sd_io_voltage_t s_io_voltage = {
.type = kSD_IOVoltageCtrlNotSupport,
.func = NULL,
};
__attribute__((section(".sdio_buf"))) static uint32_t s_sdio_dma_buffer[SDIO_DMA_BUF_SIZE];
static void app_sdio_power_control(bool enable);
static void app_sdio_interrupt_handler(void *user_data);
int app_sdio_init(void) {
s_host.dmaDesBuffer = s_sdio_dma_buffer;
s_host.dmaDesBufferWordsNum = SDIO_DMA_BUF_SIZE;
s_host.enableCacheControl = kSDMMCHOST_CacheControlRWBuffer;
s_card.host = &s_host;
s_card.host->hostController.base = SDIO_INSTANCE;
s_card.host->hostController.sourceClock_Hz = SDIO_CLOCK_FREQ;
s_card_int.cardInterrupt = app_sdio_interrupt_handler;
s_card_int.userData = NULL;
s_card.usrParam.cd = &s_cd;
s_card.usrParam.ioVoltage = &s_io_voltage;
s_card.usrParam.maxFreq = SDIO_CLOCK_MAX_FREQ;
s_card.usrParam.pwr = app_sdio_power_control;
s_card.usrParam.sdioInt = &s_card_int;
/* 3V only */
s_card.currentTiming = kSD_TimingSDR25HighSpeedMode;
NVIC_SetPriority(SDIO_INSTANCE_IRQ, SDIO_INSTANCE_IRQ_PRIO);
if (SDIO_HostInit(&s_card) != kStatus_Success) {
return -1;
}
SDIO_SetCardPower(&s_card, false);
SDIO_SetCardPower(&s_card, true);
if (SDIO_CardInit(&s_card) != kStatus_Success) {
return -2;
}
if (SDIO_GetCardCapability(&s_card, kSDIO_FunctionNum1) != kStatus_Success) {
return -3;
}
return 0;
}
uint32_t app_sdio_get_id(void) {
uint32_t tuple_list[] = {SDIO_TPL_CODE_FUNCID, SDIO_TPL_CODE_FUNCE, SDIO_TPL_CODE_MANIFID};
if (SDIO_ReadCIS(&s_card, kSDIO_FunctionNum1, tuple_list, 3U) != kStatus_Success) {
return 0UL;
}
return (uint32_t)(s_card.commonCIS.mID << 16U) | (s_card.commonCIS.mInfo);
}
static void app_sdio_power_control(bool enable) {
if (enable) {
GPIO_PinWrite(SDIO_CARD_POWER_GPIO, SDIO_CARD_POWER_PIN, 1U);
} else {
GPIO_PinWrite(SDIO_CARD_POWER_GPIO, SDIO_CARD_POWER_PIN, 0U);
}
}
static void app_sdio_interrupt_handler(void *user_data) { /* -- */
}