generated from Embedded_Projects/Fire_RT1052_Pro_Template
86 lines
2.8 KiB
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) { /* -- */
|
|
} |