drv_sdio.h 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. /*
  2. * File : drv_sdio.h
  3. * Copyright (c) 2006-2021, RT-Thread Development Team
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2019-07-29 zdzn first version
  10. */
  11. #ifndef __DRV_SDIO_H__
  12. #define __DRV_SDIO_H__
  13. #include <rtthread.h>
  14. #include <rtdevice.h>
  15. #include <drivers/mmcsd_core.h>
  16. #include "board.h"
  17. #define MMC0_BASE_ADDR 0x3F300000
  18. /* Struct for Intrrrupt Information */
  19. #define SDXC_CmdDone BIT(0)
  20. #define SDXC_DataDone BIT(1)
  21. #define SDXC_BlockGap BIT(2)
  22. #define SDXC_WriteRdy BIT(4)
  23. #define SDXC_ReadRdy BIT(5)
  24. #define SDXC_Card BIT(8)
  25. #define SDXC_Retune BIT(12)
  26. #define SDXC_BootAck BIT(13)
  27. #define SDXC_EndBoot BIT(14)
  28. #define SDXC_Err BIT(15)
  29. #define SDXC_CTOErr BIT(16)
  30. #define SDXC_CCRCErr BIT(17)
  31. #define SDXC_CENDErr BIT(18)
  32. #define SDXC_CBADErr BIT(19)
  33. #define SDXC_DTOErr BIT(20)
  34. #define SDXC_DCRCErr BIT(21)
  35. #define SDXC_DENDErr BIT(22)
  36. #define SDXC_ACMDErr BIT(24)
  37. #define SDXC_BLKCNT_EN BIT(1)
  38. #define SDXC_AUTO_CMD12_EN BIT(2)
  39. #define SDXC_AUTO_CMD23_EN BIT(3)
  40. #define SDXC_DAT_DIR BIT(4) //from card to host
  41. #define SDXC_MULTI_BLOCK BIT(5)
  42. #define SDXC_CMD_RSPNS_136 BIT(16)
  43. #define SDXC_CMD_RSPNS_48 BIT(17)
  44. #define SDXC_CMD_RSPNS_48busy BIT(16)|BIT(17)
  45. #define SDXC_CHECK_CRC_CMD BIT(19)
  46. #define SDXC_CMD_IXCHK_EN BIT(20)
  47. #define SDXC_CMD_ISDATA BIT(21)
  48. #define SDXC_CMD_SUSPEND BIT(22)
  49. #define SDXC_CMD_RESUME BIT(23)
  50. #define SDXC_CMD_ABORT BIT(23)|BIT(22)
  51. #define SDXC_CMD_INHIBIT BIT(0)
  52. #define SDXC_DAT_INHIBIT BIT(1)
  53. #define SDXC_DAT_ACTIVE BIT(2)
  54. #define SDXC_WRITE_TRANSFER BIT(8)
  55. #define SDXC_READ_TRANSFER BIT(9)
  56. struct sdhci_cmd_t
  57. {
  58. rt_uint32_t cmdidx;
  59. rt_uint32_t cmdarg;
  60. rt_uint32_t resptype;
  61. rt_uint32_t datarw;
  62. #define DATA_READ 1
  63. #define DATA_WRITE 2
  64. rt_uint32_t response[4];
  65. };
  66. struct sdhci_data_t
  67. {
  68. rt_uint8_t * buf;
  69. rt_uint32_t flag;
  70. rt_uint32_t blksz;
  71. rt_uint32_t blkcnt;
  72. };
  73. struct sdhci_t
  74. {
  75. char * name;
  76. rt_uint32_t voltages;
  77. rt_uint32_t width;
  78. rt_uint32_t clock;
  79. rt_err_t removeable;
  80. void * sdcard;
  81. rt_err_t (*detect)(struct sdhci_t * sdhci);
  82. rt_err_t (*setwidth)(struct sdhci_t * sdhci, rt_uint32_t width);
  83. rt_err_t (*setclock)(struct sdhci_t * sdhci, rt_uint32_t clock);
  84. rt_err_t (*transfer)(struct sdhci_t * sdhci, struct sdhci_cmd_t * cmd, struct sdhci_data_t * dat);
  85. void * priv;
  86. };
  87. struct sdhci_pdata_t
  88. {
  89. rt_uint32_t virt;
  90. };
  91. // EMMC command flags
  92. #define CMD_TYPE_NORMAL 0x00000000
  93. #define CMD_TYPE_SUSPEND 0x00400000
  94. #define CMD_TYPE_RESUME 0x00800000
  95. #define CMD_TYPE_ABORT 0x00c00000
  96. #define CMD_IS_DATA 0x00200000
  97. #define CMD_IXCHK_EN 0x00100000
  98. #define CMD_CRCCHK_EN 0x00080000
  99. #define CMD_RSPNS_NO 0x00000000
  100. #define CMD_RSPNS_136 0x00010000
  101. #define CMD_RSPNS_48 0x00020000
  102. #define CMD_RSPNS_48B 0x00030000
  103. #define TM_MULTI_BLOCK 0x00000020
  104. #define TM_DAT_DIR_HC 0x00000000
  105. #define TM_DAT_DIR_CH 0x00000010
  106. #define TM_AUTO_CMD23 0x00000008
  107. #define TM_AUTO_CMD12 0x00000004
  108. #define TM_BLKCNT_EN 0x00000002
  109. #define TM_MULTI_DATA (CMD_IS_DATA|TM_MULTI_BLOCK|TM_BLKCNT_EN)
  110. #define RCA_NO 1
  111. #define RCA_YES 2
  112. // INTERRUPT register settings
  113. #define INT_AUTO_ERROR 0x01000000
  114. #define INT_DATA_END_ERR 0x00400000
  115. #define INT_DATA_CRC_ERR 0x00200000
  116. #define INT_DATA_TIMEOUT 0x00100000
  117. #define INT_INDEX_ERROR 0x00080000
  118. #define INT_END_ERROR 0x00040000
  119. #define INT_CRC_ERROR 0x00020000
  120. #define INT_CMD_TIMEOUT 0x00010000
  121. #define INT_ERR 0x00008000
  122. #define INT_ENDBOOT 0x00004000
  123. #define INT_BOOTACK 0x00002000
  124. #define INT_RETUNE 0x00001000
  125. #define INT_CARD 0x00000100
  126. #define INT_READ_RDY 0x00000020
  127. #define INT_WRITE_RDY 0x00000010
  128. #define INT_BLOCK_GAP 0x00000004
  129. #define INT_DATA_DONE 0x00000002
  130. #define INT_CMD_DONE 0x00000001
  131. #define INT_ERROR_MASK (INT_CRC_ERROR|INT_END_ERROR|INT_INDEX_ERROR| \
  132. INT_DATA_TIMEOUT|INT_DATA_CRC_ERR|INT_DATA_END_ERR| \
  133. INT_ERR|INT_AUTO_ERROR)
  134. #define INT_ALL_MASK (INT_CMD_DONE|INT_DATA_DONE|INT_READ_RDY|INT_WRITE_RDY|INT_ERROR_MASK)
  135. #define EMMC_ARG2 (0x00)
  136. #define EMMC_BLKSIZECNT (0x04)
  137. #define EMMC_ARG1 (0x08)
  138. #define EMMC_CMDTM (0x0c)
  139. #define EMMC_RESP0 (0x10)
  140. #define EMMC_RESP1 (0x14)
  141. #define EMMC_RESP2 (0x18)
  142. #define EMMC_RESP3 (0x1c)
  143. #define EMMC_DATA (0x20)
  144. #define EMMC_STATUS (0x24)
  145. #define EMMC_CONTROL0 (0x28)
  146. #define EMMC_CONTROL1 (0x2c)
  147. #define EMMC_INTERRUPT (0x30)
  148. #define EMMC_IRPT_MASK (0x34)
  149. #define EMMC_IRPT_EN (0x38)
  150. #define EMMC_CONTROL2 (0x3c)
  151. #define EMMC_BOOT_TIMEOUT (0x70)
  152. #define EMMC_EXRDFIFO_EN (0x84)
  153. #define EMMC_SPI_INT_SPT (0xf0)
  154. #define EMMC_SLOTISR_VER (0xfc)
  155. // CONTROL register settings
  156. #define C0_SPI_MODE_EN 0x00100000
  157. #define C0_HCTL_HS_EN 0x00000004
  158. #define C0_HCTL_DWITDH 0x00000002
  159. #define C1_SRST_DATA 0x04000000
  160. #define C1_SRST_CMD 0x02000000
  161. #define C1_SRST_HC 0x01000000
  162. #define C1_TOUNIT_DIS 0x000f0000
  163. #define C1_TOUNIT_MAX 0x000e0000
  164. #define C1_CLK_GENSEL 0x00000020
  165. #define C1_CLK_EN 0x00000004
  166. #define C1_CLK_STABLE 0x00000002
  167. #define C1_CLK_INTLEN 0x00000001
  168. #define FREQ_SETUP 400000 // 400 Khz
  169. #define FREQ_NORMAL 25000000 // 25 Mhz
  170. // SLOTISR_VER values
  171. #define HOST_SPEC_NUM 0x00ff0000
  172. #define HOST_SPEC_NUM_SHIFT 16
  173. #define HOST_SPEC_V3 2
  174. #define HOST_SPEC_V2 1
  175. #define HOST_SPEC_V1 0
  176. // STATUS register settings
  177. #define SR_DAT_LEVEL1 0x1e000000
  178. #define SR_CMD_LEVEL 0x01000000
  179. #define SR_DAT_LEVEL0 0x00f00000
  180. #define SR_DAT3 0x00800000
  181. #define SR_DAT2 0x00400000
  182. #define SR_DAT1 0x00200000
  183. #define SR_DAT0 0x00100000
  184. #define SR_WRITE_PROT 0x00080000 // From SDHC spec v2, BCM says reserved
  185. #define SR_READ_AVAILABLE 0x00000800 // ???? undocumented
  186. #define SR_WRITE_AVAILABLE 0x00000400 // ???? undocumented
  187. #define SR_READ_TRANSFER 0x00000200
  188. #define SR_WRITE_TRANSFER 0x00000100
  189. #define SR_DAT_ACTIVE 0x00000004
  190. #define SR_DAT_INHIBIT 0x00000002
  191. #define SR_CMD_INHIBIT 0x00000001
  192. #define CONFIG_MMC_USE_DMA
  193. #define DMA_ALIGN (32U)
  194. #define SD_CMD_INDEX(a) ((a) << 24)
  195. #define SD_CMD_RESERVED(a) 0xffffffff
  196. #define SD_CMD_INDEX(a) ((a) << 24)
  197. #define SD_CMD_TYPE_NORMAL 0x0
  198. #define SD_CMD_TYPE_SUSPEND (1 << 22)
  199. #define SD_CMD_TYPE_RESUME (2 << 22)
  200. #define SD_CMD_TYPE_ABORT (3 << 22)
  201. #define SD_CMD_TYPE_MASK (3 << 22)
  202. #define SD_CMD_ISDATA (1 << 21)
  203. #define SD_CMD_IXCHK_EN (1 << 20)
  204. #define SD_CMD_CRCCHK_EN (1 << 19)
  205. #define SD_CMD_RSPNS_TYPE_NONE 0 // For no response
  206. #define SD_CMD_RSPNS_TYPE_136 (1 << 16) // For response R2 (with CRC), R3,4 (no CRC)
  207. #define SD_CMD_RSPNS_TYPE_48 (2 << 16) // For responses R1, R5, R6, R7 (with CRC)
  208. #define SD_CMD_RSPNS_TYPE_48B (3 << 16) // For responses R1b, R5b (with CRC)
  209. #define SD_CMD_RSPNS_TYPE_MASK (3 << 16)
  210. #define SD_CMD_MULTI_BLOCK (1 << 5)
  211. #define SD_CMD_DAT_DIR_HC 0
  212. #define SD_CMD_DAT_DIR_CH (1 << 4)
  213. #define SD_CMD_AUTO_CMD_EN_NONE 0
  214. #define SD_CMD_AUTO_CMD_EN_CMD12 (1 << 2)
  215. #define SD_CMD_AUTO_CMD_EN_CMD23 (2 << 2)
  216. #define SD_CMD_BLKCNT_EN (1 << 1)
  217. #define SD_CMD_DMA 1
  218. #define SD_RESP_NONE SD_CMD_RSPNS_TYPE_NONE
  219. #define SD_RESP_R1 (SD_CMD_RSPNS_TYPE_48) // | SD_CMD_CRCCHK_EN)
  220. #define SD_RESP_R1b (SD_CMD_RSPNS_TYPE_48B) // | SD_CMD_CRCCHK_EN)
  221. #define SD_RESP_R2 (SD_CMD_RSPNS_TYPE_136) //| SD_CMD_CRCCHK_EN)
  222. #define SD_RESP_R3 SD_CMD_RSPNS_TYPE_48
  223. #define SD_RESP_R4 SD_CMD_RSPNS_TYPE_136
  224. #define SD_RESP_R5 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN)
  225. #define SD_RESP_R5b (SD_CMD_RSPNS_TYPE_48B | SD_CMD_CRCCHK_EN)
  226. #define SD_RESP_R6 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN)
  227. #define SD_RESP_R7 (SD_CMD_RSPNS_TYPE_48 | SD_CMD_CRCCHK_EN)
  228. #define SD_DATA_READ (SD_CMD_ISDATA | SD_CMD_DAT_DIR_CH)
  229. #define SD_DATA_WRITE (SD_CMD_ISDATA | SD_CMD_DAT_DIR_HC)
  230. #endif