drv_sdio.h 8.8 KB

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