#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) { /* -- */ }