hpm_smix_drv.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. /*
  2. * Copyright (c) 2023 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_SMIX_DRV_H
  8. #define HPM_SMIX_DRV_H
  9. #include "hpm_common.h"
  10. #include "hpm_soc_feature.h"
  11. #include "hpm_smix_regs.h"
  12. #include <math.h>
  13. /**
  14. * @brief SMIX driver APIs
  15. * @defgroup smix_interface SMIX driver APIs
  16. * @ingroup smix_interfaces
  17. * @{
  18. */
  19. typedef enum {
  20. smix_dma_transfer_burst_1t = 0U,
  21. smix_dma_transfer_burst_2t = 1U,
  22. smix_dma_transfer_burst_4t = 2U,
  23. smix_dma_transfer_burst_8t = 3U,
  24. smix_dma_transfer_burst_16t = 4U,
  25. smix_dma_transfer_burst_32t = 5U,
  26. smix_dma_transfer_burst_64t = 6U,
  27. smix_dma_transfer_burst_128t = 7U,
  28. } smix_dma_transfer_burst_t;
  29. typedef enum {
  30. smix_dma_transfer_byte = 0U,
  31. smix_dma_transfer_half_word = 1U,
  32. smix_dma_transfer_word = 2U,
  33. } smix_dma_transfer_width_t;
  34. typedef enum {
  35. smix_dma_address_increment = 0U,
  36. smix_dma_address_decrement = 1U,
  37. smix_dma_address_fixed = 2U
  38. } smix_dma_address_control_t;
  39. typedef enum {
  40. smix_dma_mode_normal = 0,
  41. smix_dma_mode_handshake = 1,
  42. } smix_dma_handshake_mode_t;
  43. typedef enum {
  44. smix_dma_req_i2s0_rx = 6,
  45. smix_dma_req_i2s0_tx = 7,
  46. smix_dma_req_i2s1_rx = 8,
  47. smix_dma_req_i2s1_tx = 9,
  48. smix_dma_req_i2s2_rx = 10,
  49. smix_dma_req_i2s2_tx = 11,
  50. smix_dma_req_i2s3_rx = 12,
  51. smix_dma_req_i2s3_tx = 13,
  52. smix_dma_req_mixer_src_ch0 = 16,
  53. smix_dma_req_mixer_src_ch1 = 17,
  54. smix_dma_req_mixer_src_ch2 = 18,
  55. smix_dma_req_mixer_src_ch3 = 19,
  56. smix_dma_req_mixer_src_ch4 = 20,
  57. smix_dma_req_mixer_src_ch5 = 21,
  58. smix_dma_req_mixer_src_ch6 = 22,
  59. smix_dma_req_mixer_src_ch7 = 23,
  60. smix_dma_req_mixer_src_ch8 = 24,
  61. smix_dma_req_mixer_src_ch9 = 25,
  62. smix_dma_req_mixer_src_ch10 = 26,
  63. smix_dma_req_mixer_src_ch11 = 27,
  64. smix_dma_req_mixer_src_ch12 = 28,
  65. smix_dma_req_mixer_src_ch13 = 29,
  66. smix_dma_req_mixer_dst_ch0 = 30,
  67. smix_dma_req_mixer_dst_ch1 = 31,
  68. } smix_dma_req_t;
  69. typedef enum {
  70. smix_src_clk_i2s0_bclk = 0,
  71. smix_src_clk_i2s0_fclk = 1,
  72. smix_src_clk_i2s0_mclk = 2,
  73. smix_src_clk_i2s1_bclk = 3,
  74. smix_src_clk_i2s1_fclk = 4,
  75. smix_src_clk_i2s1_mclk = 5,
  76. smix_src_clk_i2s2_bclk = 6,
  77. smix_src_clk_i2s2_fclk = 7,
  78. smix_src_clk_i2s2_mclk = 8,
  79. smix_src_clk_i2s3_bclk = 9,
  80. smix_src_clk_i2s3_fclk = 10,
  81. smix_src_clk_i2s3_mclk = 11,
  82. smix_src_clk_none = 15,
  83. } smix_src_clk_source_t;
  84. typedef struct {
  85. uint32_t ctrl; /**< Control */
  86. uint32_t trans_size; /**< Transfer size in source width */
  87. uint32_t src_addr; /**< Source address */
  88. uint32_t reserved0; /**< reserved */
  89. uint32_t dst_addr; /**< Destination address */
  90. uint32_t reserved1; /**< reserved */
  91. uint32_t linked_ptr; /**< Linked descriptor address */
  92. uint32_t reserved2; /**< resetved */
  93. } smix_dma_linked_descriptor_t;
  94. typedef struct {
  95. uint8_t priority; /**< Channel priority */
  96. uint8_t src_burst_size; /**< Source burst size */
  97. uint8_t src_req_sel;
  98. uint8_t dst_req_sel;
  99. uint8_t src_mode; /**< Source work mode */
  100. uint8_t dst_mode; /**< Destination work mode */
  101. uint8_t src_width; /**< Source width */
  102. uint8_t dst_width; /**< Destination width */
  103. uint8_t src_addr_ctrl; /**< Source address control */
  104. uint8_t dst_addr_ctrl; /**< Destination address control */
  105. bool abort_int_en; /**< enable abort interrupt */
  106. bool error_int_en; /**< enable error interrupt */
  107. bool complete_int_en; /**< enable complete interrupt */
  108. uint32_t src_addr; /**< Source address */
  109. uint32_t dst_addr; /**< Destination address */
  110. uint32_t linked_ptr; /**< Next linked descriptor */
  111. uint32_t trans_bytes; /**< Total size to be transferred in byte */
  112. } smix_dma_ch_config_t;
  113. /* gain bit[14:0] */
  114. /* low 12 bits is fraction */
  115. /* high 3 bits: 1 - right shift 2; 2 - right shift 4 */
  116. typedef enum {
  117. smix_mixer_gain_decrease_20db = 0x199,
  118. smix_mixer_gain_decrease_19db = 0x1cb,
  119. smix_mixer_gain_decrease_18db = 0x203,
  120. smix_mixer_gain_decrease_17db = 0x242,
  121. smix_mixer_gain_decrease_16db = 0x289,
  122. smix_mixer_gain_decrease_15db = 0x2d8,
  123. smix_mixer_gain_decrease_14db = 0x331,
  124. smix_mixer_gain_decrease_13db = 0x395,
  125. smix_mixer_gain_decrease_12db = 0x404,
  126. smix_mixer_gain_decrease_11db = 0x482,
  127. smix_mixer_gain_decrease_10db = 0x50f,
  128. smix_mixer_gain_decrease_9db = 0x5ad,
  129. smix_mixer_gain_decrease_8db = 0x65e,
  130. smix_mixer_gain_decrease_7db = 0x725,
  131. smix_mixer_gain_decrease_6db = 0x804,
  132. smix_mixer_gain_decrease_5db = 0x8ff,
  133. smix_mixer_gain_decrease_4db = 0xa18,
  134. smix_mixer_gain_decrease_3db = 0xb53,
  135. smix_mixer_gain_decrease_2db = 0xcb5,
  136. smix_mixer_gain_decrease_1db = 0xe42,
  137. smix_mixer_gain_0db = 0xfff,
  138. smix_mixer_gain_increase_1db = 0x147c,
  139. smix_mixer_gain_increase_2db = 0x1509,
  140. smix_mixer_gain_increase_3db = 0x15a6,
  141. smix_mixer_gain_increase_4db = 0x1657,
  142. smix_mixer_gain_increase_5db = 0x171c,
  143. smix_mixer_gain_increase_6db = 0x17fa,
  144. smix_mixer_gain_increase_7db = 0x18f4,
  145. smix_mixer_gain_increase_8db = 0x1a0c,
  146. smix_mixer_gain_increase_9db = 0x1b45,
  147. smix_mixer_gain_increase_10db = 0x1ca5,
  148. smix_mixer_gain_increase_11db = 0x1e31,
  149. smix_mixer_gain_increase_12db = 0x1fed,
  150. smix_mixer_gain_increase_13db = 0x2477,
  151. smix_mixer_gain_increase_14db = 0x2503,
  152. smix_mixer_gain_increase_15db = 0x259f,
  153. smix_mixer_gain_increase_16db = 0x264f,
  154. smix_mixer_gain_increase_17db = 0x2714,
  155. smix_mixer_gain_increase_18db = 0x27f1,
  156. smix_mixer_gain_increase_19db = 0x28e9,
  157. smix_mixer_gain_increase_20db = 0x2a00
  158. } smix_mixer_gain_t;
  159. typedef enum {
  160. smix_mixer_no_rate_convert,
  161. smix_mixer_upper_2x_sample,
  162. smix_mixer_upper_3x_sample,
  163. smix_mixer_upper_4x_sample,
  164. smix_mixer_upper_6x_sample,
  165. smix_mixer_upper_8x_sample,
  166. smix_mixer_upper_12x_sample,
  167. smix_mixer_lower_2x_sample,
  168. } smix_mixer_rate_convert_t;
  169. typedef struct {
  170. bool underflow_int_en;
  171. uint8_t fifo_thr;
  172. bool calsat_int_en;
  173. bool da_int_en;
  174. bool auto_deactivate_en;
  175. bool fadeout_done_int_en;
  176. bool deactivate_en;
  177. bool active_en;
  178. bool fadeout_now_en;
  179. bool fadeout_auto_en;
  180. bool fadein_en;
  181. bool channel_en;
  182. bool mixer_en;
  183. uint16_t gain;
  184. uint32_t length;
  185. uint32_t fadein_delta;
  186. uint32_t fadeout_delta;
  187. uint8_t src_ch_mask;
  188. } smix_mixer_dst_config_t;
  189. typedef struct {
  190. uint8_t fifo_thr;
  191. bool calsat_int_en;
  192. bool dn_int_en;
  193. bool auto_deactivate_en;
  194. bool fadeout_int_en;
  195. uint8_t convert_rate;
  196. uint16_t gain;
  197. uint32_t fadein_delta;
  198. uint32_t fadeout_delta;
  199. uint32_t length;
  200. } smix_mixer_source_config_t;
  201. #ifdef __cplusplus
  202. extern "C" {
  203. #endif
  204. /**
  205. * @brief smix dma check transfer complete status
  206. *
  207. * @param [in] ptr SMIX base address
  208. * @param [in] ch_index dma channel
  209. * @retval true for transfer complete
  210. */
  211. static inline bool smix_dma_check_transfer_complete(SMIX_Type *ptr, uint8_t ch_index)
  212. {
  213. if ((SMIX_DMAC_TC_ST_CH_GET(ptr->DMAC_TC_ST) & (1U << ch_index)) != 0) {
  214. ptr->DMAC_TC_ST = (1U << ch_index); /* W1C clear status*/
  215. return true;
  216. }
  217. return false;
  218. }
  219. /**
  220. * @brief smix dma check transfer abort status
  221. *
  222. * @param [in] ptr SMIX base address
  223. * @param [in] ch_index dma channel
  224. * @retval true for transfer abort
  225. */
  226. static inline bool smix_dma_check_transfer_abort(SMIX_Type *ptr, uint8_t ch_index)
  227. {
  228. if ((SMIX_DMAC_ABRT_ST_CH_GET(ptr->DMAC_ABRT_ST) & (1U << ch_index)) != 0) {
  229. ptr->DMAC_ABRT_ST = (1U << ch_index); /* W1C clear status*/
  230. return true;
  231. }
  232. return false;
  233. }
  234. /**
  235. * @brief smix dma check transfer error status
  236. *
  237. * @param [in] ptr SMIX base address
  238. * @param [in] ch_index dma channel
  239. * @retval true for transfer error
  240. */
  241. static inline bool smix_dma_check_transfer_error(SMIX_Type *ptr, uint8_t ch_index)
  242. {
  243. if ((SMIX_DMAC_ERR_ST_CH_GET(ptr->DMAC_ERR_ST) & (1U << ch_index)) != 0) {
  244. ptr->DMAC_ERR_ST = (1U << ch_index); /* W1C clear status*/
  245. return true;
  246. }
  247. return false;
  248. }
  249. /**
  250. * @brief smix mixer enable source channel for dst
  251. *
  252. * @param [in] ptr SMIX base address
  253. * @param [in] dst_ch dst channel
  254. * @param [in] source_ch_mask source channel mask
  255. */
  256. static inline void smix_mixer_dst_enable_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  257. {
  258. ptr->DST_CH[dst_ch].SOURCE_EN |= source_ch_mask;
  259. }
  260. /**
  261. * @brief smix mixer disable source channel for dst
  262. *
  263. * @param [in] ptr SMIX base address
  264. * @param [in] dst_ch dst channel
  265. * @param [in] source_ch_mask source channel mask
  266. */
  267. static inline void smix_mixer_dst_disable_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  268. {
  269. ptr->DST_CH[dst_ch].SOURCE_EN &= ~source_ch_mask;
  270. }
  271. /**
  272. * @brief smix mixer active source channel for dst
  273. *
  274. * @param [in] ptr SMIX base address
  275. * @param [in] dst_ch dst channel
  276. * @param [in] source_ch_mask source channel mask
  277. */
  278. static inline void smix_mixer_dst_active_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  279. {
  280. ptr->DST_CH[dst_ch].SOURCE_ACT |= source_ch_mask;
  281. }
  282. /**
  283. * @brief smix mixer deactive source channel for dst
  284. *
  285. * @param [in] ptr SMIX base address
  286. * @param [in] dst_ch dst channel
  287. * @param [in] source_ch_mask source channel mask
  288. */
  289. static inline void smix_mixer_dst_deactive_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  290. {
  291. ptr->DST_CH[dst_ch].SOURCE_DEACT |= source_ch_mask;
  292. }
  293. /**
  294. * @brief smix mixer fadein source channel for dst
  295. *
  296. * @param [in] ptr SMIX base address
  297. * @param [in] dst_ch dst channel
  298. * @param [in] source_ch_mask source channel mask
  299. */
  300. static inline void smix_mixer_dst_fadein_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  301. {
  302. ptr->DST_CH[dst_ch].SOURCE_FADEIN_CTRL |= source_ch_mask;
  303. }
  304. /**
  305. * @brief smix mixer fadeout source channel for dst
  306. *
  307. * @param [in] ptr SMIX base address
  308. * @param [in] dst_ch dst channel
  309. * @param [in] source_ch_mask source channel mask
  310. */
  311. static inline void smix_mixer_dst_fadeout_source_channel(SMIX_Type *ptr, uint8_t dst_ch, uint32_t source_ch_mask)
  312. {
  313. ptr->DST_CH[dst_ch].SOURCE_MFADEOUT_CTRL |= source_ch_mask;
  314. }
  315. /**
  316. * @brief smix mixer enable dst channel
  317. *
  318. * @param [in] ptr SMIX base address
  319. *
  320. * @note two dst channel share same enable bit in DST_CH[0].CTRL.MIXER_EN, DST_CH[1].CTRL.MIXER_EN should not be set
  321. */
  322. static inline void smix_mixer_dst_enable(SMIX_Type *ptr)
  323. {
  324. ptr->DST_CH[0].CTRL |= SMIX_DST_CH_CTRL_DST_EN_MASK;
  325. ptr->DST_CH[1].CTRL &= ~SMIX_DST_CH_CTRL_DST_EN_MASK;
  326. }
  327. /**
  328. * @brief smix mixer disable dst channel
  329. *
  330. * @param [in] ptr SMIX base address
  331. *
  332. * @note two dst channel share same enable bit in DST_CH[0].CTRL.MIXER_EN, DST_CH[1].CTRL.MIXER_EN should not be set
  333. */
  334. static inline void smix_mixer_dst_disable(SMIX_Type *ptr)
  335. {
  336. ptr->DST_CH[0].CTRL &= ~SMIX_DST_CH_CTRL_DST_EN_MASK;
  337. }
  338. /**
  339. * @brief smix mixer get calculate saturation register value
  340. *
  341. * @param [in] ptr SMIX base address
  342. * @retval calculate saturation register value
  343. */
  344. static inline uint32_t smix_mixer_get_calsat_status(SMIX_Type *ptr)
  345. {
  346. return ptr->CALSAT_ST;
  347. }
  348. /**
  349. * @brief smix mixer check dst channel calculate saturation error
  350. *
  351. * @param [in] ptr SMIX base address
  352. * @param [in] dst_ch dst channel
  353. * @retval true for calculate saturation error occurred
  354. */
  355. static inline bool smix_mixer_check_dst_cal_saturation_error(SMIX_Type *ptr, uint8_t dst_ch)
  356. {
  357. return ((SMIX_CALSAT_ST_DST_GET(ptr->CALSAT_ST) & (1U << dst_ch)) != 0) ? true : false;
  358. }
  359. /**
  360. * @brief smix mixer check source channel calculate saturation error
  361. *
  362. * @param [in] ptr SMIX base address
  363. * @param [in] source_ch source channel
  364. * @retval true for calculate saturation error occurred
  365. */
  366. static inline bool smix_mixer_check_source_cal_saturation_error(SMIX_Type *ptr, uint8_t source_ch)
  367. {
  368. return ((SMIX_CALSAT_ST_SRC_GET(ptr->CALSAT_ST) & (1U << source_ch)) != 0) ? true : false;
  369. }
  370. /**
  371. * @brief smix mixer check dst channel data ubderflew
  372. *
  373. * @param [in] ptr SMIX base address
  374. * @param [in] dst_ch dst channel
  375. * @retval true for data underflew
  376. */
  377. static inline bool smix_mixer_check_dst_data_underflew(SMIX_Type *ptr, uint8_t dst_ch)
  378. {
  379. return ((SMIX_DATA_ST_DST_UNDL_GET(ptr->DATA_ST) & (1U << dst_ch)) != 0) ? true : false;
  380. }
  381. /**
  382. * @brief smix mixer check dst channel data available
  383. *
  384. * @param [in] ptr SMIX base address
  385. * @param [in] dst_ch dst channel
  386. * @retval true for data available
  387. */
  388. static inline bool smix_mixer_check_dst_data_available(SMIX_Type *ptr, uint8_t dst_ch)
  389. {
  390. return ((SMIX_DATA_ST_DST_DA_GET(ptr->DATA_ST) & (1U << dst_ch)) != 0) ? true : false;
  391. }
  392. /**
  393. * @brief smix mixer check source channel data available
  394. *
  395. * @param [in] ptr SMIX base address
  396. * @param [in] source_ch source channel
  397. * @retval true for source channel need new data
  398. */
  399. static inline bool smix_mixer_check_source_data_needed(SMIX_Type *ptr, uint8_t source_ch)
  400. {
  401. return ((SMIX_DATA_ST_SRC_DN_GET(ptr->DATA_ST) & (1U << source_ch)) != 0) ? true : false;
  402. }
  403. /**
  404. * @brief smix mixer config dst channel fadein delta
  405. *
  406. * @param [in] ptr SMIX base address
  407. * @param [in] ch dst channel
  408. * @param [in] target_sample_rate target sample rate
  409. * @param [in] ms fadein consumed time in ms
  410. * @retval status_success if no error occurs
  411. */
  412. hpm_stat_t smix_mixer_config_dst_fadein_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
  413. /**
  414. * @brief smix mixer config dst channel fadeout delta
  415. *
  416. * @param [in] ptr SMIX base address
  417. * @param [in] ch dst channel
  418. * @param [in] target_sample_rate target sample rate
  419. * @param [in] ms fadeout consumed time in ms
  420. * @retval status_success if no error occurs
  421. */
  422. hpm_stat_t smix_mixer_config_dst_fadeout_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
  423. /**
  424. * @brief smix mixer config source channel fadein delta
  425. *
  426. * @param [in] ptr SMIX base address
  427. * @param [in] ch source channel
  428. * @param [in] target_sample_rate target sample rate
  429. * @param [in] ms fadein consumed time in ms
  430. * @retval status_success if no error occurs
  431. */
  432. hpm_stat_t smix_mixer_config_source_fadein_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
  433. /**
  434. * @brief smix mixer config source channel fadeout delta
  435. *
  436. * @param [in] ptr SMIX base address
  437. * @param [in] ch source channel
  438. * @param [in] target_sample_rate target sample rate
  439. * @param [in] ms fadeout consumed time in ms
  440. * @retval status_success if no error occurs
  441. */
  442. hpm_stat_t smix_mixer_config_source_fadeout_delta(SMIX_Type *ptr, uint8_t ch, uint32_t target_sample_rate, uint32_t ms);
  443. /**
  444. * @brief smix get dma channel default config
  445. *
  446. * @param [in] ptr SMIX base address
  447. * @param [in] config smix_dma_ch_config_t
  448. */
  449. void smix_get_dma_default_ch_config(SMIX_Type *ptr, smix_dma_ch_config_t *config);
  450. /**
  451. * @brief smix get dst channel default config
  452. *
  453. * @param [in] ptr SMIX base address
  454. * @param [in] config smix_mixer_dst_config_t
  455. */
  456. void smix_get_mixer_dst_ch_default_config(SMIX_Type *ptr, smix_mixer_dst_config_t *config);
  457. /**
  458. * @brief smix get source channel default config
  459. *
  460. * @param [in] ptr SMIX base address
  461. * @param [in] config smix_mixer_source_config_t
  462. */
  463. void smix_get_mixer_source_ch_default_config(SMIX_Type *ptr, smix_mixer_source_config_t *config);
  464. /**
  465. * @brief smix config dma channel
  466. *
  467. * @param [in] ptr SMIX base address
  468. * @param [in] ch dma channel
  469. * @param [in] config smix_dma_ch_config_t
  470. * @param [in] start true for start dma
  471. * @retval status_success if no error occurs
  472. */
  473. hpm_stat_t smix_config_dma_channel(SMIX_Type *ptr, uint8_t ch, smix_dma_ch_config_t *config, bool start);
  474. /**
  475. * @brief smix mixer config source channel
  476. *
  477. * @param [in] ptr SMIX base address
  478. * @param [in] ch source channel
  479. * @param [in] src smix_mixer_source_config_t
  480. * @retval status_success if no error occurs
  481. */
  482. hpm_stat_t smix_mixer_config_source_ch(SMIX_Type *ptr, uint8_t ch, smix_mixer_source_config_t *src);
  483. /**
  484. * @brief smix mixer config dst channel
  485. *
  486. * @param [in] ptr SMIX base address
  487. * @param [in] ch dst channel
  488. * @param [in] dst smix_mixer_dst_config_t
  489. * @retval status_success if no error occurs
  490. */
  491. hpm_stat_t smix_mixer_config_dst_ch(SMIX_Type *ptr, uint8_t ch, smix_mixer_dst_config_t *dst);
  492. /**
  493. * @brief smix mixer config source channel gain
  494. *
  495. * @param [in] ptr SMIX base address
  496. * @param [in] ch_index source channel
  497. * @param [in] gain smix_mixer_gain_t
  498. */
  499. static inline void smix_set_source_gain(SMIX_Type *ptr, uint8_t ch_index, smix_mixer_gain_t gain)
  500. {
  501. ptr->SOURCE_CH[ch_index].GAIN = SMIX_SOURCE_CH_GAIN_VAL_SET(gain);
  502. }
  503. /**
  504. * @brief smix mixer config dst channel gain
  505. *
  506. * @param [in] ptr SMIX base address
  507. * @param [in] ch_index dst channel
  508. * @param [in] gain smix_mixer_gain_t
  509. */
  510. static inline void smix_set_dst_gain(SMIX_Type *ptr, uint8_t ch_index, smix_mixer_gain_t gain)
  511. {
  512. ptr->DST_CH[ch_index].GAIN = SMIX_DST_CH_GAIN_VAL_SET(gain);
  513. }
  514. #ifdef __cplusplus
  515. }
  516. #endif
  517. /**
  518. * @}
  519. */
  520. #endif /* HPM_SMIX_DRV_H */