hpm_vad_drv.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /*
  2. * Copyright (c) 2021 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_VAD_DRV_H
  8. #define HPM_VAD_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_vad_regs.h"
  11. /**
  12. * @brief VAD driver APIs
  13. * @defgroup vad_interface VAD driver APIs
  14. * @ingroup io_interfaces
  15. * @{
  16. */
  17. /**
  18. * @brief vad event
  19. */
  20. #define VAD_EVENT_VAD (1U << 7)
  21. #define VAD_EVENT_FIFO_DATA_AVAILABLE (1U << 6)
  22. #define VAD_EVENT_MEMBUF_EMPTY (1U << 5)
  23. #define VAD_EVENT_FIFO_OVERFLOW (1U << 4)
  24. #define VAD_EVENT_IIR_OVERLOAD (1U << 3)
  25. #define VAD_EVENT_IIR_OVERFLOW (1U << 2)
  26. #define VAD_EVENT_CIC_OVERLOAD_ERROR (1U << 1)
  27. #define VAD_EVENT_CIC_STA_ERROR (1U << 0)
  28. /**
  29. * @brief vad config
  30. */
  31. typedef struct vad_config {
  32. bool enable_buffer;
  33. bool enable_pdm_clock_out;
  34. bool enable_two_channels;
  35. uint8_t capture_delay;
  36. uint8_t pdm_half_div;
  37. uint8_t fifo_threshold;
  38. uint8_t post_scale;
  39. bool channel_polarity_high[2];
  40. } vad_config_t;
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44. /**
  45. * @brief set capture deplay cycle
  46. *
  47. * @param [in] ptr VAD base address
  48. * @param [in] delay delay cycle value
  49. */
  50. static inline void vad_set_capture_delay(VAD_Type *ptr, uint8_t delay)
  51. {
  52. ptr->CTRL = (ptr->CTRL & ~VAD_CTRL_CAPT_DLY_MASK)
  53. | VAD_CTRL_CAPT_DLY_SET(delay);
  54. }
  55. /**
  56. * @brief set pdm clock hald_divider
  57. *
  58. * @param [in] ptr VAD base address
  59. * @param [in] div divider value
  60. */
  61. static inline void vad_set_pdm_clock_half_div(VAD_Type *ptr, uint8_t div)
  62. {
  63. ptr->CTRL = (ptr->CTRL & ~VAD_CTRL_PDM_CLK_HFDIV_MASK)
  64. | VAD_CTRL_PDM_CLK_HFDIV_SET(div);
  65. }
  66. /**
  67. * @brief enable irq
  68. *
  69. * @param [in] ptr VAD base address
  70. * @param [in] irq_mask irq mask value
  71. */
  72. static inline void vad_enable_irq(VAD_Type *ptr, uint32_t irq_mask)
  73. {
  74. ptr->CTRL |= irq_mask;
  75. }
  76. /**
  77. * @brief disable irq
  78. *
  79. * @param [in] ptr VAD base address
  80. * @param [in] irq_mask irq mask value
  81. */
  82. static inline void vad_disable_irq(VAD_Type *ptr, uint32_t irq_mask)
  83. {
  84. ptr->CTRL &= ~irq_mask;
  85. }
  86. /**
  87. * @brief disable buffer
  88. *
  89. * @param [in] ptr VAD base address
  90. */
  91. static inline void vad_disable_buffer(VAD_Type *ptr)
  92. {
  93. ptr->CTRL |= VAD_CTRL_MEMBUF_DISABLE_MASK;
  94. }
  95. /**
  96. * @brief enable buffer
  97. *
  98. * @param [in] ptr VAD base address
  99. */
  100. static inline void vad_enable_buffer(VAD_Type *ptr)
  101. {
  102. ptr->CTRL &= ~VAD_CTRL_MEMBUF_DISABLE_MASK;
  103. }
  104. /**
  105. * @brief set fifo threshold
  106. *
  107. * @param [in] ptr VAD base address
  108. * @param [in] threshold fifo threshold value
  109. */
  110. static inline void vad_set_fifo_threshold(VAD_Type *ptr, uint8_t threshold)
  111. {
  112. ptr->CTRL = (ptr->CTRL & ~(VAD_CTRL_FIFO_THRSH_MASK))
  113. | VAD_CTRL_FIFO_THRSH_SET(threshold);
  114. }
  115. /**
  116. * @brief enable pdm clock out
  117. *
  118. * @param [in] ptr VAD base address
  119. */
  120. static inline void vad_enable_pdm_clock_out(VAD_Type *ptr)
  121. {
  122. ptr->CTRL |= VAD_CTRL_PDM_CLK_OE_MASK;
  123. }
  124. /**
  125. * @brief disable pdm clock out
  126. *
  127. * @param [in] ptr VAD base address
  128. */
  129. static inline void vad_disable_pdm_clock_out(VAD_Type *ptr)
  130. {
  131. ptr->CTRL &= ~VAD_CTRL_PDM_CLK_OE_MASK;
  132. }
  133. /**
  134. * @brief set pdm clock polarity
  135. *
  136. * @param [in] ptr VAD base address
  137. * @param [in] level clock polarity
  138. */
  139. static inline void vad_set_pdm_clock_capture_level(VAD_Type *ptr, uint8_t level)
  140. {
  141. ptr->CTRL = (ptr->CTRL & ~VAD_CTRL_CH_POL_MASK)
  142. | VAD_CTRL_CH_POL_SET(level);
  143. }
  144. /**
  145. * @brief set channel number
  146. *
  147. * @param [in] ptr VAD base address
  148. * @param [in] two_channels:
  149. * @arg true: set two channels
  150. * @arg false: set one channel
  151. */
  152. static inline void vad_set_channel_number(VAD_Type *ptr, bool two_channels)
  153. {
  154. ptr->CTRL = (ptr->CTRL & ~VAD_CTRL_CHNUM_MASK)
  155. | (two_channels ? VAD_CTRL_CHNUM_MASK : 0);
  156. }
  157. /**
  158. * @brief get status
  159. *
  160. * @param [in] ptr VAD base address
  161. * @retval ST register value
  162. */
  163. static inline uint32_t vad_get_status(VAD_Type *ptr)
  164. {
  165. return ptr->ST;
  166. }
  167. /**
  168. * @brief slear status
  169. *
  170. * @param [in] ptr VAD base address
  171. * @param [in] mask status mask value
  172. */
  173. static inline void vad_clear_status(VAD_Type *ptr, uint32_t mask)
  174. {
  175. ptr->ST |= mask;
  176. }
  177. /**
  178. * @brief get data
  179. *
  180. * @param [in] ptr VAD base address
  181. * @retval OFIFO register value
  182. */
  183. static inline uint32_t vad_get_data(VAD_Type *ptr)
  184. {
  185. return ptr->OFIFO;
  186. }
  187. /**
  188. * @brief software reset
  189. *
  190. * @param [in] ptr VAD base address
  191. */
  192. static inline void vad_software_reset(VAD_Type *ptr)
  193. {
  194. ptr->RUN |= VAD_RUN_SFTRST_MASK;
  195. ptr->RUN &= ~VAD_RUN_SFTRST_MASK;
  196. }
  197. /**
  198. * @brief start
  199. *
  200. * @param [in] ptr VAD base address
  201. */
  202. static inline void vad_start(VAD_Type *ptr)
  203. {
  204. ptr->RUN |= VAD_RUN_VAD_EN_MASK;
  205. }
  206. /**
  207. * @brief stop
  208. *
  209. * @param [in] ptr VAD base address
  210. */
  211. static inline void vad_stop(VAD_Type *ptr)
  212. {
  213. ptr->RUN &= ~VAD_RUN_VAD_EN_MASK;
  214. }
  215. /**
  216. * @brief check whether vad is running
  217. *
  218. * @param [in] ptr VAD base address
  219. * @retval true if vad is running
  220. */
  221. static inline bool vad_is_running(VAD_Type *ptr)
  222. {
  223. return ptr->RUN & VAD_RUN_VAD_EN_MASK;
  224. }
  225. /**
  226. * @brief enable fifo
  227. *
  228. * @param [in] ptr VAD base address
  229. */
  230. static inline void vad_enable_fifo(VAD_Type *ptr)
  231. {
  232. ptr->OFIFO_CTRL |= VAD_OFIFO_CTRL_EN_MASK;
  233. }
  234. /**
  235. * @brief disable fifo
  236. *
  237. * @param [in] ptr VAD base address
  238. */
  239. static inline void vad_disable_fifo(VAD_Type *ptr)
  240. {
  241. ptr->OFIFO_CTRL &= ~VAD_OFIFO_CTRL_EN_MASK;
  242. }
  243. /**
  244. * @brief get coefficient value
  245. *
  246. * @param [in] ptr VAD base address
  247. * @param [in] index coefficient index
  248. */
  249. static inline uint32_t vad_get_coef_value(VAD_Type *ptr, uint32_t index)
  250. {
  251. return ptr->COEF[index];
  252. }
  253. /**
  254. * @brief set ouptput value post scale
  255. *
  256. * @param [in] ptr VAD base address
  257. * @param [in] post_scale post scale value
  258. */
  259. static inline void vad_set_post_scale(VAD_Type *ptr, uint8_t post_scale)
  260. {
  261. ptr->CIC_CFG |= (ptr->CIC_CFG & ~VAD_CIC_CFG_POST_SCALE_MASK)
  262. | VAD_CIC_CFG_POST_SCALE_SET(post_scale);
  263. }
  264. /**
  265. * @brief set sampling signal amplitude limits
  266. *
  267. * @param [in] ptr VAD base address
  268. * @param [in] high high limit
  269. * @param [in] low low limit
  270. */
  271. static inline void vad_set_amplify(VAD_Type *ptr, uint16_t high, uint16_t low)
  272. {
  273. ptr->DEC_CTRL2 = VAD_DEC_CTRL2_AMP_HIGH_SET(high)
  274. | VAD_DEC_CTRL2_AMP_LOW_SET(low);
  275. }
  276. /**
  277. * @brief get default config
  278. *
  279. * @param [in] ptr VAD base address
  280. * @param [out] config vad_config_t
  281. */
  282. void vad_get_default_config(VAD_Type *ptr, vad_config_t *config);
  283. /**
  284. * @brief initialization
  285. *
  286. * @param [in] ptr VAD base address
  287. * @param [in] config vad_config_t
  288. */
  289. void vad_init(VAD_Type *ptr, vad_config_t *config);
  290. /**
  291. * @brief reset
  292. *
  293. * @param [in] ptr VAD base address
  294. */
  295. void vad_reset(VAD_Type *ptr);
  296. /**
  297. * @}
  298. */
  299. #ifdef __cplusplus
  300. }
  301. #endif
  302. #endif /* HPM_VAD_DRV_H */