hpm_ppi_drv.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. /*
  2. * Copyright (c) 2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_PPI_DRV_H
  8. #define HPM_PPI_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_soc_ip_feature.h"
  11. #include "hpm_ppi_regs.h"
  12. /**
  13. * @brief PPI driver APIs
  14. * @defgroup ppi_interface PPI driver APIs
  15. * @ingroup ppi_interfaces
  16. * @{
  17. */
  18. /**
  19. * @brief cs pin idle polarity
  20. *
  21. */
  22. typedef enum {
  23. ppi_cs_idle_pol_low = 0,
  24. ppi_cs_idle_pol_high
  25. } ppi_cs_idle_polarity_t; /**< ppi_cs_idle_polarity_t */
  26. /**
  27. * @brief dm pin valid polarity
  28. *
  29. */
  30. typedef enum {
  31. ppi_dm_valid_pol_high = 0,
  32. ppi_dm_valid_pol_low
  33. } ppi_dm_valid_polarity_t; /**< ppi_dm_valid_polarity_t */
  34. /**
  35. * @brief ctrl pin polarity
  36. *
  37. */
  38. typedef enum {
  39. ppi_ctrl_pol_low = 0,
  40. ppi_ctrl_pol_high
  41. } ppi_ctrl_polarity_t; /**< ppi_ctrl_polarity_t */
  42. /**
  43. * @brief ctrl pin direction
  44. *
  45. */
  46. typedef enum {
  47. ppi_ctrl_pin_dir_input = 0,
  48. ppi_ctrl_pin_dir_output,
  49. } ppi_ctrl_pin_dir_t; /**< ppi_ctrl_pin_dir_t */
  50. /**
  51. * @brief clock pin output mode
  52. *
  53. */
  54. typedef enum {
  55. ppi_clk_output_by_cmd_clk_output = 0,
  56. ppi_clk_always_output
  57. } ppi_clk_output_mode_t; /**< ppi_clk_output_mode_t */
  58. /**
  59. * @brief irq mask
  60. *
  61. */
  62. typedef enum {
  63. ppi_irq_tm_out_mask = PPI_IRQ_EN_IRQ_TMOUT_EN_MASK,
  64. } ppi_irq_mask_t; /**< ppi_irq_mask_t */
  65. /**
  66. * @brief port size
  67. *
  68. */
  69. typedef enum {
  70. ppi_port_size_8bits = 0,
  71. ppi_port_size_16bits,
  72. ppi_port_size_32bits,
  73. } ppi_port_size_t; /**< ppi_port_size_t */
  74. /**
  75. * @brief cmd byte select
  76. *
  77. */
  78. typedef enum {
  79. ppi_byte_sel_0_7_bits = 0,
  80. ppi_byte_sel_8_15_bits,
  81. ppi_byte_sel_16_23_bits,
  82. ppi_byte_sel_24_31_bits
  83. } ppi_byte_sel_t; /**< ppi_byte_sel_t */
  84. /**
  85. * @brief cmd address and data function
  86. *
  87. */
  88. typedef enum {
  89. ppi_ad_func_data = 0,
  90. ppi_ad_func_addr
  91. } ppi_ad_func_t; /**< ppi_ad_func_t */
  92. /**
  93. * @brief cmd address and data pins direction
  94. *
  95. */
  96. typedef enum {
  97. ppi_ad_pin_dir_output = 0,
  98. ppi_ad_pin_dir_input
  99. } ppi_ad_pin_dir_t; /**< ppi_ad_pin_dir_t */
  100. /**
  101. * @brief clock pin config structure
  102. *
  103. */
  104. typedef struct {
  105. uint8_t cycle_num;
  106. uint8_t high_num;
  107. uint8_t low_num;
  108. ppi_clk_output_mode_t mode;
  109. bool revert;
  110. } ppi_clk_pin_config_t; /**< ppi_clk_pin_config_t */
  111. /**
  112. * @brief cs pin config structure
  113. *
  114. */
  115. typedef struct {
  116. ppi_port_size_t port_size;
  117. uint16_t addr_start_high_12bits; /* address space: 0xF8000000 ~ 0xFFFFFFFF */
  118. uint16_t addr_end_high_12bits; /* address space: 0xF8000000 ~ 0xFFFFFFFF */
  119. uint16_t addr_mask;
  120. bool sync_clk_en;
  121. uint8_t sync_clk_sel;
  122. uint8_t interval_cycle;
  123. uint8_t rcmd_start0;
  124. uint8_t rcmd_end0;
  125. uint8_t rcmd_start1;
  126. uint8_t rcmd_end1;
  127. uint8_t wcmd_start0;
  128. uint8_t wcmd_end0;
  129. uint8_t wcmd_start1;
  130. uint8_t wcmd_end1;
  131. #if defined(HPM_IP_FEATURE_PPI_DM_POLARITY_EACH_CS) && HPM_IP_FEATURE_PPI_DM_POLARITY_EACH_CS
  132. ppi_dm_valid_polarity_t dm_polarity;
  133. #endif
  134. } ppi_cs_pin_config_t; /**< ppi_cs_pin_config_t */
  135. /**
  136. * @brief cmd config structure
  137. *
  138. */
  139. typedef struct {
  140. bool cs_pin_value;
  141. bool clk_output;
  142. uint8_t cmd_cycle;
  143. ppi_ad_func_t ad_func_sel[4];
  144. ppi_ad_pin_dir_t ad_pin_dir[4];
  145. ppi_byte_sel_t byte_sel[4];
  146. bool ctrl_pin_value[8];
  147. } ppi_cmd_config_t; /**< ppi_cmd_config_t */
  148. #ifdef __cplusplus
  149. extern "C" {
  150. #endif
  151. /**
  152. * @brief set ppi software reset
  153. *
  154. * @param[in] ppi PPI base address
  155. * @param[in] reset true - software reset; false - normal work.
  156. */
  157. static inline void ppi_set_reset(PPI_Type *ppi, bool reset)
  158. {
  159. if (reset) {
  160. ppi->GLB_CFG |= PPI_GLB_CFG_SOFT_RESET_MASK;
  161. } else {
  162. ppi->GLB_CFG &= ~PPI_GLB_CFG_SOFT_RESET_MASK;
  163. }
  164. }
  165. /**
  166. * @brief config cs pin work valid polarity
  167. *
  168. * @param[in] ppi PPI base address
  169. * @param[in] index cs pin index, value: 0 - 3
  170. * @param[in] pol @ref ppi_cs_idle_polarity_t
  171. */
  172. static inline void ppi_config_cs_pin_polarity(PPI_Type *ppi, uint8_t index, ppi_cs_idle_polarity_t pol)
  173. {
  174. assert(index < 4);
  175. ppi->PAD_CFG = (ppi->PAD_CFG & ~(((1u << PPI_PAD_CFG_CS_IDLE_ST_SHIFT) << index))) | (((pol << PPI_PAD_CFG_CS_IDLE_ST_SHIFT) << index));
  176. }
  177. /**
  178. * @brief config dm pin work polarity
  179. *
  180. * @param[in] ppi PPI base address
  181. * @param[in] index If has HPM_IP_FEATURE_PPI_DM_POLARITY_EACH_CS feature, this is cs pin index, value: 0 - 3. Else, not use.
  182. * @param[in] pol @ref ppi_dm_valid_polarity_t
  183. */
  184. static inline void ppi_config_dm_pin_polarity(PPI_Type *ppi, uint8_t index, ppi_dm_valid_polarity_t pol)
  185. {
  186. #if defined(HPM_IP_FEATURE_PPI_DM_POLARITY_EACH_CS) && HPM_IP_FEATURE_PPI_DM_POLARITY_EACH_CS
  187. assert(index < 4);
  188. ppi->CS[index].CFG2 = (ppi->CS[index].CFG2 & ~PPI_CS_CFG2_DM_POLARITY_MASK) | PPI_CS_CFG2_DM_POLARITY_SET(pol);
  189. #else
  190. (void)index;
  191. if (pol == ppi_dm_valid_pol_high) {
  192. ppi->PAD_CFG &= ~PPI_PAD_CFG_DM_PAD_POL_MASK;
  193. } else {
  194. ppi->PAD_CFG |= PPI_PAD_CFG_DM_PAD_POL_MASK;
  195. }
  196. #endif
  197. }
  198. /**
  199. * @brief config ctrl pin work polarity, output and input ctrl pin polarity has different meaning
  200. *
  201. * @param[in] ppi PPI base address
  202. * @param[in] index Ctrl pin index, value: 0 - 7
  203. * @param[in] pol @ref ppi_ctrl_polarity_t
  204. * [1] Output: ppi_ctrl_pol_low is output the value in cmd; ppi_ctrl_pol_high is output reversed value in cmd.
  205. * [2] Input: ppi_ctrl_pol_low is input low valid; ppi_ctrl_pol_high is input high valid.
  206. */
  207. static inline void ppi_config_ctrl_pin_polarity(PPI_Type *ppi, uint8_t index, ppi_ctrl_polarity_t pol)
  208. {
  209. assert(index < 8);
  210. ppi->PAD_CFG = (ppi->PAD_CFG & ~(((1u << PPI_PAD_CFG_CTRL_PAD_POL_SHIFT) << index))) | (((pol << PPI_PAD_CFG_CTRL_PAD_POL_SHIFT) << index));
  211. }
  212. /**
  213. * @brief set ctrl pin direction
  214. *
  215. * @param[in] ppi PPI base address
  216. * @param[in] index Ctrl pin index, value: 0 - 7
  217. * @param[in] dir Ctrl pin direction, @ref ppi_ctrl_pin_dir_t
  218. */
  219. static inline void ppi_set_ctrl_pin_dir(PPI_Type *ppi, uint8_t index, ppi_ctrl_pin_dir_t dir)
  220. {
  221. assert(index < 8);
  222. ppi->PAD_CFG = (ppi->PAD_CFG & ~(((1u << PPI_PAD_CFG_CTRL_PAD_OE_SHIFT) << index))) | (((dir << PPI_PAD_CFG_CTRL_PAD_OE_SHIFT) << index));
  223. }
  224. /**
  225. * @brief config timeout
  226. *
  227. * @param[in] ppi PPI base address
  228. * @param[in] timeout_cnt timeout counter
  229. * @param[in] enable true - enable; false - disable
  230. */
  231. static inline void ppi_config_timeout(PPI_Type *ppi, uint16_t timeout_cnt, bool enable)
  232. {
  233. ppi->TM_CFG = PPI_TM_CFG_TM_CFG_SET(timeout_cnt) | PPI_TM_CFG_TM_EN_SET(enable);
  234. }
  235. /**
  236. * @brief set irq enable
  237. *
  238. * @param[in] ppi PPI base address
  239. * @param[in] mask irq mask, @ref ppi_irq_mask_t
  240. */
  241. static inline void ppi_set_irq_enable(PPI_Type *ppi, uint32_t mask)
  242. {
  243. ppi->IRQ_EN |= mask;
  244. }
  245. /**
  246. * @brief set irq disable
  247. *
  248. * @param[in] ppi PPI base address
  249. * @param[in] mask irq mask, @ref ppi_irq_mask_t
  250. */
  251. static inline void ppi_set_irq_disable(PPI_Type *ppi, uint32_t mask)
  252. {
  253. ppi->IRQ_EN &= ~mask;
  254. }
  255. /**
  256. * @brief get irq enable status
  257. *
  258. * @param[in] ppi PPI base address
  259. * @retval irq enable status, @ref ppi_irq_mask_t
  260. */
  261. static inline uint32_t ppi_get_irq_enable_status(PPI_Type *ppi)
  262. {
  263. return ppi->IRQ_EN;
  264. }
  265. /**
  266. * @brief get irq status
  267. *
  268. * @param[in] ppi PPI base address
  269. * @retval irq status, @ref ppi_irq_mask_t
  270. */
  271. static inline uint32_t ppi_get_irq_status(PPI_Type *ppi)
  272. {
  273. return ppi->IRQ_STS;
  274. }
  275. /**
  276. * @brief clear irq flag
  277. *
  278. * @param[in] ppi PPI base address
  279. * @param[in] mask irq mask, @ref ppi_irq_mask_t
  280. */
  281. static inline void ppi_clear_irq_flag(PPI_Type *ppi, uint32_t mask)
  282. {
  283. ppi->IRQ_STS = mask;
  284. }
  285. /**
  286. * @brief set clk pin enable
  287. *
  288. * @param[in] ppi PPI base address
  289. */
  290. static inline void ppi_set_clk_pin_enable(PPI_Type *ppi)
  291. {
  292. ppi->CLKPIN_CFG |= PPI_CLKPIN_CFG_EN_MASK;
  293. }
  294. /**
  295. * @brief set clk pin disable
  296. *
  297. * @param[in] ppi PPI base address
  298. */
  299. static inline void ppi_set_clk_pin_disable(PPI_Type *ppi)
  300. {
  301. ppi->CLKPIN_CFG &= ~PPI_CLKPIN_CFG_EN_MASK;
  302. }
  303. /**
  304. * @brief config clock pin output
  305. *
  306. * @param[in] ppi PPI base address
  307. * @param[in] config clock pin config structure pointer, @ref ppi_clk_pin_config_t
  308. */
  309. void ppi_config_clk_pin(PPI_Type *ppi, ppi_clk_pin_config_t *config);
  310. /**
  311. * @brief config cs pin
  312. *
  313. * @param[in] ppi PPI base address
  314. * @param[in] index cs pin index, value: 0 - 3
  315. * @param[in] config cs pin config structure pointer, @ref ppi_cs_pin_config_t
  316. */
  317. void ppi_config_cs_pin(PPI_Type *ppi, uint8_t index, ppi_cs_pin_config_t *config);
  318. /**
  319. * @brief config cmd
  320. *
  321. * @param[in] ppi PPI base address
  322. * @param[in] index cmd index, value: 0 - 63
  323. * @param[in] config cmd config structure pointer, @ref ppi_cmd_config_t
  324. */
  325. void ppi_config_cmd(PPI_Type *ppi, uint8_t index, ppi_cmd_config_t *config);
  326. #ifdef __cplusplus
  327. }
  328. #endif
  329. /**
  330. * @}
  331. */
  332. #endif /* HPM_PPI_DRV_H */