hpm_adc.h 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626
  1. /*
  2. * Copyright (c) 2022 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #ifndef HPM_ADC_H
  8. #define HPM_ADC_H
  9. #include "hpm_common.h"
  10. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  11. #include "hpm_adc12_drv.h"
  12. #endif
  13. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  14. #include "hpm_adc16_drv.h"
  15. #endif
  16. #include "hpm_soc_feature.h"
  17. /**
  18. * @brief ADC HAL driver APIs
  19. * @defgroup hpm_adc_interface HPM ADC driver APIs
  20. * @ingroup hpm_adc_interfaces
  21. * @{
  22. */
  23. /**
  24. * @brief An ADC peripheral base address.
  25. *
  26. */
  27. typedef union {
  28. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  29. ADC12_Type *adc12;
  30. #endif
  31. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  32. ADC16_Type *adc16;
  33. #endif
  34. } adc_base;
  35. /**
  36. * @brief use adc12 or adc16.
  37. *
  38. */
  39. #define ADCX_MODULE_ADC12 1
  40. #define ADCX_MODULE_ADC16 2
  41. typedef enum {
  42. adc_module_adc12 = ADCX_MODULE_ADC12,
  43. adc_module_adc16 = ADCX_MODULE_ADC16
  44. } adc_module;
  45. /**
  46. * @brief ADC common configuration struct.
  47. *
  48. */
  49. typedef struct {
  50. adc_module module;
  51. adc_base adc_base;
  52. struct {
  53. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  54. adc12_config_t adc12;
  55. #endif
  56. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  57. adc16_config_t adc16;
  58. #endif
  59. } config;
  60. } adc_config_t;
  61. /**
  62. * @brief ADC channel configuration struct.
  63. *
  64. */
  65. typedef struct {
  66. adc_module module;
  67. adc_base adc_base;
  68. struct {
  69. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  70. adc12_channel_config_t adc12_ch;
  71. #endif
  72. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  73. adc16_channel_config_t adc16_ch;
  74. #endif
  75. } config;
  76. } adc_channel_config_t;
  77. /**
  78. * @brief ADC DMA configuration struct.
  79. *
  80. */
  81. typedef struct {
  82. adc_module module;
  83. adc_base adc_base;
  84. struct {
  85. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  86. adc12_dma_config_t adc12;
  87. #endif
  88. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  89. adc16_dma_config_t adc16;
  90. #endif
  91. } config;
  92. } adc_dma_config_t;
  93. /**
  94. * @brief ADC configuration struct for period mode.
  95. *
  96. */
  97. typedef struct {
  98. adc_module module;
  99. adc_base adc_base;
  100. struct {
  101. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  102. adc12_prd_config_t adc12;
  103. #endif
  104. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  105. adc16_prd_config_t adc16;
  106. #endif
  107. } config;
  108. } adc_prd_config_t;
  109. /**
  110. * @brief ADC configuration struct for sequence mode.
  111. *
  112. */
  113. typedef struct {
  114. adc_module module;
  115. adc_base adc_base;
  116. struct {
  117. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  118. adc12_seq_config_t adc12;
  119. #endif
  120. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  121. adc16_seq_config_t adc16;
  122. #endif
  123. } config;
  124. } adc_seq_config_t;
  125. /**
  126. * @brief ADC trigger configuration struct for preempt mode.
  127. *
  128. */
  129. typedef struct {
  130. adc_module module;
  131. adc_base adc_base;
  132. struct {
  133. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  134. adc12_pmt_config_t adc12;
  135. #endif
  136. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  137. adc16_pmt_config_t adc16;
  138. #endif
  139. } config;
  140. } adc_pmt_config_t;
  141. typedef struct {
  142. adc_module module;
  143. adc_base adc_base;
  144. } adc_type;
  145. #ifdef __cplusplus
  146. extern "C" {
  147. #endif
  148. /**
  149. * @brief Get a default configuration for an ADC instance.
  150. *
  151. * @param[out] config A pointer to the configuration struct of "adc_config_t".
  152. *
  153. */
  154. static inline void hpm_adc_init_default_config(adc_config_t *config)
  155. {
  156. if (config->module == adc_module_adc12) {
  157. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  158. adc12_get_default_config(&config->config.adc12);
  159. #endif
  160. } else if (config->module == adc_module_adc16) {
  161. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  162. adc16_get_default_config(&config->config.adc16);
  163. #endif
  164. }
  165. }
  166. /**
  167. * @brief Get a default configuration for an ADC channel instance.
  168. *
  169. * @param[out] config A pointer to the configuration struct of "adc_channel_config_t".
  170. *
  171. */
  172. static inline void hpm_adc_init_channel_default_config(adc_channel_config_t *config)
  173. {
  174. if (config->module == adc_module_adc12) {
  175. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  176. adc12_get_channel_default_config(&config->config.adc12_ch);
  177. #endif
  178. } else if (config->module == adc_module_adc16) {
  179. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  180. adc16_get_channel_default_config(&config->config.adc16_ch);
  181. #endif
  182. }
  183. }
  184. /**
  185. * @brief Initialize an ADC instance.
  186. *
  187. * @param[in] config A pointer to the configuration struct of "adc_config_t".
  188. * @retval status_success Initialize an ADC instance successfully.
  189. * @retval status_invalid_argument Initialize an ADC instance unsuccessfully because of passing one or more invalid arguments.
  190. */
  191. static inline hpm_stat_t hpm_adc_init(adc_config_t *config)
  192. {
  193. if (config->module == adc_module_adc12) {
  194. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  195. return adc12_init(config->adc_base.adc12, &config->config.adc12);
  196. #else
  197. return status_invalid_argument;
  198. #endif
  199. } else if (config->module == adc_module_adc16) {
  200. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  201. return adc16_init(config->adc_base.adc16, &config->config.adc16);
  202. #else
  203. return status_invalid_argument;
  204. #endif
  205. } else {
  206. return status_invalid_argument;
  207. }
  208. }
  209. /**
  210. * @brief Initialize an ADC channel.
  211. *
  212. * @param[in] config A pointer to the configuration struct of "adc_config_t".
  213. * @retval status_success Initialize an ADC instance successfully.
  214. * @retval status_invalid_argument Initialize an ADC instance unsuccessfully because of passing one or more invalid arguments.
  215. */
  216. static inline hpm_stat_t hpm_adc_channel_init(adc_channel_config_t *config)
  217. {
  218. if (config->module == adc_module_adc12) {
  219. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  220. return adc12_init_channel(config->adc_base.adc12, &config->config.adc12_ch);
  221. #else
  222. return status_invalid_argument;
  223. #endif
  224. } else if (config->module == adc_module_adc16) {
  225. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  226. return adc16_init_channel(config->adc_base.adc16, &config->config.adc16_ch);
  227. #else
  228. return status_invalid_argument;
  229. #endif
  230. } else {
  231. return status_invalid_argument;
  232. }
  233. }
  234. /**
  235. * @brief Configure the periodic mode for an ADC instance.
  236. *
  237. * @param[in] config A pointer to the configuration struct of "adc_prd_config_t".
  238. * @retval status_success Configure the periodic mode for an ADC instance successfully.
  239. * @retval status_invalid_argument Configure the periodic mode for an ADC instance unsuccessfully because of passing one or more invalid arguments.
  240. *
  241. */
  242. static inline hpm_stat_t hpm_adc_set_period_config(adc_prd_config_t *config)
  243. {
  244. if (config->module == adc_module_adc12) {
  245. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  246. return adc12_set_prd_config(config->adc_base.adc12, &config->config.adc12);
  247. #else
  248. return status_invalid_argument;
  249. #endif
  250. } else if (config->module == adc_module_adc16) {
  251. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  252. return adc16_set_prd_config(config->adc_base.adc16, &config->config.adc16);
  253. #else
  254. return status_invalid_argument;
  255. #endif
  256. } else {
  257. return status_invalid_argument;
  258. }
  259. }
  260. /**
  261. * @brief Configure the sequence mode for an ADC instance.
  262. *
  263. * @param[in] config A pointer to configuration struct of "adc_seq_config_t".
  264. * @retval status_success Configure the sequence mode for an ADC instance successfully.
  265. * @retval status_invalid_argument Configure the sequence mode for an ADC instance unsuccessfully because of passing one or more invalid arguments.
  266. */
  267. static inline hpm_stat_t hpm_adc_set_sequence_config(adc_seq_config_t *config)
  268. {
  269. if (config->module == adc_module_adc12) {
  270. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  271. return adc12_set_seq_config(config->adc_base.adc12, &config->config.adc12);
  272. #else
  273. return status_invalid_argument;
  274. #endif
  275. } else if (config->module == adc_module_adc16) {
  276. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  277. return adc16_set_seq_config(config->adc_base.adc16, &config->config.adc16);
  278. #else
  279. return status_invalid_argument;
  280. #endif
  281. } else {
  282. return status_invalid_argument;
  283. }
  284. }
  285. /**
  286. * @brief Configure the preemption mode for an ADC instance.
  287. *
  288. * @param[in] config a pointer to configuration struct of "adc_pmt_config_t".
  289. * @retval status_success Configure the preemption mode for an ADC instance successfully.
  290. * @retval status_invalid_argument Configure the preemption mode for an ADC instance unsuccessfully because of passing one or more invalid arguments.
  291. */
  292. static inline hpm_stat_t hpm_adc_set_preempt_config(adc_pmt_config_t *config)
  293. {
  294. if (config->module == adc_module_adc12) {
  295. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  296. return adc12_set_pmt_config(config->adc_base.adc12, &config->config.adc12);
  297. #else
  298. return status_invalid_argument;
  299. #endif
  300. } else if (config->module == adc_module_adc16) {
  301. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  302. return adc16_set_pmt_config(config->adc_base.adc16, &config->config.adc16);
  303. #else
  304. return status_invalid_argument;
  305. #endif
  306. } else {
  307. return status_invalid_argument;
  308. }
  309. }
  310. /**
  311. * @brief Configure the stop position offset in the specified memory for DMA write operation for sequence mode.
  312. *
  313. * @param[in] ptr An ADC peripheral base address.
  314. * @param[in] stop_pos The stop position offset.
  315. */
  316. static inline void hpm_adc_set_seq_stop_pos(adc_type *ptr, uint16_t stop_pos)
  317. {
  318. if (ptr->module == adc_module_adc12) {
  319. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  320. adc12_set_seq_stop_pos(ptr->adc_base.adc12, stop_pos);
  321. #endif
  322. } else if (ptr->module == adc_module_adc16) {
  323. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  324. adc16_set_seq_stop_pos(ptr->adc_base.adc16, stop_pos);
  325. #endif
  326. }
  327. }
  328. /**
  329. * @brief Configure the start address of DMA write operation for preemption mode.
  330. *
  331. * @param[in] ptr An ADC peripheral base address.
  332. * @param[in] addr The start address of DMA write operation.
  333. */
  334. static inline void hpm_adc_init_pmt_dma(adc_type *ptr, uint32_t addr)
  335. {
  336. if (ptr->module == adc_module_adc12) {
  337. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  338. adc12_init_pmt_dma(ptr->adc_base.adc12, addr);
  339. #endif
  340. } else if (ptr->module == adc_module_adc16) {
  341. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  342. adc16_init_pmt_dma(ptr->adc_base.adc16, addr);
  343. #endif
  344. }
  345. }
  346. /**
  347. * @brief Configure the start address of DMA write operation for preemption mode.
  348. *
  349. * @param[in] config A pointer to configuration struct of "adc_dma_config_t".
  350. */
  351. static inline void hpm_adc_init_seq_dma(adc_dma_config_t *config)
  352. {
  353. if (config->module == adc_module_adc12) {
  354. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  355. adc12_init_seq_dma(config->adc_base.adc12, &config->config.adc12);
  356. #endif
  357. } else if (config->module == adc_module_adc16) {
  358. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  359. adc16_init_seq_dma(config->adc_base.adc16, &config->config.adc16);
  360. #endif
  361. }
  362. }
  363. /**
  364. * @brief Reset value of the WAIT_DIS bit. ADC blocks access to the associated peripheral bus
  365. * until the ADC completes the conversion.
  366. *
  367. * @param[in] config A pointer to configuration struct of "adc_dma_config_t".
  368. */
  369. static inline void hpm_adc_disable_busywait(adc_dma_config_t *config)
  370. {
  371. if (config->module == adc_module_adc12) {
  372. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  373. adc12_disable_busywait(config->adc_base.adc12);
  374. #endif
  375. } else if (config->module == adc_module_adc16) {
  376. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  377. adc16_disable_busywait(config->adc_base.adc16);
  378. #endif
  379. }
  380. }
  381. /**
  382. * @brief Set value of the WAIT_DIS bit. The ADC does not block access to the associated peripheral bus
  383. * until the ADC has completed its conversion.
  384. *
  385. * @param[in] config A pointer to configuration struct of "adc_dma_config_t".
  386. */
  387. static inline void hpm_adc_enable_busywait(adc_dma_config_t *config)
  388. {
  389. if (config->module == adc_module_adc12) {
  390. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  391. adc12_enable_busywait(config->adc_base.adc12);
  392. #endif
  393. } else if (config->module == adc_module_adc16) {
  394. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  395. adc16_enable_busywait(config->adc_base.adc16);
  396. #endif
  397. }
  398. }
  399. /**
  400. * @brief Get ADC status flags.
  401. *
  402. * This function gets all ADC status flags.
  403. * @param[in] ptr An ADC peripheral base address.
  404. * @retval Status The ADC interrupt status flags.
  405. */
  406. static inline uint32_t hpm_adc_get_status_flags(adc_type *ptr)
  407. {
  408. if (ptr->module == adc_module_adc12) {
  409. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  410. return adc12_get_status_flags(ptr->adc_base.adc12);
  411. #else
  412. return status_invalid_argument;
  413. #endif
  414. } else if (ptr->module == adc_module_adc16) {
  415. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  416. return adc16_get_status_flags(ptr->adc_base.adc16);
  417. #else
  418. return status_invalid_argument;
  419. #endif
  420. } else {
  421. return status_invalid_argument;
  422. }
  423. }
  424. /**
  425. * @brief Get status flag of a conversion.
  426. *
  427. * This status flag is only used when wait_dis is set to disable.
  428. *
  429. * @param[in] ptr An ADC peripheral base address.
  430. * @param[in] ch An ADC peripheral channel.
  431. * @retval Status It means the current conversion is valid.
  432. */
  433. static inline bool hpm_adc_get_conv_valid_status(adc_type *ptr, uint8_t ch)
  434. {
  435. if (ptr->module == adc_module_adc12) {
  436. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  437. return adc12_get_conv_valid_status(ptr->adc_base.adc12, ch);
  438. #else
  439. return status_invalid_argument;
  440. #endif
  441. } else if (ptr->module == adc_module_adc16) {
  442. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  443. return adc16_get_conv_valid_status(ptr->adc_base.adc16, ch);
  444. #else
  445. return status_invalid_argument;
  446. #endif
  447. } else {
  448. return status_invalid_argument;
  449. }
  450. }
  451. /**
  452. * @brief Clear status flags.
  453. *
  454. * Only the specified flags can be cleared by writing INT_STS register.
  455. *
  456. * @param[in] ptr An ADC peripheral base address.
  457. * @param[in] mask Mask value for flags to be cleared. Refer to "adc12_irq_event_t". Refer to "adc16_irq_event_t".
  458. */
  459. static inline void hpm_adc_clear_status_flags(adc_type *ptr, uint32_t mask)
  460. {
  461. if (ptr->module == adc_module_adc12) {
  462. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  463. adc12_clear_status_flags(ptr->adc_base.adc12, mask);
  464. #endif
  465. } else if (ptr->module == adc_module_adc16) {
  466. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  467. adc16_clear_status_flags(ptr->adc_base.adc16, mask);
  468. #endif
  469. }
  470. }
  471. /**
  472. * @brief Enable interrupts.
  473. *
  474. * @param[in] ptr An ADC peripheral base address.
  475. * @param[in] mask Mask value for interrupt events. Refer to "adc12_irq_event_t".Refer to "adc16_irq_event_t".
  476. */
  477. static inline void hpm_adc_enable_interrupts(adc_type *ptr, uint32_t mask)
  478. {
  479. if (ptr->module == adc_module_adc12) {
  480. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  481. adc12_enable_interrupts(ptr->adc_base.adc12, mask);
  482. #endif
  483. } else if (ptr->module == adc_module_adc16) {
  484. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  485. adc16_enable_interrupts(ptr->adc_base.adc16, mask);
  486. #endif
  487. }
  488. }
  489. /**
  490. * @brief Disable interrupts.
  491. *
  492. * @param[in] ptr An ADC peripheral base address.
  493. * @param[in] mask Mask value for interrupt events. Refer to "adc12_irq_event_t".Refer to "adc16_irq_event_t".
  494. */
  495. static inline void hpm_adc_disable_interrupts(adc_type *ptr, uint32_t mask)
  496. {
  497. if (ptr->module == adc_module_adc12) {
  498. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  499. adc12_disable_interrupts(ptr->adc_base.adc12, mask);
  500. #endif
  501. } else if (ptr->module == adc_module_adc16) {
  502. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  503. adc16_disable_interrupts(ptr->adc_base.adc16, mask);
  504. #endif
  505. }
  506. }
  507. /**
  508. * @brief Get the result in oneshot mode.
  509. *
  510. * @param[in] ptr An ADC peripheral base address.
  511. * @param[in] ch An ADC peripheral channel.
  512. * @param[out] result The result of an ADC12 conversion.
  513. *
  514. * @retval status_success Get the result of an ADC12 conversion in oneshot mode successfully.
  515. * @retval status_invalid_argument Get the result of an ADC12 conversion in oneshot mode unsuccessfully because of passing invalid arguments.
  516. */
  517. static inline hpm_stat_t hpm_adc_get_oneshot_result(adc_type *ptr, uint8_t ch, uint16_t *result)
  518. {
  519. if (ptr->module == adc_module_adc12) {
  520. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  521. return adc12_get_oneshot_result(ptr->adc_base.adc12, ch, result);
  522. #else
  523. return status_invalid_argument;
  524. #endif
  525. } else if (ptr->module == adc_module_adc16) {
  526. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  527. return adc16_get_oneshot_result(ptr->adc_base.adc16, ch, result);
  528. #else
  529. return status_invalid_argument;
  530. #endif
  531. } else {
  532. return status_invalid_argument;
  533. }
  534. }
  535. /**
  536. * @brief Get the result in periodic mode.
  537. *
  538. * @param[in] ptr An ADC12 peripheral base address.
  539. * @param[in] ch An ADC12 peripheral channel.
  540. * @param[out] result The result of an ADC12 conversion.
  541. *
  542. * @retval status_success Get the result of an ADC12 conversion in periodic mode successfully.
  543. * @retval status_invalid_argument Get the result of an ADC12 conversion in periodic mode unsuccessfully because of passing invalid arguments.
  544. */
  545. static inline hpm_stat_t hpm_adc_get_prd_result(adc_type *ptr, uint8_t ch, uint16_t *result)
  546. {
  547. if (ptr->module == adc_module_adc12) {
  548. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  549. return adc12_get_prd_result(ptr->adc_base.adc12, ch, result);
  550. #else
  551. return status_invalid_argument;
  552. #endif
  553. } else if (ptr->module == adc_module_adc16) {
  554. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  555. return adc16_get_prd_result(ptr->adc_base.adc16, ch, result);
  556. #else
  557. return status_invalid_argument;
  558. #endif
  559. } else {
  560. return status_invalid_argument;
  561. }
  562. }
  563. /**
  564. * @brief Do a software trigger for sequence mode.
  565. *
  566. * @param[in] ptr An adc peripheral base address.
  567. *
  568. */
  569. static inline hpm_stat_t hpm_adc_trigger_seq_by_sw(adc_type *ptr)
  570. {
  571. if (ptr->module == adc_module_adc12) {
  572. #ifdef HPMSOC_HAS_HPMSDK_ADC12
  573. return adc12_trigger_seq_by_sw(ptr->adc_base.adc12);
  574. #endif
  575. } else if (ptr->module == adc_module_adc16) {
  576. #ifdef HPMSOC_HAS_HPMSDK_ADC16
  577. return adc16_trigger_seq_by_sw(ptr->adc_base.adc16);
  578. #endif
  579. } else {
  580. return status_invalid_argument;
  581. }
  582. }
  583. #ifdef __cplusplus
  584. }
  585. #endif
  586. /** @} */
  587. #endif