dw_sdmmc.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. /*
  2. * Copyright (C) Cvitek Co., Ltd. 2019-2029. All rights reserved.
  3. */
  4. #ifndef __MMC_H__
  5. #define __MMC_H__
  6. #include <stdint.h>
  7. #include <stdio.h>
  8. #include <string.h>
  9. #include <stdbool.h>
  10. #define TOP_BASE 0x03000000
  11. #define DW_SDIO0_BASE 0x04320000
  12. #define DW_SDIO1_BASE 0x04310000
  13. #define DW_SDIO2_BASE 0x04300000
  14. #define CONFIG_SDIO_NUM 3
  15. #define MMC_CMD0 0
  16. #define MMC_CMD1 1
  17. #define MMC_CMD2 2
  18. #define MMC_CMD3 3
  19. #define MMC_CMD5 5
  20. #define MMC_CMD6 6
  21. #define MMC_CMD7 7
  22. #define MMC_CMD8 8
  23. #define MMC_CMD9 9
  24. #define MMC_CMD11 11
  25. #define MMC_CMD12 12
  26. #define MMC_CMD13 13
  27. #define MMC_CMD16 16
  28. #define MMC_CMD17 17
  29. #define MMC_CMD18 18
  30. #define MMC_CMD19 19
  31. #define MMC_CMD21 21
  32. #define MMC_CMD23 23
  33. #define MMC_CMD24 24
  34. #define MMC_CMD25 25
  35. #define MMC_CMD32 32
  36. #define MMC_CMD33 33
  37. #define MMC_CMD35 35
  38. #define MMC_CMD36 36
  39. #define MMC_CMD38 38
  40. #define MMC_CMD52 52
  41. #define MMC_CMD53 53
  42. #define MMC_CMD55 55
  43. #define SD_ACMD6 6
  44. #define SD_ACMD13 13
  45. #define SD_ACMD41 41
  46. #define SD_ACMD42 42
  47. #define SD_ACMD51 51
  48. static inline int mmc_op_multi(uint32_t opcode)
  49. {
  50. return opcode == MMC_CMD25 || opcode == MMC_CMD18;
  51. }
  52. #define SDIO0_IRQ 36
  53. #define SDIO1_IRQ 38
  54. #define SDIO2_IRQ 34
  55. #define SDIO0_BASE DW_SDIO1_BASE
  56. #define SDIO1_BASE DW_SDIO0_BASE
  57. #define SDIO2_BASE DW_SDIO2_BASE
  58. #define SDIF_DMA_ADDRESS 0x00
  59. #define SDIF_BLOCK_SIZE 0x04
  60. #define SDIF_MAKE_BLKSZ(dma, blksz) ((((dma) & 0x7) << 12) | ((blksz) & 0xFFF))
  61. #define SDIF_BLOCK_COUNT 0x06
  62. #define SDIF_ARGUMENT 0x08
  63. #define SDIF_TRANSFER_MODE 0x0C
  64. #define SDIF_TRNS_DMA BIT(0)
  65. #define SDIF_TRNS_BLK_CNT_EN BIT(1)
  66. #define SDIF_TRNS_ACMD12 BIT(2)
  67. #define SDIF_TRNS_READ BIT(4)
  68. #define SDIF_TRNS_MULTI BIT(5)
  69. #define SDIF_TRNS_RESP_INT BIT(8)
  70. #define SDIF_COMMAND 0x0E
  71. #define SDIF_CMD_RESP_MASK 0x03
  72. #define SDIF_CMD_CRC 0x08
  73. #define SDIF_CMD_INDEX 0x10
  74. #define SDIF_CMD_DATA 0x20
  75. #define SDIF_CMD_ABORTCMD 0xC0
  76. #define SDIF_CMD_RESP_NONE 0x00
  77. #define SDIF_CMD_RESP_LONG 0x01
  78. #define SDIF_CMD_RESP_SHORT 0x02
  79. #define SDIF_CMD_RESP_SHORT_BUSY 0x03
  80. #define SDIF_MAKE_CMD(c, f) ((((c) & 0xff) << 8) | ((f) & 0xff))
  81. #define SDIF_RESPONSE_01 0x10
  82. #define SDIF_RESPONSE_23 0x14
  83. #define SDIF_RESPONSE_45 0x18
  84. #define SDIF_RESPONSE_67 0x1C
  85. #define SDIF_RESPONSE 0x10
  86. #define SDIF_BUFFER 0x20
  87. #define SDIF_PRESENT_STATE 0x24
  88. #define SDIF_DATA_INHIBIT 0x00000002
  89. #define SDIF_DOING_WRITE 0x00000100
  90. #define SDIF_DOING_READ 0x00000200
  91. #define SDIF_SPACE_AVAILABLE 0x00000400
  92. #define SDIF_DATA_AVAILABLE 0x00000800
  93. #define SDIF_CARD_PRESENT 0x00010000
  94. #define SDIF_WRITE_PROTECT 0x00080000
  95. #define SDIF_DATA_LVL_MASK 0x00F00000
  96. #define SDIF_DATA_LVL_SHIFT 20
  97. #define SDIF_DATA_0_LVL_MASK 0x00100000
  98. #define SDIF_CMD_LVL 0x01000000
  99. #define SDIF_CMD_INHIBIT BIT(0)
  100. #define SDIF_CMD_INHIBIT_DAT BIT(1)
  101. #define SDIF_CARD_INSERTED BIT(16)
  102. #define SDIF_CARD_STABLE BIT(17)
  103. #define SDIF_WR_PROTECT_SW_LVL BIT(19)
  104. #define SDIF_DAT_XFER_WIDTH BIT(1)
  105. #define SDIF_CTRL_SDMA 0x00
  106. #define SDIF_CTRL_HISPD 0x04
  107. #define SDIF_BUS_VOL_VDD1_1_8V 0xC
  108. #define SDIF_BUS_VOL_VDD1_3_0V 0xE
  109. #define SDIF_CTRL_DMA_MASK 0x18
  110. #define SDIF_BUF_DATA_R 0x20
  111. #define SDIF_HOST_CONTROL 0x28
  112. #define SDIF_PWR_CONTROL 0x29
  113. #define SDIF_BLOCK_GAP_CONTROL 0x2A
  114. #define SDIF_WAKE_UP_CONTROL 0x2B
  115. #define SDIF_CLK_CTRL 0x2C
  116. #define SDIF_TOUT_CTRL 0x2E
  117. #define SDIF_SOFTWARE_RESET 0x2F
  118. #define SDIF_RESET_CMD 0x02
  119. #define SDIF_RESET_DATA 0x04
  120. #define SDIF_INT_STATUS 0x30
  121. #define SDIF_ERR_INT_STATUS 0x32
  122. #define SDIF_INT_ENABLE 0x34
  123. #define SDIF_INT_XFER_COMPLETE BIT(1)
  124. #define SDIF_INT_BUF_RD_READY BIT(5)
  125. #define SDIF_INT_STATUS_EN 0x34
  126. #define SDIF_ERR_INT_STATUS_EN 0x36
  127. #define SDIF_SIGNAL_ENABLE 0x38
  128. #define SDIF_ERROR_SIGNAL_ENABLE 0x3A
  129. #define SDIF_AUTO_CMD_STATUS 0x3C
  130. #define SDIF_HOST_CONTROL2 0x3E
  131. #define SDIF_CAPABILITIES 0x40
  132. #define SDIF_CAPABILITIES_1 0x44
  133. #define SDIF_MAX_CURRENT 0x48
  134. #define SDIF_ADMA_ERROR 0x54
  135. #define SDIF_ADMA_ADDRESS 0x58
  136. #define SDIF_ADMA_ADDRESS_HI 0x5C
  137. #define SDIF_SLOT_INT_STATUS 0xFC
  138. #define SDIF_HOST_VERSION 0xFE
  139. #define SDIF_INT_XFER_COMPLETE_EN BIT(1)
  140. #define SDIF_INT_DMA_END_EN BIT(3)
  141. #define SDIF_INT_ERROR_EN BIT(15)
  142. #define SDIF_HOST_ADMA2_LEN_MODE BIT(10)
  143. #define SDIF_CTRL_UHS_MASK 0x0007
  144. #define SDIF_CTRL_UHS_SDR12 0x0000
  145. #define SDIF_CTRL_UHS_SDR25 0x0001
  146. #define SDIF_CTRL_UHS_SDR50 0x0002
  147. #define SDIF_CTRL_UHS_SDR104 0x0003
  148. #define SDIF_CTRL_UHS_DDR50 0x0004
  149. #define SDIF_CTRL_HS400 0x0005 /* Non-standard */
  150. #define SDIF_CTRL_DRV_TYPE_MASK 0x0030
  151. #define SDIF_CTRL_DRV_TYPE_B 0x0000
  152. #define SDIF_CTRL_DRV_TYPE_A 0x0010
  153. #define SDIF_CTRL_DRV_TYPE_C 0x0020
  154. #define SDIF_CTRL_DRV_TYPE_D 0x0030
  155. #define SDIF_CTRL_EXEC_TUNING 0x0040
  156. #define SDIF_CTRL_TUNED_CLK 0x0080
  157. #define SDIF_CTRL_PRESET_VAL_ENABLE 0x8000
  158. #define SDIF_GET_CMD(c) ((c>>8) & 0x3f)
  159. #define SDIF_INT_RESPONSE 0x00000001
  160. #define SDIF_INT_DATA_END 0x00000002
  161. #define SDIF_INT_BLK_GAP 0x00000004
  162. #define SDIF_INT_DMA_END 0x00000008
  163. #define SDIF_INT_SPACE_AVAIL 0x00000010
  164. #define SDIF_INT_DATA_AVAIL 0x00000020
  165. #define SDIF_INT_CARD_INSERT 0x00000040
  166. #define SDIF_INT_CARD_REMOVE 0x00000080
  167. #define SDIF_INT_CARD_INT 0x00000100
  168. #define SDIF_INT_RETUNE 0x00001000
  169. #define SDIF_INT_ERROR 0x00008000
  170. #define SDIF_INT_TIMEOUT 0x00010000
  171. #define SDIF_INT_CRC 0x00020000
  172. #define SDIF_INT_END_BIT 0x00040000
  173. #define SDIF_INT_INDEX 0x00080000
  174. #define SDIF_INT_DATA_TIMEOUT 0x00100000
  175. #define SDIF_INT_DATA_CRC 0x00200000
  176. #define SDIF_INT_DATA_END_BIT 0x00400000
  177. #define SDIF_INT_BUS_POWER 0x00800000
  178. #define SDIF_INT_ACMD12ERR 0x01000000
  179. #define SDIF_INT_ADMA_ERROR 0x02000000
  180. #define SDIF_INT_CMD_MASK (SDIF_INT_RESPONSE | SDIF_INT_TIMEOUT | \
  181. SDIF_INT_CRC | SDIF_INT_END_BIT | SDIF_INT_INDEX)
  182. #define SDIF_INT_DATA_MASK (SDIF_INT_DATA_END | SDIF_INT_DMA_END | \
  183. SDIF_INT_DATA_AVAIL | SDIF_INT_SPACE_AVAIL | \
  184. SDIF_INT_DATA_TIMEOUT | SDIF_INT_DATA_CRC | \
  185. SDIF_INT_DATA_END_BIT | SDIF_INT_ADMA_ERROR | \
  186. SDIF_INT_BLK_GAP)
  187. #define SDIF_HOST_VER4_ENABLE BIT(12)
  188. #define SDIF_CAPABILITIES1 0x40
  189. #define SDIF_CAPABILITIES2 0x44
  190. #define SDIF_ADMA_SA_LOW 0x58
  191. #define SDIF_ADMA_SA_HIGH 0x5C
  192. #define SDIF_HOST_CNTRL_VERS 0xFE
  193. #define SDIF_UHS_2_TIMER_CNTRL 0xC2
  194. #define P_VENDOR_SPECIFIC_AREA 0xE8
  195. #define P_VENDOR2_SPECIFIC_AREA 0xEA
  196. #define VENDOR_SD_CTRL 0x2C
  197. #define DEFAULT_DIV_SD_INIT_CLOCK 0x2
  198. /*execute tuning register and bit flag*/
  199. #define SDIF_PHY_TX_RX_DLY 0x40
  200. #define SDIF_PHY_CONFIG 0x4c
  201. /*SDIO 0 register and bit flag*/
  202. #define REG_SDIO0_PAD_MASK (0xFFFFFFF3)
  203. #define REG_SDIO0_PAD_SHIFT (2)
  204. #define REG_SDIO0_CD_PAD_REG (PINMUX_BASE + 0x900)
  205. #define REG_SDIO0_CD_PAD_VALUE (1)
  206. #define REG_SDIO0_PWR_EN_PAD_REG (PINMUX_BASE + 0x904)
  207. #define REG_SDIO0_PWR_EN_PAD_VALUE (2)
  208. #define REG_SDIO0_CLK_PAD_REG (PINMUX_BASE + 0xA00)
  209. #define REG_SDIO0_CLK_PAD_VALUE (2)
  210. #define REG_SDIO0_CMD_PAD_REG (PINMUX_BASE + 0xA04)
  211. #define REG_SDIO0_CMD_PAD_VALUE (1)
  212. #define REG_SDIO0_DAT0_PAD_REG (PINMUX_BASE + 0xA08)
  213. #define REG_SDIO0_DAT0_PAD_VALUE (1)
  214. #define REG_SDIO0_DAT1_PAD_REG (PINMUX_BASE + 0xA0C)
  215. #define REG_SDIO0_DAT1_PAD_VALUE (1)
  216. #define REG_SDIO0_DAT2_PAD_REG (PINMUX_BASE + 0xA10)
  217. #define REG_SDIO0_DAT2_PAD_VALUE (1)
  218. #define REG_SDIO0_DAT3_PAD_REG (PINMUX_BASE + 0xA14)
  219. #define REG_SDIO0_DAT3_PAD_VALUE (1)
  220. #define REG_SDIO0_CD_PIO_REG (PINMUX_BASE + 0x34)
  221. #define REG_SDIO0_CD_PIO_VALUE (0x3)
  222. #define REG_SDIO0_PWR_EN_PIO_REG (PINMUX_BASE + 0x38)
  223. #define REG_SDIO0_PWR_EN_PIO_VALUE (0x0)
  224. #define REG_SDIO0_CLK_PIO_REG (PINMUX_BASE + 0x1C)
  225. #define REG_SDIO0_CLK_PIO_VALUE (0x0)
  226. #define REG_SDIO0_CMD_PIO_REG (PINMUX_BASE + 0x20)
  227. #define REG_SDIO0_CMD_PIO_VALUE (0x0)
  228. #define REG_SDIO0_DAT0_PIO_REG (PINMUX_BASE + 0x24)
  229. #define REG_SDIO0_DAT0_PIO_VALUE (0x0)
  230. #define REG_SDIO0_DAT1_PIO_REG (PINMUX_BASE + 0x28)
  231. #define REG_SDIO0_DAT1_PIO_VALUE (0x0)
  232. #define REG_SDIO0_DAT2_PIO_REG (PINMUX_BASE + 0x2C)
  233. #define REG_SDIO0_DAT2_PIO_VALUE (0x0)
  234. #define REG_SDIO0_DAT3_PIO_REG (PINMUX_BASE + 0x30)
  235. #define REG_SDIO0_DAT3_PIO_VALUE (0x0)
  236. /*SDIO 1 register and bit flag*/
  237. #define RTCIO_BASE (0x5027000)
  238. #define REG_SDIO1_PAD_MASK (0xFFFFFFF3)
  239. #define REG_SDIO1_PAD_SHIFT (2)
  240. #define REG_SDIO1_CLK_PAD_REG (RTCIO_BASE + 0x6C)
  241. #define REG_SDIO1_CLK_PAD_VALUE (2)
  242. #define REG_SDIO1_CMD_PAD_REG (RTCIO_BASE + 0x68)
  243. #define REG_SDIO1_CMD_PAD_VALUE (1)
  244. #define REG_SDIO1_DAT0_PAD_REG (RTCIO_BASE + 0x64)
  245. #define REG_SDIO1_DAT0_PAD_VALUE (1)
  246. #define REG_SDIO1_DAT1_PAD_REG (RTCIO_BASE + 0x60)
  247. #define REG_SDIO1_DAT1_PAD_VALUE (1)
  248. #define REG_SDIO1_DAT2_PAD_REG (RTCIO_BASE + 0x5C)
  249. #define REG_SDIO1_DAT2_PAD_VALUE (1)
  250. #define REG_SDIO1_DAT3_PAD_REG (RTCIO_BASE + 0x58)
  251. #define REG_SDIO1_DAT3_PAD_VALUE (1)
  252. #define REG_SDIO1_CLK_PIO_REG (PINMUX_BASE + 0xE4)
  253. #define REG_SDIO1_CLK_PIO_VALUE (0x0)
  254. #define REG_SDIO1_CMD_PIO_REG (PINMUX_BASE + 0xE0)
  255. #define REG_SDIO1_CMD_PIO_VALUE (0x0)
  256. #define REG_SDIO1_DAT0_PIO_REG (PINMUX_BASE + 0xDC)
  257. #define REG_SDIO1_DAT0_PIO_VALUE (0x0)
  258. #define REG_SDIO1_DAT1_PIO_REG (PINMUX_BASE + 0xD8)
  259. #define REG_SDIO1_DAT1_PIO_VALUE (0x0)
  260. #define REG_SDIO1_DAT2_PIO_REG (PINMUX_BASE + 0xD4)
  261. #define REG_SDIO1_DAT2_PIO_VALUE (0x0)
  262. #define REG_SDIO1_DAT3_PIO_REG (PINMUX_BASE + 0xD0)
  263. #define REG_SDIO1_DAT3_PIO_VALUE (0x0)
  264. #define RTC_CTRL_BASE 0x5025000
  265. #define RTCSYS_CLKMUX (RTC_CTRL_BASE + 0x1C)
  266. #define RTCSYS_CLKBYP (RTC_CTRL_BASE + 0x30)
  267. #define RTCSYS_MCU51_ICTRL1 (RTC_CTRL_BASE + 0x7C)
  268. #define RTCSYS_CTRL_BASE 0x03000000
  269. #define RTCSYS_CTRL (RTCSYS_CTRL_BASE + 0x248)
  270. /*SDIO 2 register and bit flag*/
  271. #define REG_SDIO2_PAD_MASK (0xFFFFFFF3)
  272. #define REG_SDIO2_PAD_SHIFT (2)
  273. #define REG_SDIO2_RSTN_PAD_REG (PINMUX_BASE + 0x914)
  274. #define REG_SDIO2_RSTN_PAD_VALUE (1)
  275. #define REG_SDIO2_CLK_PAD_REG (PINMUX_BASE + 0x91C)
  276. #define REG_SDIO2_CLK_PAD_VALUE (2)
  277. #define REG_SDIO2_CMD_PAD_REG (PINMUX_BASE + 0x928)
  278. #define REG_SDIO2_CMD_PAD_VALUE (1)
  279. #define REG_SDIO2_DAT0_PAD_REG (PINMUX_BASE + 0x920)
  280. #define REG_SDIO2_DAT0_PAD_VALUE (1)
  281. #define REG_SDIO2_DAT1_PAD_REG (PINMUX_BASE + 0x92C)
  282. #define REG_SDIO2_DAT1_PAD_VALUE (1)
  283. #define REG_SDIO2_DAT2_PAD_REG (PINMUX_BASE + 0x918)
  284. #define REG_SDIO2_DAT2_PAD_VALUE (1)
  285. #define REG_SDIO2_DAT3_PAD_REG (PINMUX_BASE + 0x924)
  286. #define REG_SDIO2_DAT3_PAD_VALUE (1)
  287. #define REG_SDIO2_RSTN_PIO_REG (PINMUX_BASE + 0x48)
  288. #define REG_SDIO2_RSTN_PIO_VALUE (0x0)
  289. #define REG_SDIO2_CLK_PIO_REG (PINMUX_BASE + 0x50)
  290. #define REG_SDIO2_CLK_PIO_VALUE (0x0)
  291. #define REG_SDIO2_CMD_PIO_REG (PINMUX_BASE + 0x5C)
  292. #define REG_SDIO2_CMD_PIO_VALUE (0x0)
  293. #define REG_SDIO2_DAT0_PIO_REG (PINMUX_BASE + 0x54)
  294. #define REG_SDIO2_DAT0_PIO_VALUE (0x0)
  295. #define REG_SDIO2_DAT1_PIO_REG (PINMUX_BASE + 0x60)
  296. #define REG_SDIO2_DAT1_PIO_VALUE (0x0)
  297. #define REG_SDIO2_DAT2_PIO_REG (PINMUX_BASE + 0x4C)
  298. #define REG_SDIO2_DAT2_PIO_VALUE (0x0)
  299. #define REG_SDIO2_DAT3_PIO_REG (PINMUX_BASE + 0x58)
  300. #define REG_SDIO2_DAT3_PIO_VALUE (0x0)
  301. #define MMC_SDIO0_PLL_REGISTER 0x3002070
  302. #define MMC_SDIO1_PLL_REGISTER 0x300207C
  303. #define MMC_SDIO2_PLL_REGISTER 0x3002064
  304. #define MMC_MAX_CLOCK_DIV_VALUE (0x40009)
  305. #define CLOCK_BYPASS_SELECT_REGISTER (0x3002030)
  306. #endif /* __HAL_DW_SDIO_H_ */