drv_sdio_adapter.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. */
  9. #include <rtthread.h>
  10. #include <rthw.h>
  11. #include <drivers/mmcsd_core.h>
  12. #include <drivers/sdio.h>
  13. #include "stm32l4xx.h"
  14. #ifdef BSP_USING_STM32_SDIO
  15. #include <stm32_sdio.h>
  16. static DMA_HandleTypeDef SDTxDMAHandler;
  17. static DMA_HandleTypeDef SDRxDMAHandler;
  18. static struct rt_mmcsd_host *host;
  19. void SDMMC1_IRQHandler(void)
  20. {
  21. /* enter interrupt */
  22. rt_interrupt_enter();
  23. /* Process All SDIO Interrupt Sources */
  24. rthw_sdio_irq_process(host);
  25. /* leave interrupt */
  26. rt_interrupt_leave();
  27. }
  28. /**
  29. * @brief Configures the DMA2 Channel4 for SDIO Tx request.
  30. * @param BufferSRC: pointer to the source buffer
  31. * @param BufferSize: buffer size
  32. * @retval None
  33. */
  34. void SD_LowLevel_DMA_TxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize)
  35. {
  36. DMA2_Channel4->CCR &= ~0x00000001;
  37. DMA2->IFCR = DMA_ISR_GIF1 << 4;
  38. DMA2_CSELR->CSELR &= ~(0xf << (3 * 4)); // channel 4
  39. DMA2_CSELR->CSELR |= (uint32_t) (0x07 << (3 * 4));
  40. DMA2_Channel4->CCR = DMA_MEMORY_TO_PERIPH | DMA_PINC_DISABLE | DMA_MINC_ENABLE | \
  41. DMA_PDATAALIGN_WORD | DMA_MDATAALIGN_WORD | DMA_NORMAL | DMA_PRIORITY_MEDIUM;
  42. DMA2_Channel4->CNDTR = BufferSize;
  43. DMA2_Channel4->CPAR = (uint32_t)dst;
  44. DMA2_Channel4->CMAR = (uint32_t)src;
  45. DMA2_Channel4->CCR |= 0x00000001;
  46. // HAL_DMA_Start(&SDTxDMAHandler, (uint32_t)src, (uint32_t)dst, BufferSize);
  47. }
  48. /**
  49. * @brief Configures the DMA2 Channel4 for SDIO Rx request.
  50. * @param BufferDST: pointer to the destination buffer
  51. * @param BufferSize: buffer size
  52. * @retval None
  53. */
  54. void SD_LowLevel_DMA_RxConfig(uint32_t *src, uint32_t *dst, uint32_t BufferSize)
  55. {
  56. DMA2_Channel4->CCR &= ~0x00000001;
  57. DMA2->IFCR = DMA_ISR_GIF1 << 4;
  58. DMA2_CSELR->CSELR &= ~(0xf << (3 * 4)); // channel 4
  59. DMA2_CSELR->CSELR |= (uint32_t) (0x07 << (3 * 4));
  60. DMA2_Channel4->CCR = DMA_PERIPH_TO_MEMORY | DMA_PINC_DISABLE | DMA_MINC_ENABLE | \
  61. DMA_PDATAALIGN_WORD | DMA_MDATAALIGN_WORD | DMA_NORMAL | DMA_PRIORITY_MEDIUM;
  62. DMA2_Channel4->CNDTR = BufferSize;
  63. DMA2_Channel4->CPAR = (uint32_t)src;
  64. DMA2_Channel4->CMAR = (uint32_t)dst;
  65. DMA2_Channel4->CCR |= 0x00000001;
  66. }
  67. void SD_LowLevel_Init(void)
  68. {
  69. {
  70. // clock enable
  71. __HAL_RCC_GPIOB_CLK_ENABLE();
  72. __HAL_RCC_GPIOC_CLK_ENABLE();
  73. __HAL_RCC_GPIOD_CLK_ENABLE();
  74. __HAL_RCC_DMA2_CLK_ENABLE();
  75. __HAL_RCC_SDMMC1_CLK_ENABLE();
  76. }
  77. {
  78. HAL_NVIC_EnableIRQ(SDMMC1_IRQn);
  79. }
  80. {
  81. // init sdio hardware
  82. GPIO_InitTypeDef GPIO_InitStruct;
  83. /*Configure GPIO pin Output Level */
  84. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_RESET);
  85. GPIO_InitStruct.Pin = GPIO_PIN_1;
  86. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  87. GPIO_InitStruct.Pull = GPIO_NOPULL;
  88. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  89. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  90. rt_thread_delay(1);
  91. HAL_GPIO_WritePin(GPIOD, GPIO_PIN_1, GPIO_PIN_SET);
  92. /* Setup GPIO pins for SDIO data & clock */
  93. /**SDMMC1 GPIO Configuration
  94. PC8 ------> SDMMC1_D0
  95. PC9 ------> SDMMC1_D1
  96. PC10 ------> SDMMC1_D2
  97. PC11 ------> SDMMC1_D3
  98. PC12 ------> SDMMC1_CK
  99. PD2 ------> SDMMC1_CMD
  100. */
  101. GPIO_InitStruct.Pin = GPIO_PIN_9;
  102. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  103. GPIO_InitStruct.Pull = GPIO_PULLUP;
  104. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  105. GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  106. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  107. GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_10 | GPIO_PIN_11
  108. | GPIO_PIN_12;
  109. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  110. GPIO_InitStruct.Pull = GPIO_PULLUP;
  111. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  112. GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  113. HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
  114. GPIO_InitStruct.Pin = GPIO_PIN_2;
  115. GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  116. GPIO_InitStruct.Pull = GPIO_PULLUP;
  117. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  118. GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;
  119. HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
  120. }
  121. {
  122. }
  123. }
  124. static rt_uint32_t stm32_sdio_clock_get(struct stm32_sdio *hw_sdio)
  125. {
  126. return HAL_RCCEx_GetPeriphCLKFreq(RCC_PERIPHCLK_SDMMC1);
  127. }
  128. static rt_err_t DMA_TxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size)
  129. {
  130. SD_LowLevel_DMA_TxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4);
  131. return RT_EOK;
  132. }
  133. static rt_err_t DMA_RxConfig(rt_uint32_t *src, rt_uint32_t *dst, int Size)
  134. {
  135. SD_LowLevel_DMA_RxConfig((uint32_t *)src, (uint32_t *)dst, Size / 4);
  136. return RT_EOK;
  137. }
  138. int stm32f4xx_sdio_init(void)
  139. {
  140. struct stm32_sdio_des sdio_des;
  141. SD_LowLevel_Init();
  142. sdio_des.clk_get = stm32_sdio_clock_get;
  143. sdio_des.hw_sdio = (struct stm32_sdio *)0x40012800U;
  144. sdio_des.rxconfig = DMA_RxConfig;
  145. sdio_des.txconfig = DMA_TxConfig;
  146. host = sdio_host_create(&sdio_des);
  147. if (host == RT_NULL)
  148. {
  149. rt_kprintf("%s host create fail\n");
  150. return -1;
  151. }
  152. return 0;
  153. }
  154. INIT_DEVICE_EXPORT(stm32f4xx_sdio_init);
  155. #endif