hpm_sdmmc_sd.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. /*
  2. * Copyright (c) 2021-2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_SDMMC_SD_H
  8. #define HPM_SDMMC_SD_H
  9. /**
  10. *
  11. * @brief HPM SDMMC SD driver APIs
  12. * @defgroup hpm_sdmmc HPM SDMMC stack
  13. * @ingroup hpm_sdmmc_interfaces
  14. * @{
  15. *
  16. */
  17. #include "hpm_sdmmc_common.h"
  18. #include "hpm_sdmmc_card.h"
  19. #include "hpm_sdmmc_port.h"
  20. typedef enum {
  21. sd_timing_sdr12_default = 0,
  22. sd_timing_sdr25_highspeed = 1,
  23. sd_timing_sdr50 = 2,
  24. sd_timing_sdr104 = 3,
  25. sd_timing_ddr50 = 4,
  26. } sd_timing_mode_t;
  27. typedef enum {
  28. sd_drive_strength_type_b = 0,
  29. sd_drive_strength_type_a = 1,
  30. sd_drive_strength_type_c = 2,
  31. sd_drive_strength_type_d = 3
  32. } sd_drive_strength_t;
  33. typedef enum {
  34. sd_current_limit_200ma,
  35. sd_current_limit_400ma,
  36. sd_current_limit_600ma,
  37. sd_current_limit_800ma,
  38. } sd_max_current_t;
  39. typedef union {
  40. uint32_t flags;
  41. struct {
  42. uint32_t support_speed_class_control_cmd: 1;
  43. uint32_t support_set_block_count_cmd: 1;
  44. uint32_t support_4bit_width: 1;
  45. uint32_t is_byte_addressing_mode:1;
  46. };
  47. } sd_flags_t;
  48. enum {
  49. sd_switch_function_group_access_mode = 1,
  50. sd_switch_function_group_command_system = 2,
  51. sd_switch_function_group_drive_strength = 3,
  52. sd_switch_function_group_power_limit = 4,
  53. };
  54. enum {
  55. sd_switch_function_mode_check = 0,
  56. sd_switch_function_mode_set = 1,
  57. };
  58. typedef union {
  59. uint32_t status_word[16];
  60. struct {
  61. uint32_t reserved0[8];
  62. uint16_t reserved1;
  63. uint16_t busy_status_for_function_in_group1;
  64. uint16_t busy_status_for_function_in_group2;
  65. uint16_t busy_status_for_function_in_group3;
  66. uint16_t busy_status_for_function_in_group4;
  67. uint16_t busy_status_for_function_in_group5;
  68. uint32_t busy_status_for_function_in_group6: 16;
  69. uint32_t data_structure_version: 8;
  70. uint32_t function_selection_of_function_group1: 4;
  71. uint32_t function_selection_of_function_group2: 4;
  72. uint32_t function_selection_of_function_group3: 4;
  73. uint32_t function_selection_of_function_group4: 4;
  74. uint32_t function_selection_of_function_group5: 4;
  75. uint32_t function_selection_of_function_group6: 4;
  76. uint32_t support_bits_of_functions_in_function_group1: 16;
  77. uint32_t support_bits_of_functions_in_function_group2: 16;
  78. uint32_t support_bits_of_functions_in_function_group3: 16;
  79. uint32_t support_bits_of_functions_in_function_group4: 16;
  80. uint32_t support_bits_of_functions_in_function_group5: 16;
  81. uint32_t support_bits_of_functions_in_function_group6: 16;
  82. uint32_t max_current_or_power_consumption: 16;
  83. };
  84. } switch_function_status_t;
  85. typedef struct _sdmmc_sdcard {
  86. sdmmc_host_t *host;
  87. uint16_t relative_addr;
  88. sd_cid_t cid;
  89. sd_ocr_t ocr;
  90. sd_csd_t csd;
  91. sd_scr_t scr;
  92. switch_function_status_t sfs;
  93. sd_status_t status;
  94. sdmmc_r1_status_t r1_status;
  95. sd_flags_t sd_flags;
  96. uint32_t block_count;
  97. uint32_t block_size;
  98. uint32_t max_freq;
  99. uint64_t card_size_in_bytes;
  100. sdmmc_speed_mode_t current_timing;
  101. sd_drive_strength_t drive_strength;
  102. sd_max_current_t max_current;
  103. sdmmc_operation_voltage_t operation_voltage;
  104. bool is_host_ready;
  105. } sd_card_t;
  106. #ifdef __cplusplus
  107. extern "C" {
  108. #endif
  109. /**
  110. * @brief Initialize SD device
  111. *
  112. * @param [in,out] card SD card context
  113. *
  114. * @return Operation status
  115. */
  116. hpm_stat_t sd_init(sd_card_t *card);
  117. /**
  118. * @brief De-Initialize SD device
  119. *
  120. * @param [in,out] card SD card context
  121. *
  122. * @return Operation status
  123. */
  124. void sd_deinit(const sd_card_t *card);
  125. /**
  126. * @brief Initialize SD card
  127. *
  128. * @param [in,out] card SD card context
  129. *
  130. * @return Operation status
  131. */
  132. hpm_stat_t sd_card_init(sd_card_t *card);
  133. /**
  134. * @brief De-Initialize SD card
  135. *
  136. * @param [in,out] card SD card context
  137. *
  138. * @return Operation status
  139. */
  140. void sd_card_deinit(sd_card_t *card);
  141. /**
  142. * @brief Initialize SD Host
  143. *
  144. * @param [in,out] card SD card context
  145. *
  146. * @return Operation status
  147. */
  148. hpm_stat_t sd_host_init(sd_card_t *card);
  149. /**
  150. * @brief De-Initialize SD Host
  151. *
  152. * @param [in,out] card SD card context
  153. *
  154. * @return Operation status
  155. */
  156. hpm_stat_t sd_host_deinit(sd_card_t *card);
  157. /**
  158. * @brief Check whether the SD card is present
  159. *
  160. * @param [in] card SD card context
  161. *
  162. * @return Operation status
  163. */
  164. bool sd_is_card_present(const sd_card_t *card);
  165. /**
  166. * @brief Select/Deselect SD card
  167. * @param [in] card SD card context
  168. * @param [in] is_selected true: select, false: deselect
  169. *
  170. * @return Command execution status
  171. */
  172. hpm_stat_t sd_select_card(const sd_card_t *card, bool is_selected);
  173. /**
  174. * @brief Read SD card status
  175. *
  176. * @param [in] card SD card context
  177. *
  178. * @return Command execution status
  179. */
  180. hpm_stat_t sd_read_status(sd_card_t *card);
  181. /**
  182. * @brief Read data from specified SD block
  183. *
  184. * @param [in] card SD card context
  185. * @param [out] buffer buffer to store data
  186. * @param [in] start_block start block index
  187. * @param [in] block_count Number of blocks to be read
  188. *
  189. * @return Command execution status
  190. */
  191. hpm_stat_t sd_read_blocks(sd_card_t *card, uint8_t *buffer, uint32_t start_block, uint32_t block_count);
  192. /**
  193. * @brief Write data to specified SD block
  194. *
  195. * @param [in] card SD card context
  196. * @param [in] buffer Data buffer
  197. * @param [in] start_block start block index
  198. * @param [in] block_count Number of blocks to be written
  199. *
  200. * @return Command execution status
  201. */
  202. hpm_stat_t sd_write_blocks(sd_card_t *card, const uint8_t *buffer, uint32_t start_block, uint32_t block_count);
  203. /**
  204. * @brief Erase specified SD ranges
  205. *
  206. * @param [in] card SD card context
  207. * @param [in] start_block start block index
  208. * @param [in] block_count Number of blocks to be erased
  209. *
  210. * @return Command execution status
  211. */
  212. hpm_stat_t sd_erase_blocks(sd_card_t *card, uint32_t start_block, uint32_t block_count);
  213. /**
  214. * @brief Set the driver strength for SD card
  215. *
  216. * @param [in] card SD card context
  217. * @param [in] driver_strength Driver strength
  218. *
  219. * @return Command execution status
  220. */
  221. hpm_stat_t sd_set_driver_strength(sd_card_t *card, sd_drive_strength_t driver_strength);
  222. /**
  223. * @brief Set the maximum current for SD card
  224. * @param [in] card SD card context
  225. * @param [in] max_current Maximum current
  226. *
  227. * @return Command execution status
  228. */
  229. hpm_stat_t sd_set_max_current(sd_card_t *card, sd_max_current_t max_current);
  230. /**
  231. * @brief Polling SD card status busy
  232. * @param [in] card SD card context
  233. * @param [in] timeout_ms Timeout in milliseconds
  234. *
  235. * @return Command execution status
  236. */
  237. hpm_stat_t sd_polling_card_status_busy(sd_card_t *card, uint32_t timeout_ms);
  238. #ifdef __cplusplus
  239. }
  240. #endif
  241. /**
  242. * @}
  243. */
  244. #endif /* HPM_SDMMC_SD_H */