fsl_adc_etc.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464
  1. /*
  2. * Copyright (c) 2016, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2021 NXP
  4. * All rights reserved.
  5. *
  6. * SPDX-License-Identifier: BSD-3-Clause
  7. */
  8. #include "fsl_adc_etc.h"
  9. /* Component ID definition, used by tools. */
  10. #ifndef FSL_COMPONENT_ID
  11. #define FSL_COMPONENT_ID "platform.drivers.adc_etc"
  12. #endif
  13. /*******************************************************************************
  14. * Prototypes
  15. ******************************************************************************/
  16. #if defined(ADC_ETC_CLOCKS)
  17. /*!
  18. * @brief Get instance number for ADC_ETC module.
  19. *
  20. * @param base ADC_ETC peripheral base address
  21. */
  22. static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base);
  23. /*******************************************************************************
  24. * Variables
  25. ******************************************************************************/
  26. /*! @brief Pointers to ADC_ETC bases for each instance. */
  27. static ADC_ETC_Type *const s_adcetcBases[] = ADC_ETC_BASE_PTRS;
  28. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  29. /*! @brief Pointers to ADC_ETC clocks for each instance. */
  30. static const clock_ip_name_t s_adcetcClocks[] = ADC_ETC_CLOCKS;
  31. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  32. /*******************************************************************************
  33. * Code
  34. ******************************************************************************/
  35. static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base)
  36. {
  37. uint32_t instance = 0U;
  38. uint32_t adcetcArrayCount = (sizeof(s_adcetcBases) / sizeof(s_adcetcBases[0]));
  39. /* Find the instance index from base address mappings. */
  40. for (instance = 0; instance < adcetcArrayCount; instance++)
  41. {
  42. if (s_adcetcBases[instance] == base)
  43. {
  44. break;
  45. }
  46. }
  47. assert(instance < adcetcArrayCount);
  48. return instance;
  49. }
  50. #endif /* ADC_ETC_CLOCKS */
  51. /*!
  52. * brief Initialize the ADC_ETC module.
  53. *
  54. * param base ADC_ETC peripheral base address.
  55. * param config Pointer to "adc_etc_config_t" structure.
  56. */
  57. void ADC_ETC_Init(ADC_ETC_Type *base, const adc_etc_config_t *config)
  58. {
  59. assert(NULL != config);
  60. uint32_t tmp32 = 0U;
  61. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  62. #if defined(ADC_ETC_CLOCKS)
  63. /* Open clock gate. */
  64. CLOCK_EnableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]);
  65. #endif /* ADC_ETC_CLOCKS */
  66. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  67. /* Disable software reset. */
  68. ADC_ETC_DoSoftwareReset(base, false);
  69. /* Set ADC_ETC_CTRL register. */
  70. tmp32 =
  71. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  72. ADC_ETC_CTRL_EXT0_TRIG_PRIORITY(config->TSC0triggerPriority) |
  73. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  74. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  75. ADC_ETC_CTRL_EXT1_TRIG_PRIORITY(config->TSC1triggerPriority) |
  76. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  77. ADC_ETC_CTRL_PRE_DIVIDER(config->clockPreDivider) | ADC_ETC_CTRL_TRIG_ENABLE(config->XBARtriggerMask)
  78. #if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL
  79. | ADC_ETC_CTRL_DMA_MODE_SEL(config->dmaMode)
  80. #endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/
  81. ;
  82. #if (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) || \
  83. (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG))
  84. if (config->enableTSCBypass)
  85. {
  86. tmp32 |= ADC_ETC_CTRL_TSC_BYPASS_MASK;
  87. }
  88. #endif
  89. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  90. if (config->enableTSC0Trigger)
  91. {
  92. tmp32 |= ADC_ETC_CTRL_EXT0_TRIG_ENABLE_MASK;
  93. }
  94. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  95. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  96. if (config->enableTSC1Trigger)
  97. {
  98. tmp32 |= ADC_ETC_CTRL_EXT1_TRIG_ENABLE_MASK;
  99. }
  100. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  101. base->CTRL = tmp32;
  102. }
  103. /*!
  104. * brief De-Initialize the ADC_ETC module.
  105. *
  106. * param base ADC_ETC peripheral base address.
  107. */
  108. void ADC_ETC_Deinit(ADC_ETC_Type *base)
  109. {
  110. /* Do software reset to clear all logical. */
  111. ADC_ETC_DoSoftwareReset(base, true);
  112. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  113. #if defined(ADC_ETC_CLOCKS)
  114. /* Close clock gate. */
  115. CLOCK_DisableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]);
  116. #endif /* ADC_ETC_CLOCKS */
  117. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  118. }
  119. /*!
  120. * brief Gets an available pre-defined settings for the ADC_ETC's configuration.
  121. * This function initializes the ADC_ETC's configuration structure with available settings. The default values are:
  122. * code
  123. * config->enableTSCBypass = true;
  124. * config->enableTSC0Trigger = false;
  125. * config->enableTSC1Trigger = false;
  126. * config->TSC0triggerPriority = 0U;
  127. * config->TSC1triggerPriority = 0U;
  128. * config->clockPreDivider = 0U;
  129. * config->XBARtriggerMask = 0U;
  130. * endCode
  131. *
  132. * param config Pointer to "adc_etc_config_t" structure.
  133. */
  134. void ADC_ETC_GetDefaultConfig(adc_etc_config_t *config)
  135. {
  136. /* Initializes the configure structure to zero. */
  137. (void)memset(config, 0, sizeof(*config));
  138. #if (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)) || \
  139. (!(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG))
  140. config->enableTSCBypass = true;
  141. #endif
  142. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  143. config->enableTSC0Trigger = false;
  144. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  145. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  146. config->enableTSC1Trigger = false;
  147. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  148. #if defined(FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL) && FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL
  149. config->dmaMode = kADC_ETC_TrigDMAWithLatchedSignal;
  150. #endif /*FSL_FEATURE_ADC_ETC_HAS_CTRL_DMA_MODE_SEL*/
  151. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  152. config->TSC0triggerPriority = 0U;
  153. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  154. #if !(defined(FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG) && FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG)
  155. config->TSC1triggerPriority = 0U;
  156. #endif /* FSL_FEATURE_ADC_ETC_HAS_NO_TSC0_TRIG */
  157. config->clockPreDivider = 0U;
  158. config->XBARtriggerMask = 0U;
  159. }
  160. /*!
  161. * brief Set the external XBAR trigger configuration.
  162. *
  163. * param base ADC_ETC peripheral base address.
  164. * param triggerGroup Trigger group index.
  165. * param config Pointer to "adc_etc_trigger_config_t" structure.
  166. */
  167. void ADC_ETC_SetTriggerConfig(ADC_ETC_Type *base, uint32_t triggerGroup, const adc_etc_trigger_config_t *config)
  168. {
  169. assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT);
  170. assert(ADC_ETC_TRIGn_COUNTER_COUNT > triggerGroup);
  171. uint32_t tmp32 = 0U;
  172. /* Set ADC_ETC_TRGn_CTRL register. */
  173. tmp32 = ADC_ETC_TRIGn_CTRL_TRIG_CHAIN(config->triggerChainLength) |
  174. ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY(config->triggerPriority);
  175. if (config->enableSyncMode)
  176. {
  177. tmp32 |= ADC_ETC_TRIGn_CTRL_SYNC_MODE_MASK;
  178. }
  179. if (config->enableSWTriggerMode)
  180. {
  181. tmp32 |= ADC_ETC_TRIGn_CTRL_TRIG_MODE_MASK;
  182. }
  183. base->TRIG[triggerGroup].TRIGn_CTRL = tmp32;
  184. /* Set ADC_ETC_TRGn_COUNTER register. */
  185. tmp32 = ADC_ETC_TRIGn_COUNTER_INIT_DELAY(config->initialDelay) |
  186. ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL(config->sampleIntervalDelay);
  187. base->TRIG[triggerGroup].TRIGn_COUNTER = tmp32;
  188. }
  189. /*!
  190. * brief Set the external XBAR trigger chain configuration.
  191. * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means Trigger0 source's chain1 would be
  192. * configurated.
  193. *
  194. * param base ADC_ETC peripheral base address.
  195. * param triggerGroup Trigger group index. Available number is 0~7.
  196. * param chainGroup Trigger chain group index. Available number is 0~7.
  197. * param config Pointer to "adc_etc_trigger_chain_config_t" structure.
  198. */
  199. void ADC_ETC_SetTriggerChainConfig(ADC_ETC_Type *base,
  200. uint32_t triggerGroup,
  201. uint32_t chainGroup,
  202. const adc_etc_trigger_chain_config_t *config)
  203. {
  204. assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT);
  205. uint32_t tmp32 = 0U;
  206. uint32_t tmpReg = 0U;
  207. uint8_t mRemainder = (uint8_t)(chainGroup % 2U);
  208. /* Set ADC_ETC_TRIGn_CHAINm register. */
  209. tmp32 = ADC_ETC_TRIGn_CHAIN_1_0_HWTS0(config->ADCHCRegisterSelect) |
  210. ADC_ETC_TRIGn_CHAIN_1_0_CSEL0(config->ADCChannelSelect) |
  211. ADC_ETC_TRIGn_CHAIN_1_0_IE0(config->InterruptEnable);
  212. if (true == config->enableB2BMode)
  213. {
  214. tmp32 |= ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK;
  215. }
  216. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  217. if (true == config->enableIrq)
  218. {
  219. tmp32 |= ADC_ETC_TRIGn_CHAIN_1_0_IE0_EN_MASK;
  220. }
  221. #endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  222. switch (chainGroup / 2U)
  223. {
  224. case 0U: /* Configurate trigger chain0 and chain 1. */
  225. tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_1_0;
  226. if (mRemainder == 0U) /* Chain 0. */
  227. {
  228. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_MASK |
  229. ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE0_MASK);
  230. tmpReg |= tmp32;
  231. }
  232. else /* Chain 1. */
  233. {
  234. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_MASK |
  235. ADC_ETC_TRIGn_CHAIN_1_0_B2B1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE1_MASK);
  236. tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_SHIFT);
  237. }
  238. base->TRIG[triggerGroup].TRIGn_CHAIN_1_0 = tmpReg;
  239. break;
  240. case 1U: /* Configurate trigger chain2 and chain 3. */
  241. tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_3_2;
  242. if (mRemainder == 0U) /* Chain 2. */
  243. {
  244. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_MASK |
  245. ADC_ETC_TRIGn_CHAIN_3_2_B2B2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE2_MASK);
  246. tmpReg |= tmp32;
  247. }
  248. else /* Chain 3. */
  249. {
  250. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_MASK |
  251. ADC_ETC_TRIGn_CHAIN_3_2_B2B3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE3_MASK);
  252. tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_SHIFT);
  253. }
  254. base->TRIG[triggerGroup].TRIGn_CHAIN_3_2 = tmpReg;
  255. break;
  256. case 2U: /* Configurate trigger chain4 and chain 5. */
  257. tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_5_4;
  258. if (mRemainder == 0U) /* Chain 4. */
  259. {
  260. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_MASK |
  261. ADC_ETC_TRIGn_CHAIN_5_4_B2B4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE4_MASK);
  262. tmpReg |= tmp32;
  263. }
  264. else /* Chain 5. */
  265. {
  266. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_MASK |
  267. ADC_ETC_TRIGn_CHAIN_5_4_B2B5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE5_MASK);
  268. tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_SHIFT);
  269. }
  270. base->TRIG[triggerGroup].TRIGn_CHAIN_5_4 = tmpReg;
  271. break;
  272. case 3U: /* Configurate trigger chain6 and chain 7. */
  273. tmpReg = base->TRIG[triggerGroup].TRIGn_CHAIN_7_6;
  274. if (mRemainder == 0U) /* Chain 6. */
  275. {
  276. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_MASK |
  277. ADC_ETC_TRIGn_CHAIN_7_6_B2B6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE6_MASK);
  278. tmpReg |= tmp32;
  279. }
  280. else /* Chain 7. */
  281. {
  282. tmpReg &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_MASK |
  283. ADC_ETC_TRIGn_CHAIN_7_6_B2B7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE7_MASK);
  284. tmpReg |= (tmp32 << ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_SHIFT);
  285. }
  286. base->TRIG[triggerGroup].TRIGn_CHAIN_7_6 = tmpReg;
  287. break;
  288. default:
  289. assert(false);
  290. break;
  291. }
  292. }
  293. /*!
  294. * brief Gets the interrupt status flags of external XBAR and TSC triggers.
  295. *
  296. * param base ADC_ETC peripheral base address.
  297. * param sourceIndex trigger source index.
  298. *
  299. * return Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask".
  300. */
  301. uint32_t ADC_ETC_GetInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex)
  302. {
  303. uint32_t tmp32 = 0U;
  304. if (((base->DONE0_1_IRQ) & ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << (uint32_t)sourceIndex)) != 0U)
  305. {
  306. tmp32 |= (uint32_t)kADC_ETC_Done0StatusFlagMask; /* Customized DONE0 status flags mask, which is defined in
  307. fsl_adc_etc.h file. */
  308. }
  309. if (((base->DONE0_1_IRQ) & ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << (uint32_t)sourceIndex)) != 0U)
  310. {
  311. tmp32 |= (uint32_t)kADC_ETC_Done1StatusFlagMask; /* Customized DONE1 status flags mask, which is defined in
  312. fsl_adc_etc.h file. */
  313. }
  314. if (((base->DONE2_3_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE2_MASK << (uint32_t)sourceIndex)) != 0U)
  315. {
  316. tmp32 |= (uint32_t)kADC_ETC_Done2StatusFlagMask; /* Customized DONE2 status flags mask, which is defined in
  317. fsl_adc_etc.h file. */
  318. }
  319. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  320. if (((base->DONE2_3_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE3_MASK << (uint32_t)sourceIndex)) != 0U)
  321. {
  322. tmp32 |= (uint32_t)kADC_ETC_Done3StatusFlagMask; /* Customized DONE3 status flags mask, which is defined in
  323. fsl_adc_etc.h file. */
  324. }
  325. #endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  326. if (((base->DONE2_3_ERR_IRQ) & ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_ERR_MASK << (uint32_t)sourceIndex)) != 0U)
  327. {
  328. tmp32 |= (uint32_t)kADC_ETC_ErrorStatusFlagMask; /* Customized ERROR status flags mask, which is defined in
  329. fsl_adc_etc.h file. */
  330. }
  331. return tmp32;
  332. }
  333. /*!
  334. * brief Clears the ADC_ETC's interrupt status falgs.
  335. *
  336. * param base ADC_ETC peripheral base address.
  337. * param sourceIndex trigger source index.
  338. * param mask Status flags mask of trigger. Refer to "_adc_etc_status_flag_mask".
  339. */
  340. void ADC_ETC_ClearInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex, uint32_t mask)
  341. {
  342. if (0U != (mask & (uint32_t)kADC_ETC_Done0StatusFlagMask)) /* Write 1 to clear DONE0 status flags. */
  343. {
  344. base->DONE0_1_IRQ = ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << (uint32_t)sourceIndex);
  345. }
  346. if (0U != (mask & (uint32_t)kADC_ETC_Done1StatusFlagMask)) /* Write 1 to clear DONE1 status flags. */
  347. {
  348. base->DONE0_1_IRQ = ((uint32_t)ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << (uint32_t)sourceIndex);
  349. }
  350. if (0U != (mask & (uint32_t)kADC_ETC_Done2StatusFlagMask)) /* Write 1 to clear DONE2 status flags. */
  351. {
  352. base->DONE2_3_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE2_MASK << (uint32_t)sourceIndex);
  353. }
  354. #if defined(FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN) && FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN
  355. if (0U != (mask & (uint32_t)kADC_ETC_Done3StatusFlagMask)) /* Write 1 to clear DONE3 status flags. */
  356. {
  357. base->DONE2_3_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_DONE3_MASK << (uint32_t)sourceIndex);
  358. }
  359. #endif /* FSL_FEATURE_ADC_ETC_HAS_TRIGm_CHAIN_a_b_IEn_EN */
  360. if (0U != (mask & (uint32_t)kADC_ETC_ErrorStatusFlagMask)) /* Write 1 to clear ERROR status flags. */
  361. {
  362. base->DONE2_3_ERR_IRQ = ((uint32_t)ADC_ETC_DONE2_3_ERR_IRQ_TRIG0_ERR_MASK << (uint32_t)sourceIndex);
  363. }
  364. }
  365. /*!
  366. * brief Get ADC conversion result from external XBAR sources.
  367. * For example, if triggerGroup is set to 0U and chainGroup is set to 1U, which means the API would
  368. * return Trigger0 source's chain1 conversion result.
  369. *
  370. * param base ADC_ETC peripheral base address.
  371. * param triggerGroup Trigger group index. Available number is 0~7.
  372. * param chainGroup Trigger chain group index. Available number is 0~7.
  373. * return ADC conversion result value.
  374. */
  375. uint32_t ADC_ETC_GetADCConversionValue(ADC_ETC_Type *base, uint32_t triggerGroup, uint32_t chainGroup)
  376. {
  377. assert(triggerGroup < ADC_ETC_TRIGn_RESULT_1_0_COUNT);
  378. uint32_t mADCResult;
  379. uint8_t mRemainder = (uint8_t)(chainGroup % 2U);
  380. switch (chainGroup / 2U)
  381. {
  382. case 0U:
  383. if (0U == mRemainder)
  384. {
  385. mADCResult = ADC_ETC_TRIGn_RESULT_1_0_DATA0_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_1_0);
  386. }
  387. else
  388. {
  389. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_1_0) >> ADC_ETC_TRIGn_RESULT_1_0_DATA1_SHIFT;
  390. }
  391. break;
  392. case 1U:
  393. if (0U == mRemainder)
  394. {
  395. mADCResult = ADC_ETC_TRIGn_RESULT_3_2_DATA2_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_3_2);
  396. }
  397. else
  398. {
  399. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_3_2) >> ADC_ETC_TRIGn_RESULT_3_2_DATA3_SHIFT;
  400. }
  401. break;
  402. case 2U:
  403. if (0U == mRemainder)
  404. {
  405. mADCResult = ADC_ETC_TRIGn_RESULT_5_4_DATA4_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_5_4);
  406. }
  407. else
  408. {
  409. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_5_4) >> ADC_ETC_TRIGn_RESULT_5_4_DATA5_SHIFT;
  410. }
  411. break;
  412. case 3U:
  413. if (0U == mRemainder)
  414. {
  415. mADCResult = ADC_ETC_TRIGn_RESULT_7_6_DATA6_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_7_6);
  416. }
  417. else
  418. {
  419. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_7_6) >> ADC_ETC_TRIGn_RESULT_7_6_DATA7_SHIFT;
  420. }
  421. break;
  422. default:
  423. mADCResult = 0U;
  424. assert(false);
  425. break;
  426. }
  427. return mADCResult;
  428. }