hpm_sdxc_drv.h 36 KB

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