hpm_spi_drv.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * Copyright (c) 2021 hpmicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_SPI_DRV_H
  8. #define HPM_SPI_DRV_H
  9. #include "hpm_spi_regs.h"
  10. /**
  11. * @brief SPI driver APIs
  12. * @defgroup spi_interface SPI driver APIs
  13. * @ingroup io_interfaces
  14. * @{
  15. */
  16. /**
  17. * @brief spi mode selection
  18. */
  19. typedef enum {
  20. spi_master_mode = 0,
  21. spi_slave_mode
  22. } spi_mode_selection_t;
  23. /**
  24. * @brief spi clock polarity
  25. */
  26. typedef enum {
  27. spi_sclk_low_idle = 0,
  28. spi_sclk_high_idle
  29. } spi_sclk_idle_state_t;
  30. /**
  31. * @brief spi clock phase
  32. */
  33. typedef enum {
  34. spi_sclk_sampling_odd_clk_edges = 0,
  35. spi_sclk_sampling_even_clk_edges
  36. } spi_sclk_sampling_clk_edges_t;
  37. /**
  38. * @brief spi cs to sclk edge duration
  39. */
  40. typedef enum {
  41. spi_cs2sclk_half_sclk_1 = 0,
  42. spi_cs2sclk_half_sclk_2,
  43. spi_cs2sclk_half_sclk_3,
  44. spi_cs2sclk_half_sclk_4
  45. } spi_cs2sclk_duration_t;
  46. /**
  47. * @brief spi cs high level duration
  48. */
  49. typedef enum {
  50. spi_csht_half_sclk_1 = 0,
  51. spi_csht_half_sclk_2,
  52. spi_csht_half_sclk_3,
  53. spi_csht_half_sclk_4,
  54. spi_csht_half_sclk_5,
  55. spi_csht_half_sclk_6,
  56. spi_csht_half_sclk_7,
  57. spi_csht_half_sclk_8,
  58. spi_csht_half_sclk_9,
  59. spi_csht_half_sclk_10,
  60. spi_csht_half_sclk_11,
  61. spi_csht_half_sclk_12,
  62. spi_csht_half_sclk_13,
  63. spi_csht_half_sclk_14,
  64. spi_csht_half_sclk_15,
  65. spi_csht_half_sclk_16,
  66. } spi_csht_duration_t;
  67. /**
  68. * @brief spi address phase format
  69. */
  70. typedef enum {
  71. spi_address_phase_format_single_io_mode = 0,
  72. spi_address_phase_format_dualquad_io_mode
  73. } spi_addr_phase_format_t;
  74. /**
  75. * @brief spi transfer mode
  76. */
  77. typedef enum {
  78. spi_trans_write_read_together = 0,
  79. spi_trans_write_only,
  80. spi_trans_read_only,
  81. spi_trans_write_read,
  82. spi_trans_read_write,
  83. spi_trans_write_dummy_read,
  84. spi_trans_read_dummy_write,
  85. spi_trans_no_data,
  86. spi_trans_dummy_write,
  87. spi_trans_dummy_read
  88. } spi_trans_mode_t;
  89. /**
  90. * @brief spi data phase format
  91. */
  92. typedef enum {
  93. spi_single_io_mode = 0,
  94. spi_dual_io_mode,
  95. spi_quad_io_mode,
  96. } spi_data_phase_format_t;
  97. /**
  98. * @brief spi token value
  99. */
  100. typedef enum {
  101. spi_token_value_0x00 = 0,
  102. spi_token_value_0x69
  103. } spi_token_value_t;
  104. /**
  105. * @brief spi dummy count
  106. */
  107. typedef enum {
  108. spi_dummy_count_1 = 0,
  109. spi_dummy_count_2,
  110. spi_dummy_count_3,
  111. spi_dummy_count_4
  112. } spi_dummy_count_t;
  113. /**
  114. * @brief spi master interface timing config structure
  115. */
  116. typedef struct {
  117. uint32_t clk_src_freq_in_hz;
  118. uint32_t sclk_freq_in_hz;
  119. uint8_t cs2sclk;
  120. uint8_t csht;
  121. } spi_master_timing_config_t;
  122. /**
  123. * @brief spi interface timing config structure
  124. */
  125. typedef struct {
  126. spi_master_timing_config_t master_config;
  127. } spi_timing_config_t;
  128. /**
  129. * @brief spi master transfer format config structure
  130. */
  131. typedef struct {
  132. uint8_t addr_len_in_bytes;
  133. } spi_master_format_config_t;
  134. /**
  135. * @brief spi common format config structure
  136. */
  137. typedef struct {
  138. uint8_t data_len_in_bits;
  139. bool data_merge;
  140. bool mosi_bidir;
  141. bool lsb;
  142. uint8_t mode;
  143. uint8_t cpol;
  144. uint8_t cpha;
  145. } spi_common_format_config_t;
  146. /**
  147. * @brief spi format config structure
  148. */
  149. typedef struct {
  150. spi_master_format_config_t master_config;
  151. spi_common_format_config_t common_config;
  152. } spi_format_config_t;
  153. /**
  154. * @brief spi master transfer control config structure
  155. */
  156. typedef struct {
  157. bool cmd_enable;
  158. bool addr_enable;
  159. uint8_t addr_phase_fmt;
  160. bool token_enable;
  161. uint8_t token_value;
  162. } spi_master_control_config_t;
  163. /**
  164. * @brief spi slave transfer control config structure
  165. */
  166. typedef struct {
  167. bool slave_data_only;
  168. } spi_slave_control_config_t;
  169. /**
  170. * @brief spi common transfer control config structure
  171. */
  172. typedef struct {
  173. bool tx_dma_enable;
  174. bool rx_dma_enable;
  175. uint8_t trans_mode;
  176. uint8_t data_phase_fmt;
  177. uint8_t dummy_cnt;
  178. } spi_common_control_config_t;
  179. /**
  180. * @brief spi control config structure
  181. */
  182. typedef struct {
  183. spi_master_control_config_t master_config;
  184. spi_slave_control_config_t slave_config;
  185. spi_common_control_config_t common_config;
  186. } spi_control_config_t;
  187. #if defined(__cplusplus)
  188. extern "C" {
  189. #endif /* __cplusplus */
  190. /**
  191. * @brief spi master get default timing config
  192. *
  193. * @param [out] config spi_timing_config_t
  194. */
  195. void spi_master_get_default_timing_config(spi_timing_config_t *config);
  196. /**
  197. * @brief spi master get default format config
  198. *
  199. * @param [out] config spi_format_config_t
  200. */
  201. void spi_master_get_default_format_config(spi_format_config_t *config);
  202. /**
  203. * @brief spi master get default control config
  204. *
  205. * @param [out] config spi_control_config_t
  206. */
  207. void spi_master_get_default_control_config(spi_control_config_t *config);
  208. /**
  209. * @brief spi slave get default format config
  210. *
  211. * @param [out] config spi_format_config_t
  212. */
  213. void spi_slave_get_default_format_config(spi_format_config_t *config);
  214. /**
  215. * @brief spi slave get default control config
  216. *
  217. * @param [out] config spi_control_config_t
  218. */
  219. void spi_slave_get_default_control_config(spi_control_config_t *config);
  220. /**
  221. * @brief spi master timing initialization
  222. *
  223. * @param [in] ptr SPI base address
  224. * @param [in] config spi_timing_config_t
  225. * @retval hpm_stat_t status_invalid_argument or status_success
  226. */
  227. hpm_stat_t spi_master_timing_init(SPI_Type *ptr, spi_timing_config_t *config);
  228. /**
  229. * @brief spi format initialization
  230. *
  231. * @param [in] ptr SPI base address
  232. * @param [in] config spi_format_config_t
  233. */
  234. void spi_format_init(SPI_Type *ptr, spi_format_config_t *config);
  235. /**
  236. * @brief spi transfer
  237. *
  238. * @param [in] ptr SPI base address
  239. * @param [in] config spi_control_config_t
  240. * @param [in] cmd spi transfer mode
  241. * @param [in] addr spi transfer target address
  242. * @param [in] wbuff spi sent data buff address
  243. * @param [in] wsize spi sent data size in byte
  244. * @param [in] rbuff spi receive data buff address
  245. * @param [in] rsize spi receive data size
  246. * @retval hpm_stat_t status_success if spi transfer without any error
  247. */
  248. hpm_stat_t spi_transfer(SPI_Type *ptr,
  249. spi_control_config_t *config,
  250. uint8_t *cmd, uint32_t *addr,
  251. uint8_t *wbuff, uint32_t wsize, uint8_t *rbuff, uint32_t rsize);
  252. /**
  253. * @brief spi setup dma transfer
  254. *
  255. * @param [in] ptr SPI base address
  256. * @param [in] config spi_control_config_t
  257. * @param [in] cmd spi transfer mode
  258. * @param [in] addr spi transfer target address
  259. * @param [in] wsize spi sent data size in byte
  260. * @param [in] rsize spi receive data size
  261. * @retval hpm_stat_t status_success if spi setup dma transfer without any error
  262. */
  263. hpm_stat_t spi_setup_dma_transfer(SPI_Type *ptr,
  264. spi_control_config_t *config,
  265. uint8_t *cmd, uint32_t *addr,
  266. uint32_t wsize, uint32_t rsize);
  267. /**
  268. * @brief spi wait for idle status
  269. *
  270. * @param [in] ptr SPI base address
  271. * @retval hpm_stat_t status_success if spi in idle status
  272. */
  273. hpm_stat_t spi_wait_for_idle_status(SPI_Type *ptr);
  274. /**
  275. * @brief spi wait for busy status
  276. *
  277. * @param [in] ptr SPI base address
  278. * @retval hpm_stat_t status_success if spi in busy status
  279. */
  280. hpm_stat_t spi_wait_for_busy_status(SPI_Type *ptr);
  281. /**
  282. * @}
  283. */
  284. #if defined(__cplusplus)
  285. }
  286. #endif /* __cplusplus */
  287. #endif /* HPM_SPI_DRV_H */