hpm_sdxc_drv.h 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065
  1. /*
  2. * Copyright (c) 2021 - 2022 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_tuning = 1U, /**< Transfer Tuning data */
  328. sdxc_xfer_data_boot = 2U, /**< Transfer boot data */
  329. sdxc_xfer_data_boot_continuous = 3U, /**< Transfer boot data continuously */
  330. };
  331. /**
  332. * @brief SDXC transfer context
  333. */
  334. typedef struct _sdxc_xfer {
  335. sdxc_data_t *data;
  336. sdxc_command_t *command;
  337. } sdxc_xfer_t;
  338. /**
  339. * @brief SDXC ADMA configuration
  340. */
  341. typedef struct _sdxc_adma_config {
  342. sdxc_dma_type_t dma_type;
  343. uint32_t *adma_table;
  344. uint32_t adma_table_words;
  345. } sdxc_adma_config_t;
  346. enum {
  347. sdxc_adma_desc_single_flag = 0U,
  348. sdxc_adma_desc_multi_flag = 1U,
  349. };
  350. /**
  351. * @brief SDXC configuration
  352. */
  353. typedef struct _sdxc_config {
  354. uint32_t data_timeout; /**< Data timeout in milliseconds */
  355. } sdxc_config_t;
  356. /**
  357. * @brief SDXC ADMA2 descriptor
  358. */
  359. typedef struct _sdxc_adma2_descriptor {
  360. union {
  361. struct {
  362. uint32_t valid: 1; /**< Valid flag */
  363. uint32_t end: 1; /**< End flag */
  364. uint32_t interrupt: 1; /**< Interrupt flag */
  365. uint32_t act: 3; /**<Act mode */
  366. uint32_t len_upper: 10; /**< Length upper 10-bit */
  367. uint32_t len_lower: 16; /**< Length lower 16-bit */
  368. };
  369. uint32_t len_attr;
  370. };
  371. const uint32_t *addr; /**< Data Address */
  372. } sdxc_adma2_descriptor_t;
  373. #define SDXC_ADMA2_DESC_VALID_FLAG (1UL << 0)
  374. #define SDXC_ADMA2_DESC_END_FLAG (1UL << 1)
  375. #define SDXC_ADMA2_DESC_INTERRUPT_FLAG (1UL << 2)
  376. #define SDXC_ADMA2_DESC_ACT0_FLAG (1UL << 3)
  377. #define SDXC_ADMA2_DESC_ACT1_FLAG (1UL << 4)
  378. #define SDXC_ADMA2_DESC_ACT2_FLAG (1UL << 5)
  379. #define SDXC_ADMA2_ADDR_LEN (4U)
  380. #define SDXC_ADMA2_LEN_ALIGN (4U)
  381. #define SDXC_ADMA2_DESC_TYPE_NOP (0U)
  382. #define SDXC_ADMA2_DESC_TYPE_TRANS (4U)
  383. #define SDXC_ADMA2_DESC_TYPE_LINK (6U)
  384. #define SDXC_ADMA3_DESC_TYPE_FOR_SD_MODE (0x1U)
  385. #define SDXC_AMDA3_DESC_TYPE_INTEGRATED_LINKER (7U)
  386. #define SDXC_ADMA3_CMD_FOR_SD_DESC_ATTR (0x09U)
  387. #define SDXC_ADMA3_INTEGRATED_DESC_ATTR (0x39U)
  388. #define SDXC_ADMA3_CMD_DESC_IDX_32BIT_BLK_CNT (0U)
  389. #define SDXC_ADMA3_CMD_DESC_IDX_BLK_SIZE (1U)
  390. #define SDXC_ADMA3_CMD_DESC_IDX_ARG (2U)
  391. #define SDXC_ADMA3_CMD_DESC_IDX_CMD_XFER (3U)
  392. /**
  393. * @brief ADMA3 command descriptor
  394. */
  395. typedef struct _sdxc_adma3_cmd_sd_desc {
  396. struct {
  397. uint32_t attr;
  398. uint32_t data;
  399. } entry[4];
  400. } sdxc_adma3_cmd_sd_desc_t;
  401. /**
  402. * @brief SDXC ADMA3 Integrated Descriptor
  403. */
  404. typedef struct _sdxc_adma3_integrated_desc {
  405. uint32_t attr;
  406. sdxc_adma3_cmd_sd_desc_t *cmd_desc_ptr;
  407. } sdxc_adma3_integrated_desc_t;
  408. /**
  409. * @brief SDXC Boot confituration
  410. */
  411. typedef struct _sdxc_boot_config {
  412. uint32_t ack_timeout_cnt;
  413. sdxc_boot_mode_t boot_mode;
  414. uint32_t block_cnt;
  415. uint32_t block_size;
  416. bool enable_boot_ack;
  417. bool enable_auto_stop_at_block_gap;
  418. } sdxc_boot_config_t;
  419. #if defined(__cplusplus)
  420. extern "C" {
  421. #endif
  422. /**
  423. * @brief Get the SDXC interrupt status
  424. * @param [in] base SDXC base address
  425. * @retval SDXC inaterrupt status
  426. */
  427. static inline uint32_t sdxc_get_interrupt_status(SDXC_Type *base)
  428. {
  429. return base->INT_STAT;
  430. }
  431. /**
  432. * @brief Check whether SD card is inserted
  433. * @retval SD Card instertion status
  434. * @arg true SD Card is inserted
  435. * @arg false SD card is not inserted
  436. */
  437. static inline bool sdxc_is_card_inserted(SDXC_Type *base)
  438. {
  439. return IS_HPM_BITMASK_SET(base->PSTATE, SDXC_PSTATE_CARD_INSERTED_MASK);
  440. }
  441. /**
  442. * @brief Clear SDXC interrupt status
  443. * @param [in] base SDXC base address
  444. * @param [in] status_mask the status mask to be cleared
  445. */
  446. static inline void sdxc_clear_interrupt_status(SDXC_Type *base, uint32_t status_mask)
  447. {
  448. base->INT_STAT = status_mask;
  449. }
  450. /**
  451. * @brief Enable SDXC interrupt status
  452. * @param [in] base SDXC base address
  453. * @param [in] mask SDXC interrupt status mask
  454. * @param [in] enable Interrupt status enable flag
  455. */
  456. static inline void sdxc_enable_interrupt_status(SDXC_Type *base, uint32_t mask, bool enable)
  457. {
  458. if (enable) {
  459. base->INT_STAT_EN |= mask;
  460. } else {
  461. base->INT_STAT_EN &= ~mask;
  462. }
  463. }
  464. /**
  465. * @brief Enable SDXC interrupt signal
  466. * @param [in] base SDXC base address
  467. * @param [in] mask SDXC interrupt signal mask
  468. * @param [in] enable Interrupt signal enable flag
  469. */
  470. static inline void sdxc_enable_interrupt_signal(SDXC_Type *base, uint32_t mask, bool enable)
  471. {
  472. if (enable) {
  473. base->INT_SIGNAL_EN |= mask;
  474. } else {
  475. base->INT_SIGNAL_EN &= ~mask;
  476. }
  477. }
  478. /**
  479. * @brief Get SDXC capabilities
  480. * @param [in] base SDXC base address
  481. * @param [out] capabilities buffer
  482. */
  483. hpm_stat_t sdxc_get_capabilities(SDXC_Type *base, sdxc_capabilities_t *capabilities);
  484. /**
  485. * @brief Get SDXC ADMA error status
  486. * @param [in] base SDXC base address
  487. * @retval AMDA error status register value
  488. */
  489. static inline uint8_t sdxc_get_adma_error_status(SDXC_Type *base)
  490. {
  491. return base->ADMA_ERR_STAT;
  492. }
  493. /**
  494. * @brief Configure SDXC data timeout interal
  495. * @param [in] base SDXC base address
  496. * @param [in] timeout SDXC data timeout option
  497. */
  498. static inline void sdxc_configure_data_timeout(SDXC_Type *base, uint8_t timeout)
  499. {
  500. base->SYS_CTRL = (base->SYS_CTRL & ~SDXC_SYS_CTRL_TOUT_CNT_MASK) | SDXC_SYS_CTRL_TOUT_CNT_SET(timeout);
  501. }
  502. /**
  503. * @brief Configure SDXC interrupt at block gap
  504. * @param [in] base SDXC base address
  505. * @param [in] enable Enable Interrupt_at_Block_Gap flag
  506. */
  507. static inline void sdxc_interrupt_at_block_gap(SDXC_Type *base, bool enable)
  508. {
  509. if (enable) {
  510. base->PROT_CTRL |= SDXC_PROT_CTRL_INT_AT_BGAP_MASK;
  511. } else {
  512. base->PROT_CTRL &= ~SDXC_PROT_CTRL_INT_AT_BGAP_MASK;
  513. }
  514. }
  515. /**
  516. * @brief Enable or Disable SDXC Read Wait
  517. * @param [in] base SDXC base address
  518. * @param [in] enable Enable SDXC Read Wait flag
  519. */
  520. static inline void sdxc_read_wait_control(SDXC_Type *base, bool enable)
  521. {
  522. if (enable) {
  523. base->PROT_CTRL |= SDXC_PROT_CTRL_RD_WAIT_CTRL_MASK;
  524. } else {
  525. base->PROT_CTRL &= ~SDXC_PROT_CTRL_RD_WAIT_CTRL_MASK;
  526. }
  527. }
  528. /**
  529. * @brief Configure SDXC continue request
  530. * @param [in] base SDXC base address
  531. * @param [in] enable Flag to enable/disable SDXC continue request
  532. */
  533. static inline void sdxc_continue_request(SDXC_Type *base, bool enable)
  534. {
  535. if (enable) {
  536. base->PROT_CTRL |= SDXC_PROT_CTRL_CONTINUE_REQ_MASK;
  537. } else {
  538. base->PROT_CTRL &= ~SDXC_PROT_CTRL_CONTINUE_REQ_MASK;
  539. }
  540. }
  541. /**
  542. * @brief Configure SDXC StopAtBlockGap request
  543. * @param [in] base SDXC base address
  544. * @param [in] enable Flag to enable/disable StopAtBlockGap request
  545. */
  546. static inline void sdxc_stop_at_block_gap_request(SDXC_Type *base, bool enable)
  547. {
  548. if (enable) {
  549. base->PROT_CTRL |= SDXC_PROT_CTRL_STOP_BG_REQ_MASK;
  550. } else {
  551. base->PROT_CTRL &= ~SDXC_PROT_CTRL_STOP_BG_REQ_MASK;
  552. }
  553. }
  554. /**
  555. * @brief Control the SDXC high-speed support
  556. * @param [in] base SDXC base address
  557. * @param [in] enable flag to Enable/disable SDXC high-speed support
  558. */
  559. static inline void sdxc_enable_high_speed(SDXC_Type *base, bool enable)
  560. {
  561. if (enable) {
  562. base->PROT_CTRL |= SDXC_PROT_CTRL_HIGH_SPEED_EN_MASK;
  563. } else {
  564. base->PROT_CTRL &= ~SDXC_PROT_CTRL_HIGH_SPEED_EN_MASK;
  565. }
  566. }
  567. /**
  568. * @brief Enable SDXC asynchronous interrupt support
  569. * @param [in] base SDXC base address
  570. * @param [in] enable Flag to enable/disable SDXC asynchronous interrupt support
  571. */
  572. static inline void sdxc_enable_async_interrupt(SDXC_Type *base, bool enable)
  573. {
  574. if (enable) {
  575. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_ASYNC_INT_ENABLE_MASK;
  576. } else {
  577. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_ASYNC_INT_ENABLE_MASK;
  578. }
  579. }
  580. /**
  581. * @brief Enable SDXC Preset support
  582. * @param [in] base SDXC base address
  583. * @param [in] enable flag to enable/disable SDXC Preset support
  584. */
  585. static inline void sdxc_enable_preset(SDXC_Type *base, bool enable)
  586. {
  587. if (enable) {
  588. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_PRESET_VAL_ENABLE_MASK;
  589. } else {
  590. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_PRESET_VAL_ENABLE_MASK;
  591. }
  592. }
  593. /**
  594. * @brief Enable SD Host version 4
  595. * @param [in] base SDXC base address
  596. * @param [in] enable flag to enable/disable SD Host version 4 support
  597. */
  598. static inline void sdxc_enable_host_version4(SDXC_Type *base, bool enable)
  599. {
  600. if (enable) {
  601. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_HOST_VER4_ENABLE_MASK;
  602. } else {
  603. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_HOST_VER4_ENABLE_MASK;
  604. }
  605. }
  606. /**
  607. * @brief Start SDXC tuning process
  608. * @param [in] base SDXC base address
  609. */
  610. static inline void sdxc_execute_tuning(SDXC_Type *base)
  611. {
  612. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_EXEC_TUNING_MASK | SDXC_AC_HOST_CTRL_SAMPLE_CLK_SEL_MASK;
  613. }
  614. /**
  615. * @brief Enable SDXC software tuning process
  616. * @param [in] base SDXC base address
  617. * @param [in] enable flag to enable/disable SDXC software tuning
  618. */
  619. static inline void sdxc_enable_software_tuning(SDXC_Type *base, bool enable)
  620. {
  621. if (enable) {
  622. base->AUTO_TUNING_CTRL |= SDXC_AUTO_TUNING_CTRL_SW_TUNE_EN_MASK;
  623. }
  624. else {
  625. base->AUTO_TUNING_CTRL &= ~SDXC_AUTO_TUNING_CTRL_SW_TUNE_EN_MASK;
  626. }
  627. }
  628. /**
  629. * @brief Reset SDXC tuning engine
  630. * @param [in] base SDXC base address
  631. */
  632. static inline void sdxc_reset_tuning_engine(SDXC_Type *base)
  633. {
  634. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_SAMPLE_CLK_SEL_MASK;
  635. }
  636. /**
  637. * @brief Switch SDXC to 1.8V signaling mode
  638. * @param [in] base SDXC base address
  639. * @param [in] enable Flag to switch to 1.8v signaling mode/stay at 3.0v signaling mode
  640. */
  641. static inline void sdxc_switch_to_1v8_signal(SDXC_Type *base, bool enable)
  642. {
  643. if (enable) {
  644. base->AC_HOST_CTRL |= SDXC_AC_HOST_CTRL_SIGNALING_EN_MASK;
  645. } else {
  646. base->AC_HOST_CTRL &= ~SDXC_AC_HOST_CTRL_SIGNALING_EN_MASK;
  647. }
  648. }
  649. /**
  650. * @brief Enable/Disable SDXC internal clock
  651. * @param[in] base SDXC base address
  652. * @param [in] enable Flag to enable/disable SDXC internal clock
  653. */
  654. static inline void sdxc_enable_internal_clock(SDXC_Type *base, bool enable)
  655. {
  656. if (enable) {
  657. base->SYS_CTRL |= SDXC_SYS_CTRL_INTERNAL_CLK_EN_MASK;
  658. } else {
  659. base->SYS_CTRL &= ~SDXC_SYS_CTRL_INTERNAL_CLK_EN_MASK;
  660. }
  661. }
  662. /**
  663. * @brief Get Present status register value
  664. * @param [in] base SDXC base address
  665. * @retval SDXC PRESENT register value
  666. */
  667. static inline uint32_t sdxc_get_present_status(SDXC_Type *base)
  668. {
  669. return base->PSTATE;
  670. }
  671. /**
  672. * @brief Read data from SDXC using non-DMA mode
  673. * @param [in] base SDXC base address
  674. * @retval Data read from SDXC
  675. */
  676. static inline uint32_t sdxc_read_data(SDXC_Type *base)
  677. {
  678. return base->BUF_DATA;
  679. }
  680. /**
  681. * @brief Write data to SDXC using non-DMA mode
  682. * @param [in] base SDXC base address
  683. * @param [in] data Data to be written to SDXC
  684. */
  685. static inline void sdxc_write_data(SDXC_Type *base, uint32_t data)
  686. {
  687. base->BUF_DATA = data;
  688. }
  689. /**
  690. * @brief Get SDXC DATA3-DATA0 IO level
  691. * @param [in] base SDXC base address
  692. * @retval SDXC data3-data0 IO level
  693. */
  694. static inline uint32_t sdxc_get_data3_0_level(SDXC_Type *base)
  695. {
  696. return SDXC_PSTATE_DAT_3_0_GET(base->PSTATE);
  697. }
  698. /**
  699. * @brief Enable SDXC auto tuning
  700. * @param [in] base SDXC base address
  701. * @param [in] enable Flag to enable/disable SDXC auto tuning
  702. */
  703. static inline void sdxc_enable_auto_tuning(SDXC_Type *base, bool enable)
  704. {
  705. if (enable) {
  706. base->AUTO_TUNING_CTRL |= SDXC_AUTO_TUNING_CTRL_AT_EN_MASK;
  707. } else {
  708. base->AUTO_TUNING_CTRL &= ~SDXC_AUTO_TUNING_CTRL_AT_EN_MASK;
  709. }
  710. }
  711. /**
  712. * @brief Enable/Disable SDXC MMC boot
  713. * @param [in] base SDXC base address
  714. * @param [in] enable FLag to enable/disable SDXC MMC boot
  715. */
  716. static inline void sdxc_enable_mmc_boot(SDXC_Type *base, bool enable)
  717. {
  718. if (enable) {
  719. base->EMMC_BOOT_CTRL |= SDXC_EMMC_BOOT_CTRL_MAN_BOOT_EN_MASK;
  720. } else {
  721. base->EMMC_BOOT_CTRL &= ~SDXC_EMMC_BOOT_CTRL_MAN_BOOT_EN_MASK;
  722. }
  723. }
  724. /**
  725. * @brief Set SDXC force event
  726. * @param [in] base SDXC base address
  727. * @param [in] mask SDXC event mask
  728. */
  729. static inline void sdxc_force_event(SDXC_Type *base, uint32_t mask)
  730. {
  731. base->FORCE_EVENT = mask;
  732. }
  733. /**
  734. * @brief Enable/disable SDXC SD clock output
  735. * @param [in] base SDXC base address
  736. * @param [in] enable Flag to enable/disable SDXC SD clock output
  737. */
  738. static inline void sdxc_enable_sd_clock(SDXC_Type *base, bool enable)
  739. {
  740. if (enable) {
  741. base->SYS_CTRL |= SDXC_SYS_CTRL_SD_CLK_EN_MASK;
  742. while (!IS_HPM_BITMASK_SET(base->SYS_CTRL, SDXC_SYS_CTRL_SD_CLK_EN_MASK)) {
  743. }
  744. } else {
  745. base->SYS_CTRL &= ~SDXC_SYS_CTRL_SD_CLK_EN_MASK;
  746. while (IS_HPM_BITMASK_SET(base->SYS_CTRL, SDXC_SYS_CTRL_SD_CLK_EN_MASK)) {
  747. }
  748. }
  749. }
  750. /**
  751. * @brief Set SDXC center phase code
  752. * @param [in] base SDXC base address
  753. * @param [in] value SDXC center phase value
  754. */
  755. static inline void sdxc_set_center_phase_code(SDXC_Type *base, uint32_t value)
  756. {
  757. base->AUTO_TUNING_STAT = (base->AUTO_TUNING_STAT & ~SDXC_AUTO_TUNING_STAT_CENTER_PH_CODE_MASK) |
  758. SDXC_AUTO_TUNING_STAT_CENTER_PH_CODE_SET(value);
  759. }
  760. /**
  761. * @brief Enable SDXC enhanced strobe
  762. * @param [in] base SDXC base address
  763. * @param [in] enable flag to enable/disable SSDXC enhanced strobe
  764. */
  765. static inline void sdxc_enable_enhanced_strobe(SDXC_Type *base, bool enable)
  766. {
  767. if (enable) {
  768. base->EMMC_BOOT_CTRL |= SDXC_EMMC_BOOT_CTRL_ENH_STROBE_ENABLE_MASK;
  769. }
  770. else {
  771. base->EMMC_BOOT_CTRL &= ~SDXC_EMMC_BOOT_CTRL_ENH_STROBE_ENABLE_MASK;
  772. }
  773. }
  774. /**
  775. * @brief Set MMC boot configuration
  776. * @param [in] base SDXC base address
  777. * @param [in] config MMC boot configuration
  778. */
  779. void sdxc_set_mmc_boot_config(SDXC_Type *base, const sdxc_boot_config_t *config);
  780. /**
  781. * @brief Send Command via SDXC
  782. * @param [in] base SDXC base address
  783. * @param [in] cmd Command
  784. * @retval status_timeout Sending command timed out
  785. * @retval status_success Command was sent out successfully
  786. */
  787. hpm_stat_t sdxc_send_command(SDXC_Type *base, sdxc_command_t *cmd);
  788. /**
  789. * @brief Receive command response
  790. * @param [in] base SDXC base address
  791. * @param [in/out] cmd Command
  792. * @return status_success if no error happened
  793. */
  794. hpm_stat_t sdxc_receive_cmd_response(SDXC_Type *base, sdxc_command_t *cmd);
  795. /**
  796. * @brief Parse the SDXC interrupt status to HPM encoded status
  797. * @param [in] base SDXC base status
  798. * @return status_success if no error happened
  799. */
  800. hpm_stat_t sdxc_parse_interrupt_status(SDXC_Type *base);
  801. /**
  802. * @brief Wait until SDXC command completes
  803. * @param [in] base SDXC base address
  804. * @param [in] cmd Command
  805. * @param [out] polling_cmd_done flag to determine whether to use blocking wait
  806. * @retval SDXC command execution status
  807. */
  808. hpm_stat_t sdxc_wait_cmd_done(SDXC_Type *base, sdxc_command_t *cmd, bool polling_cmd_done);
  809. /**
  810. * @brief Set Data transfer configuration
  811. * @param [in] base SDXC base address
  812. * @param [in] data_dir Data transfer direction
  813. * @param [in] block_cnt Block count for data transfer
  814. * @param [in] block_size Block size for data transfer
  815. */
  816. void sdxc_set_data_config(SDXC_Type *base, sdxc_xfer_direction_t data_dir, uint32_t block_cnt, uint32_t block_size);
  817. /**
  818. * @brief Set ADMA table configuration
  819. * @param [in] base SDXC base address
  820. * @param [in] dma_cfg DMA configuration
  821. * @param [in] data_cfg Data configuration
  822. * @param [in] flags Flags for AMDA transfer
  823. * @retval API execution status
  824. */
  825. hpm_stat_t sdxc_set_adma_table_config(SDXC_Type *base, sdxc_adma_config_t *dma_cfg,
  826. sdxc_data_t *data_cfg, uint32_t flags);
  827. /**
  828. * @brief Set ADMA2 descriptor
  829. * @param [in] adma_tbl ADMA2 table
  830. * @param [in] adma_table_words ADMA2 table size in words
  831. * @param [in] data_buf pointer to the Data to be trnasferred
  832. * @param [in] data_bytes Data size for transfer
  833. * @param [in] flags Flags for ADMA2 descriptor
  834. * @retval API execution status
  835. */
  836. hpm_stat_t sdxc_set_adma2_desc(uint32_t *adma_tbl, uint32_t adma_table_words, const uint32_t *data_buf,
  837. uint32_t data_bytes, uint32_t flags);
  838. /**
  839. * @brief Set DMA configuration
  840. * @param [in] base SDXC base address
  841. * @param [in] dma_cfg DMA configuration data structure
  842. * @param [in] data_addr Buffer holds incoming/outgoing data
  843. * @param [in] enable_auto_cmd23 Flag to determine whether to enable auto CMD23 or not
  844. * @retval API execution status
  845. */
  846. hpm_stat_t sdxc_set_dma_config(SDXC_Type *base, sdxc_adma_config_t *dma_cfg, const uint32_t *data_addr,
  847. bool enable_auto_cmd23);
  848. /**
  849. * @brief Initialize SDXC controller
  850. * @param [in] base SDXC base address
  851. * @param [in] config SDXC configuration
  852. */
  853. void sdxc_init(SDXC_Type *base, const sdxc_config_t *config);
  854. /**
  855. * @brief Set the Data Timeout Counter value for an SD/eMMC device
  856. * @param [in] base SDXC base address
  857. * @param [in] timeout_in_ms Required timeout value in milliseconds, maximum value is 131,072ms
  858. * @param [out] actual_timeout_us Actual timeout in milliseconds, reported by this API
  859. */
  860. void sdxc_set_data_timeout(SDXC_Type *base, uint32_t timeout_in_ms, uint32_t *actual_timeout_ms);
  861. /**
  862. * @brief Set SDXC speed mode
  863. * @param [in] base SDXC base address
  864. * @param [in] mode SDXC speed mode option
  865. */
  866. void sdxc_set_speed_mode(SDXC_Type *base, sdxc_speed_mode_t mode);
  867. /**
  868. * @brief Set SDXC Data bus width
  869. * @param [in] base SDXC base address
  870. * @param [in] width SDXC bus width option
  871. */
  872. void sdxc_set_data_bus_width(SDXC_Type *base, sdxc_bus_width_t width);
  873. /**
  874. * @brief Get SDXC Data bus width
  875. * @param [in] base SDXC base address
  876. * @return Actual bus width, valid value: 1 / 4 / 8
  877. */
  878. uint32_t sdxc_get_data_bus_width(SDXC_Type *base);
  879. /**
  880. * @brief Set SDXC IO voltage
  881. * @param [in] base SDXC base address
  882. * @param [option] SDXC voltage option
  883. */
  884. void sdxc_select_voltage(SDXC_Type *base, sdxc_bus_voltage_option_t option);
  885. /**
  886. * @brief Reset SDXC
  887. * @param [in] base SDXC base address
  888. * @param [in] reset_type SDXC reset type
  889. * @param [in] timeout timeout ticks
  890. * @retval SDXC reset result
  891. */
  892. bool sdxc_reset(SDXC_Type *base, sdxc_sw_reset_type_t reset_type, uint32_t timeout);
  893. /**
  894. * @brief Enable SDXC wakeup interrupt
  895. * @param [in] base SDXC base address
  896. * @param [in] evt SDXC wakeup interrupt
  897. * @param [in] enable Flag to control whether to enable SDXC wakeup event
  898. */
  899. void sdxc_enable_wakeup_event(SDXC_Type *base, sdxc_wakeup_event_t evt, bool enable);
  900. /**
  901. * @brief Start SDXC transfer in blocking way
  902. * @param [in] base SDXC base address
  903. * @param [in] dma_config SDXC DMA configuration
  904. * @param [in] xfer SDXC transfer context
  905. * @retval SDXC transfer status
  906. */
  907. hpm_stat_t sdxc_transfer_blocking(SDXC_Type *base, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
  908. /**
  909. * @brief Start SDXC transfer in nonblocking way
  910. * @param [in] base SDXC base address
  911. * @param [in] dma_config SDXC DMA configuration
  912. * @param [in] xfer SDXC transfer context
  913. * @retval SDXC transfer status
  914. */
  915. hpm_stat_t sdxc_transfer_nonblocking(SDXC_Type *base, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
  916. /**
  917. * @brief SDXC Error recovery
  918. * @param [in] base SDXC base address
  919. * @retval SDXC error recovery status
  920. */
  921. hpm_stat_t sdxc_error_recovery(SDXC_Type *base);
  922. /**
  923. * @brief Perform SDXC tuning flow sequence
  924. * @param [in] base SDXC base address
  925. * @param [in] tuning_cmd Tuning command
  926. * @retval Tuning status
  927. */
  928. hpm_stat_t sdxc_perform_tuning_flow_sequence(SDXC_Type *base, uint8_t tuning_cmd);
  929. /**
  930. * @brief Perform SDXC software tuning
  931. * @param [in] base SDXC base address
  932. * @param [in] tuning_cmd Tuning command
  933. * @retval Tuning status
  934. */
  935. hpm_stat_t sdxc_perform_software_tuning(SDXC_Type *base, uint8_t tuning_cmd);
  936. /**
  937. * @brief Perform SDXC auto tuning
  938. * @param [in] base SDXC base address
  939. * @param [in] tuning_cmd tuning command
  940. * @retval Tuning status
  941. */
  942. hpm_stat_t sdxc_perform_auto_tuning(SDXC_Type *base, uint8_t tuning_cmd);
  943. #if defined(__cplusplus)
  944. }
  945. #endif
  946. /**
  947. * @}
  948. */
  949. #endif /*HPM_SDXC_DRV_H */