drv_sdio.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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. * 2022-05-16 shelton first version
  9. */
  10. #ifndef _DRV_SDIO_H
  11. #define _DRV_SDIO_H
  12. #include <rtthread.h>
  13. #include "rtdevice.h"
  14. #include <rthw.h>
  15. #include <string.h>
  16. #include <drivers/mmcsd_core.h>
  17. #include <drivers/sdio.h>
  18. #include "drv_common.h"
  19. #define SDCARD_INSTANCE_TYPE sdio_type
  20. #define SDCARD_INSTANCE SDIO1
  21. #define SDIO_BUFF_SIZE 4096
  22. #define SDIO_ALIGN_LEN 32
  23. #ifndef SDIO_MAX_FREQ
  24. #define SDIO_MAX_FREQ (1000000)
  25. #endif
  26. #ifndef SDIO_BASE_ADDRESS
  27. #define SDIO_BASE_ADDRESS SDIO1_BASE
  28. #endif
  29. #ifndef SDIO_CLOCK_FREQ
  30. #define SDIO_CLOCK_FREQ (48U * 1000 * 1000)
  31. #endif
  32. #ifndef SDIO_BUFF_SIZE
  33. #define SDIO_BUFF_SIZE (4096)
  34. #endif
  35. #ifndef SDIO_ALIGN_LEN
  36. #define SDIO_ALIGN_LEN (32)
  37. #endif
  38. #ifndef SDIO_MAX_FREQ
  39. #define SDIO_MAX_FREQ (24 * 1000 * 1000)
  40. #endif
  41. #define HW_SDIO_IT_CCRCFAIL (0x01U << 0)
  42. #define HW_SDIO_IT_DCRCFAIL (0x01U << 1)
  43. #define HW_SDIO_IT_CTIMEOUT (0x01U << 2)
  44. #define HW_SDIO_IT_DTIMEOUT (0x01U << 3)
  45. #define HW_SDIO_IT_TXUNDERR (0x01U << 4)
  46. #define HW_SDIO_IT_RXOVERR (0x01U << 5)
  47. #define HW_SDIO_IT_CMDREND (0x01U << 6)
  48. #define HW_SDIO_IT_CMDSENT (0x01U << 7)
  49. #define HW_SDIO_IT_DATAEND (0x01U << 8)
  50. #define HW_SDIO_IT_STBITERR (0x01U << 9)
  51. #define HW_SDIO_IT_DBCKEND (0x01U << 10)
  52. #define HW_SDIO_IT_CMDACT (0x01U << 11)
  53. #define HW_SDIO_IT_TXACT (0x01U << 12)
  54. #define HW_SDIO_IT_RXACT (0x01U << 13)
  55. #define HW_SDIO_IT_TXFIFOHE (0x01U << 14)
  56. #define HW_SDIO_IT_RXFIFOHF (0x01U << 15)
  57. #define HW_SDIO_IT_TXFIFOF (0x01U << 16)
  58. #define HW_SDIO_IT_RXFIFOF (0x01U << 17)
  59. #define HW_SDIO_IT_TXFIFOE (0x01U << 18)
  60. #define HW_SDIO_IT_RXFIFOE (0x01U << 19)
  61. #define HW_SDIO_IT_TXDAVL (0x01U << 20)
  62. #define HW_SDIO_IT_RXDAVL (0x01U << 21)
  63. #define HW_SDIO_IT_SDIOIT (0x01U << 22)
  64. #define HW_SDIO_ERRORS \
  65. (HW_SDIO_IT_CCRCFAIL | HW_SDIO_IT_CTIMEOUT | \
  66. HW_SDIO_IT_DCRCFAIL | HW_SDIO_IT_DTIMEOUT | \
  67. HW_SDIO_IT_RXOVERR | HW_SDIO_IT_TXUNDERR)
  68. #define HW_SDIO_POWER_OFF (0x00U)
  69. #define HW_SDIO_POWER_UP (0x02U)
  70. #define HW_SDIO_POWER_ON (0x03U)
  71. #define HW_SDIO_FLOW_ENABLE (0x01U << 14)
  72. #define HW_SDIO_BUSWIDE_1B (0x00U << 11)
  73. #define HW_SDIO_BUSWIDE_4B (0x01U << 11)
  74. #define HW_SDIO_BUSWIDE_8B (0x02U << 11)
  75. #define HW_SDIO_BYPASS_ENABLE (0x01U << 10)
  76. #define HW_SDIO_IDLE_ENABLE (0x01U << 9)
  77. #define HW_SDIO_CLK_ENABLE (0x01U << 8)
  78. #define HW_SDIO_SUSPEND_CMD (0x01U << 11)
  79. #define HW_SDIO_CPSM_ENABLE (0x01U << 10)
  80. #define HW_SDIO_WAIT_END (0x01U << 9)
  81. #define HW_SDIO_WAIT_INT (0x01U << 8)
  82. #define HW_SDIO_RESPONSE_NO (0x00U << 6)
  83. #define HW_SDIO_RESPONSE_SHORT (0x01U << 6)
  84. #define HW_SDIO_RESPONSE_LONG (0x03U << 6)
  85. #define HW_SDIO_DATA_LEN_MASK (0x01FFFFFFU)
  86. #define HW_SDIO_IO_ENABLE (0x01U << 11)
  87. #define HW_SDIO_RWMOD_CK (0x01U << 10)
  88. #define HW_SDIO_RWSTOP_ENABLE (0x01U << 9)
  89. #define HW_SDIO_RWSTART_ENABLE (0x01U << 8)
  90. #define HW_SDIO_DBLOCKSIZE_1 (0x00U << 4)
  91. #define HW_SDIO_DBLOCKSIZE_2 (0x01U << 4)
  92. #define HW_SDIO_DBLOCKSIZE_4 (0x02U << 4)
  93. #define HW_SDIO_DBLOCKSIZE_8 (0x03U << 4)
  94. #define HW_SDIO_DBLOCKSIZE_16 (0x04U << 4)
  95. #define HW_SDIO_DBLOCKSIZE_32 (0x05U << 4)
  96. #define HW_SDIO_DBLOCKSIZE_64 (0x06U << 4)
  97. #define HW_SDIO_DBLOCKSIZE_128 (0x07U << 4)
  98. #define HW_SDIO_DBLOCKSIZE_256 (0x08U << 4)
  99. #define HW_SDIO_DBLOCKSIZE_512 (0x09U << 4)
  100. #define HW_SDIO_DBLOCKSIZE_1024 (0x0AU << 4)
  101. #define HW_SDIO_DBLOCKSIZE_2048 (0x0BU << 4)
  102. #define HW_SDIO_DBLOCKSIZE_4096 (0x0CU << 4)
  103. #define HW_SDIO_DBLOCKSIZE_8192 (0x0DU << 4)
  104. #define HW_SDIO_DBLOCKSIZE_16384 (0x0EU << 4)
  105. #define HW_SDIO_DMA_ENABLE (0x01U << 3)
  106. #define HW_SDIO_STREAM_ENABLE (0x01U << 2)
  107. #define HW_SDIO_TO_HOST (0x01U << 1)
  108. #define HW_SDIO_DPSM_ENABLE (0x01U << 0)
  109. #define HW_SDIO_DATATIMEOUT (0xF0000000U)
  110. struct at32_sdio
  111. {
  112. volatile rt_uint32_t power;
  113. volatile rt_uint32_t clkcr;
  114. volatile rt_uint32_t arg;
  115. volatile rt_uint32_t cmd;
  116. volatile rt_uint32_t respcmd;
  117. volatile rt_uint32_t resp1;
  118. volatile rt_uint32_t resp2;
  119. volatile rt_uint32_t resp3;
  120. volatile rt_uint32_t resp4;
  121. volatile rt_uint32_t dtimer;
  122. volatile rt_uint32_t dlen;
  123. volatile rt_uint32_t dctrl;
  124. volatile rt_uint32_t dcount;
  125. volatile rt_uint32_t sta;
  126. volatile rt_uint32_t icr;
  127. volatile rt_uint32_t mask;
  128. volatile rt_uint32_t reserved0[2];
  129. volatile rt_uint32_t fifocnt;
  130. volatile rt_uint32_t reserved1[13];
  131. volatile rt_uint32_t fifo;
  132. };
  133. typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size);
  134. typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *src, rt_uint32_t *dst, int size);
  135. typedef rt_uint32_t (*sdio_clk_get)(struct at32_sdio *hw_sdio);
  136. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437)
  137. #define SDIO_BUS_CONFIG \
  138. { \
  139. .sdio_x = SDIO1, \
  140. .dma_rx.dma_x = DMA2, \
  141. .dma_tx.dma_x = DMA2, \
  142. .dma_rx.dma_crm = CRM_DMA2_PERIPH_CLOCK, \
  143. .dma_tx.dma_crm = CRM_DMA2_PERIPH_CLOCK, \
  144. .dma_rx.dma_channel = DMA2_CHANNEL4, \
  145. .dma_tx.dma_channel = DMA2_CHANNEL4, \
  146. .dma_rx.dma_irq = DMA2_Channel4_IRQn, \
  147. .dma_tx.dma_irq = DMA2_Channel4_IRQn, \
  148. .dma_rx.dmamux_channel = DMA2MUX_CHANNEL4, \
  149. .dma_tx.dmamux_channel = DMA2MUX_CHANNEL4, \
  150. .dma_rx.dmamux_id = DMAMUX_DMAREQ_ID_SDIO1, \
  151. .dma_tx.dmamux_id = DMAMUX_DMAREQ_ID_SDIO1, \
  152. }
  153. #else
  154. #define SDIO_BUS_CONFIG \
  155. { \
  156. .sdio_x = SDIO1, \
  157. .dma_rx.dma_crm = CRM_DMA2_PERIPH_CLOCK, \
  158. .dma_tx.dma_crm = CRM_DMA2_PERIPH_CLOCK, \
  159. .dma_rx.dma_channel = DMA2_CHANNEL4, \
  160. .dma_rx.dma_irq = DMA2_Channel4_5_IRQn, \
  161. .dma_tx.dma_channel = DMA2_CHANNEL4, \
  162. .dma_tx.dma_irq = DMA2_Channel4_5_IRQn, \
  163. }
  164. #endif
  165. struct dma_config {
  166. dma_type *dma_x;
  167. dma_channel_type *dma_channel;
  168. #if defined (SOC_SERIES_AT32F435) || defined (SOC_SERIES_AT32F437)
  169. dmamux_channel_type *dmamux_channel;
  170. dmamux_requst_id_sel_type dmamux_id;
  171. #endif
  172. crm_periph_clock_type dma_crm;
  173. IRQn_Type dma_irq;
  174. };
  175. struct at32_sdio_des
  176. {
  177. struct at32_sdio *hw_sdio;
  178. dma_txconfig txconfig;
  179. dma_rxconfig rxconfig;
  180. sdio_clk_get clk_get;
  181. };
  182. struct at32_sdio_config
  183. {
  184. SDCARD_INSTANCE_TYPE *sdio_x;
  185. struct dma_config dma_rx, dma_tx;
  186. };
  187. /* at32 sdio dirver class */
  188. struct at32_sdio_class
  189. {
  190. struct at32_sdio_des *des;
  191. const struct at32_sdio_config *cfg;
  192. struct rt_mmcsd_host host;
  193. struct
  194. {
  195. dma_channel_type* handle_rx;
  196. dma_channel_type* handle_tx;
  197. } dma;
  198. };
  199. extern void at32_mmcsd_change(void);
  200. #endif