1
0

hpm_sdxc_drv.h 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237
  1. /*
  2. * Copyright (c) 2021-2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_SDXC_DRV_H
  8. #define HPM_SDXC_DRV_H
  9. /**
  10. *
  11. * @brief SDXC driver APIs
  12. * @defgroup sdxc_interface SDXC driver APIs
  13. * @ingroup sdxc_interfaces
  14. * @{
  15. *
  16. */
  17. #include "hpm_common.h"
  18. #include "hpm_sdxc_regs.h"
  19. #include "hpm_sdxc_soc_drv.h"
  20. /**
  21. * @brief Generic Definitions
  22. * @note:
  23. * If the Host support 1.8V, it means:
  24. * 1. For SD card, it supports:
  25. * - SDR12
  26. * - SDR25
  27. * - SDR50
  28. * - SDR104
  29. * - DDR50
  30. * 2. For eMMC, it supports:
  31. * - DDR50
  32. * - HS200
  33. * - HS400 (if 8-bit is supported as well)
  34. */
  35. #define SDXC_HOST_SUPPORT_1V8 (1UL << 0) /**< SDXC Host support 1.8v */
  36. #define SDXC_HOST_SUPPORT_4BIT (1UL << 1) /**< SDXC Host support 4bit */
  37. #define SDXC_HOST_SUPPORT_8BIT (1UL << 2) /**< SDXC Host support 8bit */
  38. #define SDXC_HOST_SUPPORT_EMMC (1UL << 3) /**< SDXC Host support EMMC */
  39. /**
  40. * @brief SDXC Pin features
  41. */
  42. #define SDXC_HOST_SUPPORT_CD (1UL << 16) /**< SDXC Host support Card detection */
  43. #define SDXC_HOST_SUPPORT_VSEL (1UL << 17) /**< SDXC Host support Voltage Selection */
  44. #define SDXC_HOST_SUPPORT_PWR (1UL << 18) /**< SDXC Host support Power Switch */
  45. #define SDXC_HOST_SUPPORT_WP (1UL << 19) /**< SDXC Host support Write Protection */
  46. #define SDXC_HOST_SUPPORT_RST (1UL << 20) /**< SDXC Host support Reset Pin */
  47. #define SDXC_HOST_SUPPORT_DS (1UL << 21) /**< SDXC Host support Data Strobe */
  48. /**
  49. * @brief SDXC Pin is native or from GPIO
  50. */
  51. #define SDXC_HOST_CD_IN_IP (SDXC_HOST_SUPPORT_CD << 8) /**< Card detection is controlled by IP */
  52. #define SDXC_HOST_VSEL_IN_IP (SDXC_HOST_SUPPORT_VSEL << 8) /**< Voltage selection is controlled by IP */
  53. #define SDXC_HOST_PWR_IN_IP (SDXC_HOST_SUPPORT_PWR << 8) /**< Power switch is controlled by IP */
  54. #define SDXC_HOST_WP_IN_IP (SDXC_HOST_SUPPORT_WP << 8) /**< Write protection is controlled by IP */
  55. #define SDXC_HOST_RST_IN_IP (SDXC_HOST_SUPPORT_RST << 8) /**< Reset Pin is controlled by IP */
  56. /**
  57. * @brief SDXC GPIO pin polarity
  58. * If polarity is 0, it means:
  59. * GPIO level 0 means disabled, 1 means enabled
  60. * If polarity is 1, it meansL:
  61. * GPIO level 0 means enabled, 1 means disabled
  62. */
  63. #define SDXC_HOST_VSEL_PIN_POLARITY (SDXC_HOST_SUPPORT_CD << 16)
  64. #define SDXC_HOST_CD_PIN_POLARITY (SDXC_HOST_VSEL_IN_IP << 16)
  65. #define SDXC_HOST_PWR_PIN_POLARITY (SDXC_HOST_SUPPORT_PWR << 16)
  66. #define SDXC_HOST_WP_PIN_POLARITY (SDXC_HOST_SUPPORT_WP << 16)
  67. #define SDXC_HOST_RST_IN_POLARITY (SDXC_HOST_SUPPORT_DS << 16)
  68. /**
  69. * @brief Command Response Type Selection
  70. */
  71. #define SDXC_CMD_RESP_TYPE_NO_RESP (0U) /**< No Response */
  72. #define SDXC_CMD_RESP_TYPE_RESP_LEN_136 (1U) /**< Response Length 136 */
  73. #define SDXC_CMD_RESP_TYPE_RESP_LEN_48 (2U) /**< Response Length 48 */
  74. #define SDXC_CMD_RESP_TYPE_RESP_LEN_48B (3U) /**< Response Length 48; Check busy after response */
  75. #define SDXC_STS_CMD_ERR (SDXC_INT_STAT_CMD_TOUT_ERR_MASK | SDXC_INT_STAT_CMD_CRC_ERR_MASK |\
  76. SDXC_INT_STAT_CMD_END_BIT_ERR_MASK | SDXC_INT_STAT_CMD_IDX_ERR_MASK | SDXC_INT_STAT_AUTO_CMD_ERR_MASK)
  77. #define SDXC_STS_DATA_ERR (SDXC_INT_STAT_DATA_TOUT_ERR_MASK | SDXC_INT_STAT_DATA_CRC_ERR_MASK | \
  78. SDXC_INT_STAT_DATA_END_BIT_ERR_MASK)
  79. #define SDXC_STS_CARD_ERR (SDXC_INT_STAT_CARD_REMOVAL_MASK)
  80. #define SDXC_STS_ERROR (SDXC_INT_STAT_ERR_INTERRUPT_MASK | SDXC_STS_CMD_ERR | SDXC_STS_DATA_ERR | SDXC_STS_CARD_ERR)
  81. #define SDXC_STS_CMD_FLAGS (SDXC_STS_CMD_ERR | SDXC_INT_STAT_CMD_COMPLETE_MASK)
  82. #define SDXC_STS_ALL_FLAGS (SDXC_INT_STAT_ERR_INTERRUPT_MASK | SDXC_INT_STAT_CQE_EVENT_MASK | \
  83. SDXC_INT_STAT_FX_EVENT_MASK | SDXC_INT_STAT_RE_TUNE_EVENT_MASK | SDXC_INT_STAT_CARD_INTERRUPT_MASK | \
  84. SDXC_INT_STAT_CARD_REMOVAL_MASK | SDXC_INT_STAT_CARD_INSERTION_MASK | SDXC_INT_STAT_BUF_RD_READY_MASK | \
  85. SDXC_INT_STAT_BUF_WR_READY_MASK | SDXC_INT_STAT_DMA_INTERRUPT_MASK | SDXC_INT_STAT_BGAP_EVENT_MASK | \
  86. SDXC_INT_STAT_XFER_COMPLETE_MASK | SDXC_INT_STAT_CMD_COMPLETE_MASK | SDXC_INT_STAT_BOOT_ACK_ERR_MASK | \
  87. SDXC_INT_STAT_RESP_ERR_MASK | SDXC_INT_STAT_TUNING_ERR_MASK | SDXC_INT_STAT_ADMA_ERR_MASK | \
  88. SDXC_INT_STAT_AUTO_CMD_ERR_MASK | SDXC_INT_STAT_CUR_LMT_ERR_MASK | SDXC_INT_STAT_DATA_END_BIT_ERR_MASK |\
  89. SDXC_INT_STAT_DATA_CRC_ERR_MASK | SDXC_INT_STAT_DATA_TOUT_ERR_MASK | SDXC_INT_STAT_CMD_IDX_ERR_MASK |\
  90. SDXC_INT_STAT_CMD_END_BIT_ERR_MASK | SDXC_INT_STAT_CMD_CRC_ERR_MASK | SDXC_INT_STAT_CMD_TOUT_ERR_MASK)
  91. /**
  92. * @brief Software reset flag definitions
  93. */
  94. typedef enum _sdxc_software_reset {
  95. sdxc_reset_all, /**< Reset both command line and data line */
  96. sdxc_reset_cmd_line, /**< Reset command line */
  97. sdxc_reset_data_line, /**< Reset data line */
  98. } sdxc_sw_reset_type_t;
  99. /**
  100. * @brief SDXC Bus voltage options
  101. */
  102. typedef enum _sdxc_bus_voltage_option {
  103. sdxc_bus_voltage_sd_1v8 = 0x01U,
  104. sdxc_bus_voltage_sd_3v3 = 0x00U,
  105. sdxc_bus_voltage_emmc_1v8 = 0x01U,
  106. sdxc_bus_voltage_emmc_3v3 = 0x00U,
  107. } sdxc_bus_voltage_option_t;
  108. /**
  109. * @brief SDXC wakeup events
  110. */
  111. typedef enum _sdxc_wakeup_event {
  112. sdxc_wakeup_card_removal = 0x4U, /**< Wake-up event: Card removal */
  113. sdxc_wakeup_card_insert = 0x02U, /**< Wake-up event: Card insertion */
  114. sdxc_wakeup_card_interrupt = 0x01U, /**< Wake-up event: Card interrupt */
  115. } sdxc_wakeup_event_t;
  116. /**
  117. * @brief SDXC DMA types
  118. */
  119. typedef enum _sdxc_dma_type {
  120. sdxc_dmasel_sdma = 0U, /**< SDXC DMA type: SDMA */
  121. sdxc_dmasel_adma2 = 2U, /**< SDXC DMA type: ADMA2 */
  122. sdxc_dmasel_adma2_or_3 = 3U, /**< SDXC DMA type: ADMA2 or ADMA3 */
  123. sdxc_dmasel_nodma = 0xFU,
  124. } sdxc_dma_type_t;
  125. /**
  126. * @brief SDXC Bus width options
  127. */
  128. typedef enum _sdxc_bus_width {
  129. sdxc_bus_width_1bit, /**< SDXC bus width: 1 bit */
  130. sdxc_bus_width_4bit, /**< SDXC bus width: 4 bits */
  131. sdxc_bus_width_8bit, /**< SDXC bus width: 8 bits */
  132. } sdxc_bus_width_t;
  133. /**
  134. * @brief SDXC Speed mode options
  135. */
  136. typedef enum _sdxc_speed_mode {
  137. sdxc_sd_speed_sdr12 = 0U, /**< SDXC speed: SDR12 */
  138. sdxc_sd_speed_sdr25 = 1U, /**< SDXC speed: SDR25 */
  139. sdxc_sd_speed_sdr50 = 2U, /**< SDXC speed: SDR50 */
  140. sdxc_sd_speed_sdr104 = 3U, /**< SDXC speed: SDR104 */
  141. sdxc_sd_speed_ddr50 = 4U, /**< SDXC speed: DDR50 */
  142. sdxc_sd_speed_normal = sdxc_sd_speed_sdr12, /**< SDXC speed: Normal Speed */
  143. sdxc_sd_speed_high = sdxc_sd_speed_sdr25, /**< SDXC speed: High Speed */
  144. sdxc_emmc_speed_legacy = 0U, /**< SDXC speed: MMC legacy speed */
  145. sdxc_emmc_speed_high_speed_sdr = 1U, /**< SDXC speed: MMC High Speed */
  146. sdxc_emmc_speed_hs200 = 3U, /**< SDXC speed: MMC HS200 speed */
  147. sdxc_emmc_speed_high_speed_ddr = 4U, /**< SDXC speed: MMC High Speed DDR */
  148. sdxc_emmc_speed_hs400 = 7U, /**< SDXC speed: MMC HS400 */
  149. sdxc_sdmmc_speed_card_init = 0x10,
  150. } sdxc_speed_mode_t;
  151. /**
  152. * @brief SDXC auto command types
  153. */
  154. typedef enum _sdxc_auto_cmd_sel {
  155. sdxc_auto_cmd_disabled = 0U, /**< Auto Command type: Disabled */
  156. sdxc_auto_cmd12_enabled = 1U, /**< Auto Command type: CMD12 enabled */
  157. sdxc_auto_cmd23_enabled = 2U, /**< Auto Command type: CMD23 enabled */
  158. sdxc_auto_cmd_auto_select = 3U, /**< Auto Command type: Auto selected */
  159. } sdxc_auto_cmd_sel_t;
  160. /**
  161. * @brief SDXC transfer direction options
  162. */
  163. typedef enum _sdxc_xfer_direction {
  164. sdxc_xfer_dir_write = 0,
  165. sdxc_xfer_dir_read = 1,
  166. } sdxc_xfer_direction_t;
  167. /**
  168. * @brief SDXC Command types
  169. */
  170. typedef enum _sdxc_command_type {
  171. sdxc_cmd_type_normal_cmd = 0U,
  172. sdxc_cmd_type_suspend_cmd = 1U,
  173. sdxc_cmd_tye_resume_cmd = 2U,
  174. sdxc_cmd_type_abort_cmd = 3U,
  175. sdxc_cmd_type_empty = 4U,
  176. } sdxc_command_type_t;
  177. /**
  178. * @brief Command Type
  179. */
  180. #define SDXC_CMD_TYPE_NORMAL (0UL << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  181. #define SDXC_CMD_TYPE_SUSPEND (1UL << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  182. #define SDXC_CMD_TYPE_RESUME (2UL << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  183. #define SDXC_CMD_TYPE_ABORT (3UL << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  184. /**
  185. * @brief SDXC boot mode types
  186. */
  187. typedef enum _sdxc_boot_mode {
  188. sdxc_boot_mode_normal = 0,
  189. sdxc_boot_mode_alternative = 1,
  190. } sdxc_boot_mode_t;
  191. /**
  192. * @brief SDXC response types
  193. */
  194. typedef enum _sdxc_response_type {
  195. sdxc_response_type_no_resp = 0,
  196. sdxc_response_type_resp_len_136bit = 1,
  197. sdxc_response_type_resp_len_48bit = 2,
  198. sdxc_response_type_resp_len_48bit_check_busy = 3,
  199. } sdxc_response_type_t;
  200. #define SDXC_CMD_RESP_NO_RESPONSE (0UL << SDXC_CMD_XFER_RESP_TYPE_SELECT_SHIFT)
  201. #define SDXC_CMD_RESP_LEN_136 (1UL << SDXC_CMD_XFER_RESP_TYPE_SELECT_SHIFT)
  202. #define SDXC_CMD_RESP_LEN_48 (2UL << SDXC_CMD_XFER_RESP_TYPE_SELECT_SHIFT)
  203. #define SDXC_CMD_RESP_LEN_48B (3UL << SDXC_CMD_XFER_RESP_TYPE_SELECT_SHIFT)
  204. #define SDXC_CMD_CMD_IS_MAIN_CMD (0U)
  205. #define SDXC_CMD_CMD_IS_SUB_CMD (SDXC_CMD_XFER_SUB_CMD_FLAG_MASK)
  206. #define SDXC_CMD_CMD_CRC_CHK_EN (SDXC_CMD_XFER_CMD_CRC_CHK_ENABLE_MASK)
  207. #define SDXC_CMD_CMD_CRC_CHK_DIS (0U)
  208. #define SDXC_CMD_CMD_IDX_CHK_EN (SDXC_CMD_XFER_CMD_IDX_CHK_ENABLE_MASK)
  209. #define SDXC_CMD_CMD_IDX_CHK_DIS (0U)
  210. #define SDXC_CMD_DATA_PRESENT (SDXC_CMD_XFER_DATA_PRESENT_SEL_MASK)
  211. #define SDXC_CMD_DATA_NO_PRESENT (0U)
  212. #define SDXC_CMD_CMD_TYPE_NORMAL (0U)
  213. #define SDXC_CMD_CMD_TYPE_SUSPEND (1UL << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  214. #define SDXC_CMD_CMD_TYPE_RESUME (2U << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  215. #define SDXC_CMD_CMD_TYPE_ABORT (3U << SDXC_CMD_XFER_CMD_TYPE_SHIFT)
  216. /**
  217. * @brief SDXC error codes
  218. */
  219. enum {
  220. status_sdxc_busy = MAKE_STATUS(status_group_sdxc, 0), /**< SDXC is busy */
  221. status_sdxc_error = MAKE_STATUS(status_group_sdxc, 1), /**< SDXC error */
  222. status_sdxc_send_cmd_failed = MAKE_STATUS(status_group_sdxc, 2), /**< SDXC command failed */
  223. status_sdxc_cmd_timeout_error = MAKE_STATUS(status_group_sdxc, 3), /**< SDXC command timed out */
  224. status_sdxc_cmd_crc_error = MAKE_STATUS(status_group_sdxc, 4), /**< SDXC command CRC error */
  225. status_sdxc_cmd_end_bit_error = MAKE_STATUS(status_group_sdxc, 5), /**< SDXC command end bit error */
  226. status_sdxc_cmd_index_error = MAKE_STATUS(status_group_sdxc, 6), /**< SDXC command index error */
  227. status_sdxc_data_timeout_error = MAKE_STATUS(status_group_sdxc, 7), /**< SDXC data timeout error */
  228. status_sdxc_data_crc_error = MAKE_STATUS(status_group_sdxc, 8), /**< SDXC data CRC error */
  229. status_sdxc_data_end_bit_error = MAKE_STATUS(status_group_sdxc, 9), /**< SDXC data end bit error */
  230. status_sdxc_auto_cmd_error = MAKE_STATUS(status_group_sdxc, 10), /**< SDXC auto command error */
  231. status_sdxc_adma_error = MAKE_STATUS(status_group_sdxc, 11), /**< SDXC ADMA error */
  232. status_sdxc_tuning_error = MAKE_STATUS(status_group_sdxc, 12), /**< SDXC tuning error */
  233. status_sdxc_response_error = MAKE_STATUS(status_group_sdxc, 13), /**< SDXC response error */
  234. status_sdxc_boot_ack_error = MAKE_STATUS(status_group_sdxc, 14), /**< SDXC boot ack error */
  235. status_sdxc_retuning_request = MAKE_STATUS(status_group_sdxc, 15), /**< SDXC retuning request */
  236. /* SDXC Auto CMD12 command not executed */
  237. status_sdxc_autocmd_cmd12_not_exec = MAKE_STATUS(status_group_sdxc, 16),
  238. status_sdxc_autocmd_cmd_timeout_error = MAKE_STATUS(status_group_sdxc, 17), /**< SDXC Auto CMD timed out */
  239. status_sdxc_autocmd_cmd_crc_error = MAKE_STATUS(status_group_sdxc, 18), /**< SDXC Auto CMD crc error */
  240. status_sdxc_autocmd_end_bit_error = MAKE_STATUS(status_group_sdxc, 19), /**< SDXC Auto CMD end bit error */
  241. status_sdxc_autocmd_cmd_index_error = MAKE_STATUS(status_group_sdxc, 20), /**< SDXC Auto CMD index error */
  242. status_sdxc_autocmd_cmd_response_error = MAKE_STATUS(status_group_sdxc, 21), /**< SDXC Auto CMD response error */
  243. /* SDXC Auto CMD not issued auto CMD12 */
  244. status_sdxc_autocmd_cmd_not_issued_auto_cmd12 = MAKE_STATUS(status_group_sdxc, 22),
  245. /**< SDXC unsupported operation */
  246. status_sdxc_unsupported = MAKE_STATUS(status_group_sdxc, 23),
  247. status_sdxc_transfer_data_completed = MAKE_STATUS(status_group_sdxc, 24), /**< SDXC transfer data completed */
  248. status_sdxc_send_cmd_successful = MAKE_STATUS(status_group_sdxc, 25), /**< SDXC send command succeeded */
  249. status_sdxc_transfer_dma_completed = MAKE_STATUS(status_group_sdxc, 26), /**< SDXC transfer DMA completed */
  250. status_sdxc_transfer_data_failed = MAKE_STATUS(status_group_sdxc, 27), /**< SDXC transfer data failed */
  251. status_sdxc_dma_addr_unaligned = MAKE_STATUS(status_group_sdxc, 28), /**< SDXC DMA address unaligned */
  252. status_sdxc_tuning_failed = MAKE_STATUS(status_group_sdxc, 29), /**< SDXC tuning failed */
  253. status_sdxc_card_removed = MAKE_STATUS(status_group_sdxc, 30), /**< SDXC Card removed */
  254. status_sdxc_non_recoverable_error = MAKE_STATUS(status_group_sdxc, 30), /**< SDXC non-recoverable error */
  255. status_sdxc_recoverable_error = MAKE_STATUS(status_group_sdxc, 31), /**< SDXC recoverable error */
  256. };
  257. /**
  258. * @brief SDXC Capacities
  259. */
  260. typedef struct {
  261. union {
  262. struct {
  263. uint32_t tout_clk_freq: 6; /**< Timeout clock frequency */
  264. uint32_t : 1;
  265. uint32_t tout_clk_unit: 1; /**< Timeout clock unit */
  266. uint32_t base_clk_freq: 8; /**< Base clock frequency */
  267. uint32_t max_blk_len: 2; /**< Maximum Block length */
  268. uint32_t embedded_8_bit_support: 1; /**< Embedded 8-bit support */
  269. uint32_t adma2_support: 1; /**< ADMA2 support */
  270. uint32_t : 1;
  271. uint32_t high_speed_support: 1; /**< High speed support */
  272. uint32_t sdma_support: 1; /**< SDMA support */
  273. uint32_t suspend_resume_support: 1; /**< Suspend resume support */
  274. uint32_t voltage_3v3_support: 1; /**< 3.3v support */
  275. uint32_t voltage_3v0_support: 1; /**< 3.0v support */
  276. uint32_t voltage_1v8_support: 1; /**< 1.8v support */
  277. uint32_t sys_addr_64_bit_v4_support: 1; /**< SD Host Version 4 support */
  278. uint32_t sys_addr_64_bit_v3_support: 1; /**< SD Host Version 3 support */
  279. uint32_t asysnc_interrupt_support: 1; /**< Asynchronous interrupt support */
  280. uint32_t slot_type_r: 2; /**< Slot type */
  281. };
  282. uint32_t U;
  283. } capabilities1;
  284. union {
  285. struct {
  286. uint32_t sdr50_support: 1; /**< SDR50 support */
  287. uint32_t sdr104_support: 1; /**< SDR104 support */
  288. uint32_t ddr50_support: 1; /**< DDR50 support */
  289. uint32_t uhs2_support: 1; /**< UHS2 support */
  290. uint32_t drv_type_a: 1; /**< Drive TypeA support */
  291. uint32_t drv_type_c: 1; /**< Drive TypeC support */
  292. uint32_t drv_type_d: 1; /**< Drive TypeD support */
  293. uint32_t reserved0: 1;
  294. uint32_t retune_cnt: 4; /**< Retune count support */
  295. uint32_t : 1;
  296. uint32_t use_tuning_sdr50: 1; /**< Use tuning sdr50 support */
  297. uint32_t re_tuning_modes: 2; /**< Retune modes */
  298. uint32_t clk_mul: 8; /**< Clock multiplier */
  299. uint32_t : 3;
  300. uint32_t adma3_support: 1; /**< ADMA3 support */
  301. uint32_t vdd2_1v8_support: 1; /**< VDD2 1v8 support */
  302. uint32_t : 3;
  303. };
  304. uint32_t U;
  305. } capabilities2;
  306. union {
  307. struct {
  308. uint32_t max_current_3v3: 8; /**< Maximum current at 3.3V */
  309. uint32_t max_current_3v0: 8; /**< Maximum current at 3.0V */
  310. uint32_t max_current_1v8: 8; /**< Maximum current at 1.8V */
  311. uint32_t reserved: 8;
  312. };
  313. uint32_t U;
  314. } curr_capabilities1;
  315. union {
  316. struct {
  317. uint32_t max_current_vdd2_1v8: 8; /**< Maximum current at VDD2 1.8V */
  318. uint32_t reserved: 24;
  319. };
  320. uint32_t U;
  321. } curr_capabilities2;
  322. } sdxc_capabilities_t;
  323. /**
  324. * @brief SDXC Device response type
  325. */
  326. typedef enum _sdxc_dev_resp_type {
  327. sdxc_dev_resp_none = 0,
  328. sdxc_dev_resp_r1,
  329. sdxc_dev_resp_r1b,
  330. sdxc_dev_resp_r2,
  331. sdxc_dev_resp_r3,
  332. sdxc_dev_resp_r4,
  333. sdxc_dev_resp_r5,
  334. sdxc_dev_resp_r5b,
  335. sdxc_dev_resp_r6,
  336. sdxc_dev_resp_r7,
  337. } sdxc_dev_resp_type_t;
  338. /**
  339. * @brief SDXC command structure
  340. */
  341. typedef struct _sdxc_command {
  342. uint32_t cmd_index; /**< Command index */
  343. uint32_t cmd_argument; /**< Command argument */
  344. uint32_t cmd_flags; /**< Command flags */
  345. sdxc_command_type_t cmd_type; /**< Command type */
  346. sdxc_dev_resp_type_t resp_type; /**< Command response type */
  347. uint32_t resp_error_flags; /**< Command response error flags */
  348. uint32_t response[4]; /**< Response buffer */
  349. uint32_t auto_cmd_resp; /**< Auto command response */
  350. uint32_t cmd_timeout_ms; /**< Command Timeout in ms, 0 - means use default short timeout */
  351. } sdxc_command_t;
  352. /**
  353. * @brief SDXC data list
  354. */
  355. typedef struct _sdxc_data_list {
  356. uint32_t *data_addr;
  357. uint32_t data_size;
  358. struct _sdxc_data_list *data_list;
  359. } sdxc_data_list_t;
  360. /**
  361. * @brief SDXC data structure
  362. */
  363. typedef struct _sdxc_data {
  364. bool enable_auto_cmd12;
  365. bool enable_auto_cmd23;
  366. bool enable_ignore_error;
  367. uint8_t data_type;
  368. uint32_t block_size;
  369. uint32_t block_cnt;
  370. uint32_t *rx_data;
  371. const uint32_t *tx_data;
  372. } sdxc_data_t;
  373. /**
  374. * @brief SDXC transfer data type
  375. */
  376. enum {
  377. sdxc_xfer_data_normal = 0U, /**< Transfer normal read/write data */
  378. sdxc_xfer_data_boot = 1U, /**< Transfer boot data */
  379. sdxc_xfer_data_boot_continuous = 2U, /**< Transfer boot data continuously */
  380. };
  381. /**
  382. * @brief SDXC transfer context
  383. */
  384. typedef struct _sdxc_xfer {
  385. sdxc_data_t *data;
  386. sdxc_command_t *command;
  387. } sdxc_xfer_t;
  388. /**
  389. * @brief SDXC ADMA configuration
  390. */
  391. typedef struct _sdxc_adma_config {
  392. sdxc_dma_type_t dma_type;
  393. uint32_t *adma_table;
  394. uint32_t adma_table_words;
  395. } sdxc_adma_config_t;
  396. enum {
  397. sdxc_adma_desc_single_flag = 0U,
  398. sdxc_adma_desc_multi_flag = 1U,
  399. };
  400. /**
  401. * @brief SDXC configuration
  402. */
  403. typedef struct _sdxc_config {
  404. uint32_t data_timeout; /**< Data timeout in milliseconds */
  405. } sdxc_config_t;
  406. /**
  407. * @brief SDXC ADMA2 descriptor
  408. */
  409. typedef struct _sdxc_adma2_descriptor {
  410. union {
  411. struct {
  412. uint32_t valid: 1; /**< Valid flag */
  413. uint32_t end: 1; /**< End flag */
  414. uint32_t interrupt: 1; /**< Interrupt flag */
  415. uint32_t act: 3; /**<Act mode */
  416. uint32_t len_upper: 10; /**< Length upper 10-bit */
  417. uint32_t len_lower: 16; /**< Length lower 16-bit */
  418. };
  419. uint32_t len_attr;
  420. };
  421. const uint32_t *addr; /**< Data Address */
  422. } sdxc_adma2_descriptor_t;
  423. #define SDXC_ADMA2_DESC_VALID_FLAG (1UL << 0)
  424. #define SDXC_ADMA2_DESC_END_FLAG (1UL << 1)
  425. #define SDXC_ADMA2_DESC_INTERRUPT_FLAG (1UL << 2)
  426. #define SDXC_ADMA2_DESC_ACT0_FLAG (1UL << 3)
  427. #define SDXC_ADMA2_DESC_ACT1_FLAG (1UL << 4)
  428. #define SDXC_ADMA2_DESC_ACT2_FLAG (1UL << 5)
  429. #define SDXC_ADMA2_ADDR_LEN (4U)
  430. #define SDXC_ADMA2_LEN_ALIGN (4U)
  431. #define SDXC_ADMA2_DESC_TYPE_NOP (0U)
  432. #define SDXC_ADMA2_DESC_TYPE_TRANS (4U)
  433. #define SDXC_ADMA2_DESC_TYPE_LINK (6U)
  434. #define SDXC_ADMA3_DESC_TYPE_FOR_SD_MODE (0x1U)
  435. #define SDXC_AMDA3_DESC_TYPE_INTEGRATED_LINKER (7U)
  436. #define SDXC_ADMA3_CMD_FOR_SD_DESC_ATTR (0x09U)
  437. #define SDXC_ADMA3_INTEGRATED_DESC_ATTR (0x39U)
  438. #define SDXC_ADMA3_CMD_DESC_IDX_32BIT_BLK_CNT (0U)
  439. #define SDXC_ADMA3_CMD_DESC_IDX_BLK_SIZE (1U)
  440. #define SDXC_ADMA3_CMD_DESC_IDX_ARG (2U)
  441. #define SDXC_ADMA3_CMD_DESC_IDX_CMD_XFER (3U)
  442. /**
  443. * @brief ADMA3 command descriptor
  444. */
  445. typedef struct _sdxc_adma3_cmd_sd_desc {
  446. struct {
  447. uint32_t attr;
  448. uint32_t data;
  449. } entry[4];
  450. } sdxc_adma3_cmd_sd_desc_t;
  451. /**
  452. * @brief SDXC ADMA3 Integrated Descriptor
  453. */
  454. typedef struct _sdxc_adma3_integrated_desc {
  455. uint32_t attr;
  456. sdxc_adma3_cmd_sd_desc_t *cmd_desc_ptr;
  457. } sdxc_adma3_integrated_desc_t;
  458. /**
  459. * @brief SDXC Boot confituration
  460. */
  461. typedef struct _sdxc_boot_config {
  462. uint32_t ack_timeout_cnt;
  463. sdxc_boot_mode_t boot_mode;
  464. uint32_t block_cnt;
  465. uint32_t block_size;
  466. bool enable_boot_ack;
  467. bool enable_auto_stop_at_block_gap;
  468. } sdxc_boot_config_t;
  469. typedef struct {
  470. void (*card_inserted)(SDXC_Type *base, void *user_data);
  471. void (*card_removed)(SDXC_Type *base, void *user_data);
  472. void (*sdio_interrupt)(SDXC_Type *base, void *user_data);
  473. void (*block_gap)(SDXC_Type *base, void *user_data);
  474. void (*xfer_complete)(SDXC_Type *base, void *user_data);
  475. } sdxc_xfer_callback_t;
  476. typedef struct {
  477. sdxc_data_t *volatile data;
  478. sdxc_command_t *volatile cmd;
  479. volatile uint32_t xferred_words;
  480. sdxc_xfer_callback_t callback;
  481. void *user_data;
  482. } sdxc_handle_t;
  483. typedef hpm_stat_t (*sdxc_xfer_func_t)(SDXC_Type *base, sdxc_xfer_t *content);
  484. typedef struct {
  485. SDXC_Type *base;
  486. uint32_t src_clk_hz;
  487. sdxc_config_t config;
  488. sdxc_capabilities_t capability;
  489. sdxc_xfer_func_t xfer;
  490. } sdxc_host_t;
  491. #if defined(__cplusplus)
  492. extern "C" {
  493. #endif
  494. /**
  495. * @brief Get the SDXC interrupt status
  496. * @param [in] base SDXC base address
  497. * @retval SDXC inaterrupt status
  498. */
  499. static inline uint32_t sdxc_get_interrupt_status(SDXC_Type *base)
  500. {
  501. return base->INT_STAT;
  502. }
  503. /**
  504. * @brief Check whether SD card is inserted
  505. * @retval SD Card insertion status
  506. * @arg true SD Card is inserted
  507. * @arg false SD card is not inserted
  508. */
  509. static inline bool sdxc_is_card_inserted(SDXC_Type *base)
  510. {
  511. return IS_HPM_BITMASK_SET(base->PSTATE, SDXC_PSTATE_CARD_INSERTED_MASK);
  512. }
  513. /**
  514. * @brief Check whether SD card is Write Protected
  515. * @retval SD Card Write Protection status
  516. * @arg true SD Card is Write protected
  517. * @arg false SD card is not Write Protected
  518. */
  519. static inline bool sdxc_is_write_protected(SDXC_Type *base)
  520. {
  521. return IS_HPM_BITMASK_CLR(base->PSTATE, SDXC_PSTATE_WR_PROTECT_SW_LVL_MASK);
  522. }
  523. /**
  524. * @brief Clear SDXC interrupt status
  525. * @param [in] base SDXC base address
  526. * @param [in] status_mask the status mask to be cleared
  527. */
  528. static inline void sdxc_clear_interrupt_status(SDXC_Type *base, uint32_t status_mask)
  529. {
  530. base->INT_STAT = status_mask;
  531. }
  532. /**
  533. * @brief Enable SDXC interrupt status
  534. * @param [in] base SDXC base address
  535. * @param [in] mask SDXC interrupt status mask
  536. * @param [in] enable Interrupt status enable flag
  537. */
  538. static inline void sdxc_enable_interrupt_status(SDXC_Type *base, uint32_t mask, bool enable)
  539. {
  540. if (enable) {
  541. base->INT_STAT_EN |= mask;
  542. } else {
  543. base->INT_STAT_EN &= ~mask;
  544. }
  545. }
  546. /**
  547. * @brief Enable SDXC interrupt signal
  548. * @param [in] base SDXC base address
  549. * @param [in] mask SDXC interrupt signal mask
  550. * @param [in] enable Interrupt signal enable flag
  551. */
  552. static inline void sdxc_enable_interrupt_signal(SDXC_Type *base, uint32_t mask, bool enable)
  553. {
  554. if (enable) {
  555. base->INT_SIGNAL_EN |= mask;
  556. } else {
  557. base->INT_SIGNAL_EN &= ~mask;
  558. }
  559. }
  560. /**
  561. * @brief Get SDXC capabilities
  562. * @param [in] base SDXC base address
  563. * @param [out] capabilities buffer
  564. */
  565. hpm_stat_t sdxc_get_capabilities(SDXC_Type *base, sdxc_capabilities_t *capabilities);
  566. /**
  567. * @brief Get SDXC ADMA error status
  568. * @param [in] base SDXC base address
  569. * @retval AMDA error status register value
  570. */
  571. static inline uint8_t sdxc_get_adma_error_status(SDXC_Type *base)
  572. {
  573. return base->ADMA_ERR_STAT;
  574. }
  575. /**
  576. * @brief Configure SDXC data timeout internal
  577. * @param [in] base SDXC base address
  578. * @param [in] timeout SDXC data timeout option
  579. */
  580. static inline void sdxc_configure_data_timeout(SDXC_Type *base, uint8_t timeout)
  581. {
  582. base->SYS_CTRL = (base->SYS_CTRL & ~SDXC_SYS_CTRL_TOUT_CNT_MASK) | SDXC_SYS_CTRL_TOUT_CNT_SET(timeout);
  583. }
  584. /**
  585. * @brief Configure SDXC interrupt at block gap
  586. * @param [in] base SDXC base address
  587. * @param [in] enable Enable Interrupt_at_Block_Gap flag
  588. */
  589. static inline void sdxc_interrupt_at_block_gap(SDXC_Type *base, bool enable)
  590. {
  591. if (enable) {
  592. base->PROT_CTRL |= SDXC_PROT_CTRL_INT_AT_BGAP_MASK;
  593. } else {
  594. base->PROT_CTRL &= ~SDXC_PROT_CTRL_INT_AT_BGAP_MASK;
  595. }
  596. }
  597. /**
  598. * @brief Enable or Disable SDXC Read Wait
  599. * @param [in] base SDXC base address
  600. * @param [in] enable Enable SDXC Read Wait flag
  601. */
  602. static inline void sdxc_read_wait_control(SDXC_Type *base, bool enable)
  603. {
  604. if (enable) {
  605. base->PROT_CTRL |= SDXC_PROT_CTRL_RD_WAIT_CTRL_MASK;
  606. } else {
  607. base->PROT_CTRL &= ~SDXC_PROT_CTRL_RD_WAIT_CTRL_MASK;
  608. }
  609. }
  610. /**
  611. * @brief Configure SDXC continue request
  612. * @param [in] base SDXC base address
  613. * @param [in] enable Flag to enable/disable SDXC continue request
  614. */
  615. static inline void sdxc_continue_request(SDXC_Type *base, bool enable)
  616. {
  617. if (enable) {
  618. base->PROT_CTRL |= SDXC_PROT_CTRL_CONTINUE_REQ_MASK;
  619. } else {
  620. base->PROT_CTRL &= ~SDXC_PROT_CTRL_CONTINUE_REQ_MASK;
  621. }
  622. }
  623. /**
  624. * @brief Configure SDXC StopAtBlockGap request
  625. * @param [in] base SDXC base address
  626. * @param [in] enable Flag to enable/disable StopAtBlockGap request
  627. */
  628. static inline void sdxc_stop_at_block_gap_request(SDXC_Type *base, bool enable)
  629. {
  630. if (enable) {
  631. base->PROT_CTRL |= SDXC_PROT_CTRL_STOP_BG_REQ_MASK;
  632. } else {
  633. base->PROT_CTRL &= ~SDXC_PROT_CTRL_STOP_BG_REQ_MASK;
  634. }
  635. }
  636. /**
  637. * @brief Control the SDXC high-speed support
  638. * @param [in] base SDXC base address
  639. * @param [in] enable flag to Enable/disable SDXC high-speed support
  640. */
  641. static inline void sdxc_enable_high_speed(SDXC_Type *base, bool enable)
  642. {
  643. if (enable) {
  644. base->PROT_CTRL |= SDXC_PROT_CTRL_HIGH_SPEED_EN_MASK;
  645. } else {
  646. base->PROT_CTRL &= ~SDXC_PROT_CTRL_HIGH_SPEED_EN_MASK;
  647. }
  648. }
  649. /**
  650. * @brief Control the SDXC power pin
  651. *
  652. * @param [in] base SDXC base address
  653. * @param [in] enable Flag to control the SDXC power pin
  654. */
  655. static inline void sdxc_enable_power(SDXC_Type *base, bool enable)
  656. {
  657. if (enable) {
  658. base->PROT_CTRL |= SDXC_PROT_CTRL_SD_BUS_PWR_VDD1_MASK;
  659. } else {
  660. base->PROT_CTRL &= ~SDXC_PROT_CTRL_SD_BUS_PWR_VDD1_MASK;
  661. }
  662. }
  663. /**
  664. * @brief Enable SDXC asynchronous interrupt support
  665. * @param [in] base SDXC base address
  666. * @param [in] enable Flag to enable/disable SDXC asynchronous interrupt support
  667. */
  668. static inline void sdxc_enable_async_interrupt(SDXC_Type *base, bool enable)
  669. {
  670. if (enable) {
  671. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_ASYNC_INT_ENABLE_MASK;
  672. } else {
  673. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_ASYNC_INT_ENABLE_MASK;
  674. }
  675. }
  676. /**
  677. * @brief Enable SDXC Preset support
  678. * @param [in] base SDXC base address
  679. * @param [in] enable flag to enable/disable SDXC Preset support
  680. */
  681. static inline void sdxc_enable_preset(SDXC_Type *base, bool enable)
  682. {
  683. if (enable) {
  684. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_PRESET_VAL_ENABLE_MASK;
  685. } else {
  686. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_PRESET_VAL_ENABLE_MASK;
  687. }
  688. }
  689. /**
  690. * @brief Enable SD Host version 4
  691. * @param [in] base SDXC base address
  692. * @param [in] enable flag to enable/disable SD Host version 4 support
  693. */
  694. static inline void sdxc_enable_host_version4(SDXC_Type *base, bool enable)
  695. {
  696. if (enable) {
  697. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_HOST_VER4_ENABLE_MASK;
  698. } else {
  699. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_HOST_VER4_ENABLE_MASK;
  700. }
  701. }
  702. /**
  703. * @brief Start SDXC tuning process
  704. * @param [in] base SDXC base address
  705. */
  706. static inline void sdxc_execute_tuning(SDXC_Type *base)
  707. {
  708. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_EXEC_TUNING_MASK | SDXC_AC_HOST_CTRL_SAMPLE_CLK_SEL_MASK;
  709. }
  710. /**
  711. * @brief Enable SDXC software tuning process
  712. * @param [in] base SDXC base address
  713. * @param [in] enable flag to enable/disable SDXC software tuning
  714. */
  715. static inline void sdxc_enable_software_tuning(SDXC_Type *base, bool enable)
  716. {
  717. if (enable) {
  718. base->AUTO_TUNING_CTRL |= SDXC_AUTO_TUNING_CTRL_SW_TUNE_EN_MASK;
  719. } else {
  720. base->AUTO_TUNING_CTRL &= ~SDXC_AUTO_TUNING_CTRL_SW_TUNE_EN_MASK;
  721. }
  722. }
  723. /**
  724. * @brief Reset SDXC tuning engine
  725. * @param [in] base SDXC base address
  726. */
  727. static inline void sdxc_reset_tuning_engine(SDXC_Type *base)
  728. {
  729. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_SAMPLE_CLK_SEL_MASK;
  730. }
  731. /**
  732. * @brief Switch SDXC to 1.8V signaling mode
  733. * @param [in] base SDXC base address
  734. * @param [in] enable Flag to switch to 1.8v signaling mode/stay at 3.0v signaling mode
  735. */
  736. static inline void sdxc_switch_to_1v8_signal(SDXC_Type *base, bool enable)
  737. {
  738. if (enable) {
  739. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_SIGNALING_EN_MASK;
  740. } else {
  741. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_SIGNALING_EN_MASK;
  742. }
  743. }
  744. /**
  745. * @brief Enable/Disable SDXC internal clock
  746. * @param[in] base SDXC base address
  747. * @param [in] enable Flag to enable/disable SDXC internal clock
  748. */
  749. static inline void sdxc_enable_internal_clock(SDXC_Type *base, bool enable)
  750. {
  751. if (enable) {
  752. base->SYS_CTRL |= SDXC_SYS_CTRL_INTERNAL_CLK_EN_MASK;
  753. } else {
  754. base->SYS_CTRL &= ~SDXC_SYS_CTRL_INTERNAL_CLK_EN_MASK;
  755. }
  756. }
  757. /**
  758. * @brief Get Present status register value
  759. * @param [in] base SDXC base address
  760. * @retval SDXC PRESENT register value
  761. */
  762. static inline uint32_t sdxc_get_present_status(SDXC_Type *base)
  763. {
  764. return base->PSTATE;
  765. }
  766. /**
  767. * @brief Check whether the Data Buffer is writable or not
  768. * @param [in] base SDXC base address
  769. * @retval true Data buffer is writeable
  770. * @retval false Data buffer write is disabled
  771. */
  772. static inline bool sdxc_is_data_buf_writable(SDXC_Type *base)
  773. {
  774. return ((base->PSTATE & SDXC_PSTATE_BUF_WR_ENABLE_MASK) != 0U);
  775. }
  776. /**
  777. * @brief Check whether the data buffer is readable
  778. * @param [in] base SDXC base address
  779. * @retval true There are data available in data buffer
  780. * @retval false there is no data available in data buffer, read is disabled
  781. */
  782. static inline bool sdxc_is_data_buf_readable(SDXC_Type *base)
  783. {
  784. return ((base->PSTATE & SDXC_PSTATE_BUF_RD_ENABLE_MASK) != 0U);
  785. }
  786. /**
  787. * @brief Read data from SDXC using non-DMA mode
  788. * @param [in] base SDXC base address
  789. * @retval Data read from SDXC
  790. */
  791. static inline uint32_t sdxc_read_data(SDXC_Type *base)
  792. {
  793. return base->BUF_DATA;
  794. }
  795. /**
  796. * @brief Write data to SDXC using non-DMA mode
  797. * @param [in] base SDXC base address
  798. * @param [in] data Data to be written to SDXC
  799. */
  800. static inline void sdxc_write_data(SDXC_Type *base, uint32_t data)
  801. {
  802. base->BUF_DATA = data;
  803. }
  804. /**
  805. * @brief Get SDXC DATA3-DATA0 IO level
  806. * @param [in] base SDXC base address
  807. * @retval SDXC data3-data0 IO level
  808. */
  809. static inline uint32_t sdxc_get_data3_0_level(SDXC_Type *base)
  810. {
  811. return SDXC_PSTATE_DAT_3_0_GET(base->PSTATE);
  812. }
  813. /**
  814. * @brief Enable SDXC auto tuning
  815. * @param [in] base SDXC base address
  816. * @param [in] enable Flag to enable/disable SDXC auto tuning
  817. */
  818. static inline void sdxc_enable_auto_tuning(SDXC_Type *base, bool enable)
  819. {
  820. if (enable) {
  821. base->AUTO_TUNING_CTRL |= SDXC_AUTO_TUNING_CTRL_AT_EN_MASK;
  822. } else {
  823. base->AUTO_TUNING_CTRL &= ~SDXC_AUTO_TUNING_CTRL_AT_EN_MASK;
  824. }
  825. }
  826. /**
  827. * @brief Stop Clock During Phase Code Change
  828. *
  829. * @param [in] base SDXC base address
  830. * @param [in] enable Flag to determine whether stopping clock during phase code change
  831. */
  832. static inline void sdxc_stop_clock_during_phase_code_change(SDXC_Type *base, bool enable)
  833. {
  834. if (enable) {
  835. base->AUTO_TUNING_CTRL |= SDXC_AUTO_TUNING_CTRL_TUNE_CLK_STOP_EN_MASK;
  836. } else {
  837. base->AUTO_TUNING_CTRL &= ~SDXC_AUTO_TUNING_CTRL_TUNE_CLK_STOP_EN_MASK;
  838. }
  839. }
  840. /**
  841. * @brief Set The delay cycles during phase switching and stable clock out
  842. *
  843. * @param [in] base SDXC base address
  844. * @param [in] delay_cnt Delay cycles
  845. */
  846. static inline void sdxc_set_post_change_delay(SDXC_Type *base, uint8_t delay_cnt)
  847. {
  848. base->AUTO_TUNING_CTRL = (base->AUTO_TUNING_CTRL & ~SDXC_AUTO_TUNING_CTRL_POST_CHANGE_DLY_MASK) \
  849. | SDXC_AUTO_TUNING_CTRL_POST_CHANGE_DLY_SET(delay_cnt - 1U);
  850. }
  851. /**
  852. * @brief Enable EMMC support
  853. * @param [in] base SDXC base address
  854. * @param [in] enable Flag to enable/disable EMMC support
  855. */
  856. static inline void sdxc_enable_emmc_support(SDXC_Type *base, bool enable)
  857. {
  858. if (enable) {
  859. base->EMMC_BOOT_CTRL |= SDXC_EMMC_BOOT_CTRL_CARD_IS_EMMC_MASK;
  860. } else {
  861. base->EMMC_BOOT_CTRL &= ~SDXC_EMMC_BOOT_CTRL_CARD_IS_EMMC_MASK;
  862. }
  863. }
  864. /**
  865. * @brief Enable/Disable SDXC MMC boot
  866. * @param [in] base SDXC base address
  867. * @param [in] enable FLag to enable/disable SDXC MMC boot
  868. */
  869. static inline void sdxc_enable_mmc_boot(SDXC_Type *base, bool enable)
  870. {
  871. if (enable) {
  872. base->EMMC_BOOT_CTRL |= SDXC_EMMC_BOOT_CTRL_MAN_BOOT_EN_MASK;
  873. } else {
  874. base->EMMC_BOOT_CTRL &= ~SDXC_EMMC_BOOT_CTRL_MAN_BOOT_EN_MASK;
  875. }
  876. }
  877. /**
  878. * @brief Set SDXC force event
  879. * @param [in] base SDXC base address
  880. * @param [in] mask SDXC event mask
  881. */
  882. static inline void sdxc_force_event(SDXC_Type *base, uint32_t mask)
  883. {
  884. base->FORCE_EVENT = mask;
  885. }
  886. /**
  887. * @brief Enable/disable SDXC SD clock output
  888. * @param [in] base SDXC base address
  889. * @param [in] enable Flag to enable/disable SDXC SD clock output
  890. */
  891. static inline void sdxc_enable_sd_clock(SDXC_Type *base, bool enable)
  892. {
  893. if (enable) {
  894. base->SYS_CTRL |= SDXC_SYS_CTRL_SD_CLK_EN_MASK;
  895. while (!IS_HPM_BITMASK_SET(base->SYS_CTRL, SDXC_SYS_CTRL_SD_CLK_EN_MASK)) {
  896. }
  897. } else {
  898. base->SYS_CTRL &= ~SDXC_SYS_CTRL_SD_CLK_EN_MASK;
  899. while (IS_HPM_BITMASK_SET(base->SYS_CTRL, SDXC_SYS_CTRL_SD_CLK_EN_MASK)) {
  900. }
  901. }
  902. }
  903. /**
  904. * @brief Set SDXC center phase code
  905. * @param [in] base SDXC base address
  906. * @param [in] value SDXC center phase value
  907. */
  908. static inline void sdxc_set_center_phase_code(SDXC_Type *base, uint32_t value)
  909. {
  910. base->AUTO_TUNING_STAT = (base->AUTO_TUNING_STAT & ~SDXC_AUTO_TUNING_STAT_CENTER_PH_CODE_MASK) |
  911. SDXC_AUTO_TUNING_STAT_CENTER_PH_CODE_SET(value);
  912. }
  913. /**
  914. * @brief Enable SDXC enhanced strobe
  915. * @param [in] base SDXC base address
  916. * @param [in] enable flag to enable/disable SDXC enhanced strobe
  917. */
  918. static inline void sdxc_enable_enhanced_strobe(SDXC_Type *base, bool enable)
  919. {
  920. if (enable) {
  921. base->EMMC_BOOT_CTRL |= SDXC_EMMC_BOOT_CTRL_ENH_STROBE_ENABLE_MASK;
  922. } else {
  923. base->EMMC_BOOT_CTRL &= ~SDXC_EMMC_BOOT_CTRL_ENH_STROBE_ENABLE_MASK;
  924. }
  925. }
  926. /**
  927. * @brief Set MMC boot configuration
  928. * @param [in] base SDXC base address
  929. * @param [in] config MMC boot configuration
  930. */
  931. void sdxc_set_mmc_boot_config(SDXC_Type *base, const sdxc_boot_config_t *config);
  932. /**
  933. * @brief Send Command via SDXC
  934. * @param [in] base SDXC base address
  935. * @param [in] cmd Command
  936. * @retval status_timeout Sending command timed out
  937. * @retval status_success Command was sent out successfully
  938. */
  939. hpm_stat_t sdxc_send_command(SDXC_Type *base, sdxc_command_t *cmd);
  940. /**
  941. * @brief Receive command response
  942. * @param [in] base SDXC base address
  943. * @param [in,out] cmd Command
  944. * @return status_success if no error happened
  945. */
  946. hpm_stat_t sdxc_receive_cmd_response(SDXC_Type *base, sdxc_command_t *cmd);
  947. /**
  948. * @brief Parse the SDXC interrupt status to HPM encoded status
  949. * @param [in] base SDXC base status
  950. * @return status_success if no error happened
  951. */
  952. hpm_stat_t sdxc_parse_interrupt_status(SDXC_Type *base);
  953. /**
  954. * @brief Wait until SDXC command completes
  955. * @param [in] base SDXC base address
  956. * @param [in] cmd Command
  957. * @param [out] polling_cmd_done flag to determine whether to use blocking wait
  958. * @retval SDXC command execution status
  959. */
  960. hpm_stat_t sdxc_wait_cmd_done(SDXC_Type *base, sdxc_command_t *cmd, bool polling_cmd_done);
  961. /**
  962. * @brief Set Data transfer configuration
  963. * @param [in] base SDXC base address
  964. * @param [in] data_dir Data transfer direction
  965. * @param [in] block_cnt Block count for data transfer
  966. * @param [in] block_size Block size for data transfer
  967. */
  968. void sdxc_set_data_config(SDXC_Type *base, sdxc_xfer_direction_t data_dir, uint32_t block_cnt, uint32_t block_size);
  969. /**
  970. * @brief Set ADMA table configuration
  971. * @param [in] base SDXC base address
  972. * @param [in] dma_cfg DMA configuration
  973. * @param [in] data_cfg Data configuration
  974. * @param [in] flags Flags for AMDA transfer
  975. * @retval API execution status
  976. */
  977. hpm_stat_t sdxc_set_adma_table_config(SDXC_Type *base,
  978. sdxc_adma_config_t *dma_cfg,
  979. sdxc_data_t *data_cfg,
  980. uint32_t flags);
  981. /**
  982. * @brief Set ADMA2 descriptor
  983. * @param [in] adma_tbl ADMA2 table
  984. * @param [in] adma_table_words ADMA2 table size in words
  985. * @param [in] data_buf pointer to the Data to be transferred
  986. * @param [in] data_bytes Data size for transfer
  987. * @param [in] flags Flags for ADMA2 descriptor
  988. * @retval API execution status
  989. */
  990. hpm_stat_t sdxc_set_adma2_desc(uint32_t *adma_tbl,
  991. uint32_t adma_table_words,
  992. const uint32_t *data_buf,
  993. uint32_t data_bytes,
  994. uint32_t flags);
  995. /**
  996. * @brief Set DMA configuration
  997. * @param [in] base SDXC base address
  998. * @param [in] dma_cfg DMA configuration data structure
  999. * @param [in] data_addr Buffer holds incoming/outgoing data
  1000. * @param [in] enable_auto_cmd23 Flag to determine whether to enable auto CMD23 or not
  1001. * @retval API execution status
  1002. */
  1003. hpm_stat_t sdxc_set_dma_config(SDXC_Type *base,
  1004. sdxc_adma_config_t *dma_cfg,
  1005. const uint32_t *data_addr,
  1006. bool enable_auto_cmd23);
  1007. /**
  1008. * @brief Initialize SDXC controller
  1009. * @param [in] base SDXC base address
  1010. * @param [in] config SDXC configuration
  1011. */
  1012. void sdxc_init(SDXC_Type *base, const sdxc_config_t *config);
  1013. /**
  1014. * @brief Set the Data Timeout Counter value for an SD/eMMC device
  1015. * @param [in] base SDXC base address
  1016. * @param [in] timeout_in_ms Required timeout value in milliseconds, maximum value is 131,072ms
  1017. * @param [out] actual_timeout_ms Actual timeout in milliseconds, reported by this API
  1018. */
  1019. void sdxc_set_data_timeout(SDXC_Type *base, uint32_t timeout_in_ms, uint32_t *actual_timeout_ms);
  1020. /**
  1021. * @brief Set SDXC speed mode
  1022. * @param [in] base SDXC base address
  1023. * @param [in] mode SDXC speed mode option
  1024. */
  1025. void sdxc_set_speed_mode(SDXC_Type *base, sdxc_speed_mode_t mode);
  1026. /**
  1027. * @brief Set SDXC Data bus width
  1028. * @param [in] base SDXC base address
  1029. * @param [in] width SDXC bus width option
  1030. */
  1031. void sdxc_set_data_bus_width(SDXC_Type *base, sdxc_bus_width_t width);
  1032. /**
  1033. * @brief Get SDXC Data bus width
  1034. * @param [in] base SDXC base address
  1035. * @return Actual bus width, valid value: 1 / 4 / 8
  1036. */
  1037. uint32_t sdxc_get_data_bus_width(SDXC_Type *base);
  1038. /**
  1039. * @brief Set SDXC IO voltage
  1040. * @param [in] base SDXC base address
  1041. * @param [option] SDXC voltage option
  1042. */
  1043. void sdxc_select_voltage(SDXC_Type *base, sdxc_bus_voltage_option_t option);
  1044. /**
  1045. * @brief Reset SDXC
  1046. * @param [in] base SDXC base address
  1047. * @param [in] reset_type SDXC reset type
  1048. * @param [in] timeout timeout ticks
  1049. * @retval SDXC reset result
  1050. */
  1051. bool sdxc_reset(SDXC_Type *base, sdxc_sw_reset_type_t reset_type, uint32_t timeout);
  1052. /**
  1053. * @brief Enable SDXC wakeup interrupt
  1054. * @param [in] base SDXC base address
  1055. * @param [in] evt SDXC wakeup interrupt
  1056. * @param [in] enable Flag to control whether to enable SDXC wakeup event
  1057. */
  1058. void sdxc_enable_wakeup_event(SDXC_Type *base, sdxc_wakeup_event_t evt, bool enable);
  1059. /**
  1060. * @brief Start SDXC transfer in blocking way
  1061. * @param [in] base SDXC base address
  1062. * @param [in] dma_config SDXC DMA configuration
  1063. * @param [in] xfer SDXC transfer context
  1064. * @retval SDXC transfer status
  1065. */
  1066. hpm_stat_t sdxc_transfer_blocking(SDXC_Type *base, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
  1067. /**
  1068. * @brief Start SDXC transfer in nonblocking way
  1069. * @param [in] base SDXC base address
  1070. * @param [in] dma_config SDXC DMA configuration
  1071. * @param [in] xfer SDXC transfer context
  1072. * @retval SDXC transfer status
  1073. */
  1074. hpm_stat_t sdxc_transfer_nonblocking(SDXC_Type *base, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
  1075. /**
  1076. * @brief SDXC Error recovery
  1077. * @param [in] base SDXC base address
  1078. * @retval SDXC error recovery status
  1079. */
  1080. hpm_stat_t sdxc_error_recovery(SDXC_Type *base);
  1081. /**
  1082. * @brief Perform SDXC tuning flow sequence
  1083. * @param [in] base SDXC base address
  1084. * @param [in] tuning_cmd Tuning command
  1085. * @retval Tuning status
  1086. */
  1087. hpm_stat_t sdxc_perform_tuning_flow_sequence(SDXC_Type *base, uint8_t tuning_cmd);
  1088. /**
  1089. * @brief Perform SDXC software tuning
  1090. * @param [in] base SDXC base address
  1091. * @param [in] tuning_cmd Tuning command
  1092. * @retval Tuning status
  1093. */
  1094. hpm_stat_t sdxc_perform_software_tuning(SDXC_Type *base, uint8_t tuning_cmd);
  1095. /**
  1096. * @brief Perform SDXC auto tuning
  1097. * @param [in] base SDXC base address
  1098. * @param [in] tuning_cmd tuning command
  1099. * @retval Tuning status
  1100. */
  1101. hpm_stat_t sdxc_perform_auto_tuning(SDXC_Type *base, uint8_t tuning_cmd);
  1102. #if defined(__cplusplus)
  1103. }
  1104. #endif
  1105. /**
  1106. * @}
  1107. */
  1108. #endif /*HPM_SDXC_DRV_H */