70 lines
2.5 KiB
C
70 lines
2.5 KiB
C
/*
|
|
* Copyright 2020 NXP
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#include "sdmmc_config.h"
|
|
#include "fsl_iocon.h"
|
|
/*******************************************************************************
|
|
* Definitions
|
|
******************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
* Prototypes
|
|
******************************************************************************/
|
|
/*******************************************************************************
|
|
* Variables
|
|
******************************************************************************/
|
|
/*!brief sdmmc dma buffer */
|
|
SDK_ALIGN(static uint32_t s_sdmmcHostDmaBuffer[BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE],
|
|
SDMMCHOST_DMA_DESCRIPTOR_BUFFER_ALIGN_SIZE);
|
|
#if defined(SDIO_ENABLED) || defined(SD_ENABLED)
|
|
static sd_detect_card_t s_cd;
|
|
#endif
|
|
static sdmmchost_t s_host;
|
|
|
|
/*******************************************************************************
|
|
* Code
|
|
******************************************************************************/
|
|
uint32_t BOARD_SDIF0ClockConfiguration(void)
|
|
{
|
|
/* attach main clock to SDIF */
|
|
CLOCK_AttachClk(kMAIN_CLK_to_SDIO_CLK);
|
|
/* need call this function to clear the halt bit in clock divider register */
|
|
CLOCK_SetClkDiv(kCLOCK_DivSdioClk, (uint32_t)(SystemCoreClock / FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK + 1U), true);
|
|
|
|
return CLOCK_GetSdioClkFreq();
|
|
}
|
|
|
|
#if defined(SDIO_ENABLED) || defined(SD_ENABLED)
|
|
void BOARD_SDCardDetectInit(sd_cd_t cd, void *userData)
|
|
{
|
|
/* install card detect callback */
|
|
s_cd.cdDebounce_ms = BOARD_SDMMC_SD_CARD_DETECT_DEBOUNCE_DELAY_MS;
|
|
s_cd.type = BOARD_SDMMC_SD_CD_TYPE;
|
|
s_cd.callback = cd;
|
|
s_cd.userData = userData;
|
|
}
|
|
#endif
|
|
|
|
#ifdef SD_ENABLED
|
|
void BOARD_SD_Config(void *card, sd_cd_t cd, uint32_t hostIRQPriority, void *userData)
|
|
{
|
|
assert(card);
|
|
|
|
s_host.dmaDesBuffer = s_sdmmcHostDmaBuffer;
|
|
s_host.dmaDesBufferWordsNum = BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE;
|
|
((sd_card_t *)card)->host = &s_host;
|
|
((sd_card_t *)card)->host->hostController.base = BOARD_SDMMC_SD_HOST_BASEADDR;
|
|
((sd_card_t *)card)->host->hostController.sourceClock_Hz = BOARD_SDIF0ClockConfiguration();
|
|
|
|
((sd_card_t *)card)->usrParam.cd = &s_cd;
|
|
|
|
BOARD_SDCardDetectInit(cd, userData);
|
|
|
|
NVIC_SetPriority(BOARD_SDMMC_SD_HOST_IRQ, hostIRQPriority);
|
|
}
|
|
#endif
|