|
1 | 1 | #include <hal/emmc.h> |
2 | | -#include <drivers/sdmmc/fsl_mmc.h> |
3 | | -#include <drivers/sdmmc/fsl_sdmmc_host.h> |
| 2 | +#include <boot/board.h> |
| 3 | +#include "MIMXRT1051.h" |
4 | 4 | #include <errno.h> |
5 | 5 | #include <stdbool.h> |
6 | 6 |
|
| 7 | +#include <drivers/fsl_iomuxc.h> |
| 8 | +#include <hal/delay.h> |
| 9 | + |
| 10 | + |
| 11 | +#define BOARD_SDMMC_MMC_HOST_SUPPORT_HS200_FREQ (180000000U) |
| 12 | +#define DMA_BUFFER_WORD_SIZE (1024U) |
| 13 | +#define USDHC_IRQ_PRIORITY (6U) |
| 14 | + |
| 15 | +AT_NONCACHEABLE_SECTION_ALIGN(uint32_t s_sdmmc_hostDmaBuffer[DMA_BUFFER_WORD_SIZE], SDMMCHOST_DMA_DESCRIPTOR_BUFFER_ALIGN_SIZE); |
| 16 | + |
7 | 17 | static mmc_card_t mmc_card; |
| 18 | +static sdmmchost_t mmc_host; |
8 | 19 | static bool init_ok; |
9 | 20 |
|
10 | | -/** Enable the clocks in the emmc card |
11 | | - * @return error |
12 | | - */ |
| 21 | +static void emmc_pin_config(uint32_t freq); |
| 22 | + |
13 | 23 | void emmc_enable(void) |
14 | 24 | { |
15 | | - /* Configure USDHC clock source and divider */ |
16 | | - CLOCK_SetDiv(kCLOCK_Usdhc2Div, 2); //bylo 2 |
17 | | - CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0); // CSCMR1 (17) 0 - PLL2_PFD2, 1 - PLL2_PFD0 |
| 25 | + CLOCK_SetDiv(kCLOCK_Usdhc2Div, 3); |
| 26 | + CLOCK_SetMux(kCLOCK_Usdhc2Mux, 0); // 0 - PLL2_PFD2, 1 - PLL2_PFD0 |
18 | 27 | CLOCK_EnableClock(kCLOCK_Usdhc2); |
19 | 28 | } |
20 | 29 |
|
21 | | -/** Initialize the EMMC card */ |
22 | | -int emmc_init(void) |
| 30 | +status_t emmc_init(void) |
23 | 31 | { |
24 | | - //config_emmc(); |
25 | | - /* Configure base eMMC parameters*/ |
26 | 32 | memset(&mmc_card, 0, sizeof(mmc_card)); |
| 33 | + memset(&mmc_host, 0, sizeof(mmc_host)); |
| 34 | + mmc_card.host = &mmc_host; |
| 35 | + |
| 36 | + mmc_host.dmaDesBuffer = s_sdmmc_hostDmaBuffer; |
| 37 | + mmc_host.dmaDesBufferWordsNum = DMA_BUFFER_WORD_SIZE; |
| 38 | + mmc_host.enableCacheControl = kSDMMCHOST_CacheControlRWBuffer; |
| 39 | +#if defined SDmmc_host_ENABLE_CACHE_LINE_ALIGN_TRANSFER && SDmmc_host_ENABLE_CACHE_LINE_ALIGN_TRANSFER |
| 40 | + mmc_host.cacheAlignBuffer = s_sdmmcCacheLineAlignBuffer; |
| 41 | + mmc_host.cacheAlignBufferSize = BOARD_SDMMC_DATA_BUFFER_ALIGN_SIZE * 2U; |
| 42 | +#endif |
27 | 43 |
|
28 | 44 | mmc_card.busWidth = kMMC_DataBusWidth8bit; |
29 | | - mmc_card.busTiming = /*kMMC_HighSpeed200Timing;*/ kMMC_HighSpeedTiming; |
| 45 | + mmc_card.busTiming = kMMC_HighSpeed200Timing; |
30 | 46 | mmc_card.enablePreDefinedBlockCount = true; |
31 | | - mmc_card.host.base = MMC_HOST_BASEADDR; |
32 | | - mmc_card.host.sourceClock_Hz = MMC_HOST_CLK_FREQ; |
| 47 | + mmc_card.host->hostController.base = BOARD_MMC_HOST_BASEADDR; |
| 48 | + mmc_card.host->hostController.sourceClock_Hz = BOARD_MMC_HOST_CLK_FREQ; |
| 49 | + mmc_card.usrParam.ioStrength = emmc_pin_config; |
| 50 | + mmc_card.usrParam.maxFreq = BOARD_SDMMC_MMC_HOST_SUPPORT_HS200_FREQ; |
| 51 | + mmc_card.hostVoltageWindowVCCQ = kMMC_VoltageWindow120; |
| 52 | + mmc_card.hostVoltageWindowVCC = kMMC_VoltageWindow170to195; |
33 | 53 | /* card detect type */ |
34 | 54 | #if defined DEMO_SDCARD_POWER_CTRL_FUNCTION_EXIST |
35 | 55 | g_sd.usrParam.pwr = &s_sdCardPwrCtrl; |
36 | 56 | #endif |
37 | | - if (MMC_Init(&mmc_card) != kStatus_Success) |
| 57 | + |
| 58 | + const status_t status = MMC_Init(&mmc_card); |
| 59 | + if (status == kStatus_Success) { |
| 60 | + init_ok = true; |
| 61 | + NVIC_SetPriority(USDHC2_IRQn, USDHC_IRQ_PRIORITY); |
| 62 | + return kStatus_Success; |
| 63 | + } |
| 64 | + |
| 65 | + return status; |
| 66 | +} |
| 67 | + |
| 68 | +static void emmc_pin_config(uint32_t freq) |
| 69 | +{ |
| 70 | + uint32_t speed = 0U, strength = 0U; |
| 71 | + |
| 72 | + if (freq <= 50000000) |
| 73 | + { |
| 74 | + speed = 0U; |
| 75 | + strength = 7U; |
| 76 | + } |
| 77 | + else if (freq <= 100000000) |
| 78 | + { |
| 79 | + speed = 2U; |
| 80 | + strength = 7U; |
| 81 | + } |
| 82 | + else |
38 | 83 | { |
39 | | - return -1; |
| 84 | + speed = 3U; |
| 85 | + strength = 7U; |
40 | 86 | } |
41 | | - init_ok = true; |
42 | | - return 0; |
| 87 | + |
| 88 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_05_USDHC2_CMD, |
| 89 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 90 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 91 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 92 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 93 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_04_USDHC2_CLK, |
| 94 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 95 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(0) | |
| 96 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 97 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_03_USDHC2_DATA0, |
| 98 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 99 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 100 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 101 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 102 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_02_USDHC2_DATA1, |
| 103 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 104 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 105 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 106 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 107 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_01_USDHC2_DATA2, |
| 108 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 109 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 110 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 111 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 112 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_00_USDHC2_DATA3, |
| 113 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 114 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 115 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 116 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 117 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_08_USDHC2_DATA4, |
| 118 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 119 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 120 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 121 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 122 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_09_USDHC2_DATA5, |
| 123 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 124 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 125 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 126 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 127 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_10_USDHC2_DATA6, |
| 128 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 129 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 130 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 131 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
| 132 | + IOMUXC_SetPinConfig(IOMUXC_GPIO_SD_B1_11_USDHC2_DATA7, |
| 133 | + IOMUXC_SW_PAD_CTL_PAD_SPEED(speed) | IOMUXC_SW_PAD_CTL_PAD_SRE_MASK | |
| 134 | + IOMUXC_SW_PAD_CTL_PAD_PKE_MASK | IOMUXC_SW_PAD_CTL_PAD_PUE_MASK | |
| 135 | + IOMUXC_SW_PAD_CTL_PAD_HYS_MASK | IOMUXC_SW_PAD_CTL_PAD_PUS(1) | |
| 136 | + IOMUXC_SW_PAD_CTL_PAD_DSE(strength)); |
43 | 137 | } |
44 | 138 |
|
45 | | -/* Retrive the mmc card object structure |
46 | | -*/ |
47 | | -struct _mmc_card* emmc_card() |
| 139 | +struct _mmc_card* emmc_card(void) |
48 | 140 | { |
49 | | - return (init_ok)?(&mmc_card):(NULL); |
| 141 | + return init_ok ? &mmc_card : NULL; |
50 | 142 | } |
| 143 | + |
| 144 | +// Overwrite a weak function for getting msec |
| 145 | +uint32_t OSA_TimeGetMsec(void) |
| 146 | +{ |
| 147 | + return get_jiffiess(); |
| 148 | +} |
| 149 | + |
0 commit comments