fsl_adc_etc.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /*
  2. * Copyright (c) 2016, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. * of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. * list of conditions and the following disclaimer in the documentation and/or
  13. * other materials provided with the distribution.
  14. *
  15. * o Neither the name of the copyright holder nor the names of its
  16. * contributors may be used to endorse or promote products derived from this
  17. * software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. #include "fsl_adc_etc.h"
  31. /*******************************************************************************
  32. * Prototypes
  33. ******************************************************************************/
  34. #if defined(ADC_ETC_CLOCKS)
  35. /*!
  36. * @brief Get instance number for ADC_ETC module.
  37. *
  38. * @param base ADC_ETC peripheral base address
  39. */
  40. static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base);
  41. /*******************************************************************************
  42. * Variables
  43. ******************************************************************************/
  44. /*! @brief Pointers to ADC_ETC bases for each instance. */
  45. static ADC_ETC_Type *const s_adcetcBases[] = ADC_ETC_BASE_PTRS;
  46. /*! @brief Pointers to ADC_ETC clocks for each instance. */
  47. static const clock_ip_name_t s_adcetcClocks[] = ADC_ETC_CLOCKS;
  48. /*******************************************************************************
  49. * Code
  50. ******************************************************************************/
  51. static uint32_t ADC_ETC_GetInstance(ADC_ETC_Type *base)
  52. {
  53. uint32_t instance = 0U;
  54. uint32_t adcetcArrayCount = (sizeof(s_adcetcBases) / sizeof(s_adcetcBases[0]));
  55. /* Find the instance index from base address mappings. */
  56. for (instance = 0; instance < adcetcArrayCount; instance++)
  57. {
  58. if (s_adcetcBases[instance] == base)
  59. {
  60. break;
  61. }
  62. }
  63. return instance;
  64. }
  65. #endif /* ADC_ETC_CLOCKS */
  66. void ADC_ETC_Init(ADC_ETC_Type *base, const adc_etc_config_t *config)
  67. {
  68. assert(NULL != config);
  69. uint32_t tmp32;
  70. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  71. #if defined(ADC_ETC_CLOCKS)
  72. /* Open clock gate. */
  73. CLOCK_EnableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]);
  74. #endif /* ADC_ETC_CLOCKS */
  75. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  76. /* Disable software reset. */
  77. ADC_ETC_DoSoftwareReset(base, false);
  78. /* Set ADC_ETC_CTRL register. */
  79. tmp32 = ADC_ETC_CTRL_EXT0_TRIG_PRIORITY(config->TSC0triggerPriority) |
  80. ADC_ETC_CTRL_EXT1_TRIG_PRIORITY(config->TSC1triggerPriority) |
  81. ADC_ETC_CTRL_PRE_DIVIDER(config->clockPreDivider) | ADC_ETC_CTRL_TRIG_ENABLE(config->XBARtriggerMask);
  82. if (config->enableTSCBypass)
  83. {
  84. tmp32 |= ADC_ETC_CTRL_TSC_BYPASS_MASK;
  85. }
  86. if (config->enableTSC0Trigger)
  87. {
  88. tmp32 |= ADC_ETC_CTRL_EXT0_TRIG_ENABLE_MASK;
  89. }
  90. if (config->enableTSC1Trigger)
  91. {
  92. tmp32 |= ADC_ETC_CTRL_EXT1_TRIG_ENABLE_MASK;
  93. }
  94. base->CTRL = tmp32;
  95. }
  96. void ADC_ETC_Deinit(ADC_ETC_Type *base)
  97. {
  98. /* Do software reset to clear all logical. */
  99. ADC_ETC_DoSoftwareReset(base, true);
  100. #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
  101. #if defined(ADC_ETC_CLOCKS)
  102. /* Close clock gate. */
  103. CLOCK_DisableClock(s_adcetcClocks[ADC_ETC_GetInstance(base)]);
  104. #endif /* ADC_ETC_CLOCKS */
  105. #endif /* FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL */
  106. }
  107. void ADC_ETC_GetDefaultConfig(adc_etc_config_t *config)
  108. {
  109. config->enableTSCBypass = true;
  110. config->enableTSC0Trigger = false;
  111. config->enableTSC1Trigger = false;
  112. config->TSC0triggerPriority = 0U;
  113. config->TSC1triggerPriority = 0U;
  114. config->clockPreDivider = 0U;
  115. config->XBARtriggerMask = 0U;
  116. }
  117. void ADC_ETC_SetTriggerConfig(ADC_ETC_Type *base, uint32_t triggerGroup, const adc_etc_trigger_config_t *config)
  118. {
  119. assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT);
  120. assert(ADC_ETC_TRIGn_COUNTER_COUNT > triggerGroup);
  121. uint32_t tmp32;
  122. /* Set ADC_ETC_TRGn_CTRL register. */
  123. tmp32 = ADC_ETC_TRIGn_CTRL_TRIG_CHAIN(config->triggerChainLength) |
  124. ADC_ETC_TRIGn_CTRL_TRIG_PRIORITY(config->triggerPriority);
  125. if (config->enableSyncMode)
  126. {
  127. tmp32 |= ADC_ETC_TRIGn_CTRL_SYNC_MODE_MASK;
  128. }
  129. if (config->enableSWTriggerMode)
  130. {
  131. tmp32 |= ADC_ETC_TRIGn_CTRL_TRIG_MODE_MASK;
  132. }
  133. base->TRIG[triggerGroup].TRIGn_CTRL = tmp32;
  134. /* Set ADC_ETC_TRGn_COUNTER register. */
  135. tmp32 = ADC_ETC_TRIGn_COUNTER_INIT_DELAY(config->initialDelay) |
  136. ADC_ETC_TRIGn_COUNTER_SAMPLE_INTERVAL(config->sampleIntervalDelay);
  137. base->TRIG[triggerGroup].TRIGn_COUNTER = tmp32;
  138. }
  139. void ADC_ETC_SetTriggerChainConfig(ADC_ETC_Type *base,
  140. uint32_t triggerGroup,
  141. uint32_t chainGroup,
  142. const adc_etc_trigger_chain_config_t *config)
  143. {
  144. assert(triggerGroup < ADC_ETC_TRIGn_CTRL_COUNT);
  145. uint32_t tmp;
  146. uint32_t tmp32;
  147. uint8_t mRemainder = chainGroup % 2U;
  148. /* Set ADC_ETC_TRIGn_CHAINm register. */
  149. tmp = ADC_ETC_TRIGn_CHAIN_1_0_HWTS0(config->ADCHCRegisterSelect) |
  150. ADC_ETC_TRIGn_CHAIN_1_0_CSEL0(config->ADCChannelSelect) |
  151. ADC_ETC_TRIGn_CHAIN_1_0_IE0(config->InterruptEnable);
  152. if (config->enableB2BMode)
  153. {
  154. tmp |= ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK;
  155. }
  156. switch (chainGroup / 2U)
  157. {
  158. case 0U: /* Configurate trigger chain0 and chain 1. */
  159. tmp32 = base->TRIG[triggerGroup].TRIGn_CHAIN_1_0;
  160. if (mRemainder == 0U) /* Chain 0. */
  161. {
  162. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS0_MASK |
  163. ADC_ETC_TRIGn_CHAIN_1_0_B2B0_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE0_MASK);
  164. tmp32 |= tmp;
  165. }
  166. else /* Chain 1. */
  167. {
  168. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_HWTS1_MASK |
  169. ADC_ETC_TRIGn_CHAIN_1_0_B2B1_MASK | ADC_ETC_TRIGn_CHAIN_1_0_IE1_MASK);
  170. tmp32 |= (tmp << ADC_ETC_TRIGn_CHAIN_1_0_CSEL1_SHIFT);
  171. }
  172. base->TRIG[triggerGroup].TRIGn_CHAIN_1_0 = tmp32;
  173. break;
  174. case 1U: /* Configurate trigger chain2 and chain 3. */
  175. tmp32 = base->TRIG[triggerGroup].TRIGn_CHAIN_3_2;
  176. if (mRemainder == 0U) /* Chain 2. */
  177. {
  178. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS2_MASK |
  179. ADC_ETC_TRIGn_CHAIN_3_2_B2B2_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE2_MASK);
  180. tmp32 |= tmp;
  181. }
  182. else /* Chain 3. */
  183. {
  184. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_HWTS3_MASK |
  185. ADC_ETC_TRIGn_CHAIN_3_2_B2B3_MASK | ADC_ETC_TRIGn_CHAIN_3_2_IE3_MASK);
  186. tmp32 |= (tmp << ADC_ETC_TRIGn_CHAIN_3_2_CSEL3_SHIFT);
  187. }
  188. base->TRIG[triggerGroup].TRIGn_CHAIN_3_2 = tmp32;
  189. break;
  190. case 2U: /* Configurate trigger chain4 and chain 5. */
  191. tmp32 = base->TRIG[triggerGroup].TRIGn_CHAIN_5_4;
  192. if (mRemainder == 0U) /* Chain 4. */
  193. {
  194. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS4_MASK |
  195. ADC_ETC_TRIGn_CHAIN_5_4_B2B4_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE4_MASK);
  196. tmp32 |= tmp;
  197. }
  198. else /* Chain 5. */
  199. {
  200. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_HWTS5_MASK |
  201. ADC_ETC_TRIGn_CHAIN_5_4_B2B5_MASK | ADC_ETC_TRIGn_CHAIN_5_4_IE5_MASK);
  202. tmp32 |= (tmp << ADC_ETC_TRIGn_CHAIN_5_4_CSEL5_SHIFT);
  203. }
  204. base->TRIG[triggerGroup].TRIGn_CHAIN_5_4 = tmp32;
  205. break;
  206. case 3U: /* Configurate trigger chain6 and chain 7. */
  207. tmp32 = base->TRIG[triggerGroup].TRIGn_CHAIN_7_6;
  208. if (mRemainder == 0U) /* Chain 6. */
  209. {
  210. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS6_MASK |
  211. ADC_ETC_TRIGn_CHAIN_7_6_B2B6_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE6_MASK);
  212. tmp32 |= tmp;
  213. }
  214. else /* Chain 7. */
  215. {
  216. tmp32 &= ~(ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_HWTS7_MASK |
  217. ADC_ETC_TRIGn_CHAIN_7_6_B2B7_MASK | ADC_ETC_TRIGn_CHAIN_7_6_IE7_MASK);
  218. tmp32 |= (tmp << ADC_ETC_TRIGn_CHAIN_7_6_CSEL7_SHIFT);
  219. }
  220. base->TRIG[triggerGroup].TRIGn_CHAIN_7_6 = tmp32;
  221. break;
  222. default:
  223. break;
  224. }
  225. }
  226. uint32_t ADC_ETC_GetInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex)
  227. {
  228. uint32_t tmp32 = 0U;
  229. if (((base->DONE0_1_IRQ) & (ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << sourceIndex)) != 0U)
  230. {
  231. tmp32 |= kADC_ETC_Done0StatusFlagMask; /* Customized DONE0 status flags mask, which is defined in fsl_adc_etc.h
  232. file. */
  233. }
  234. if (((base->DONE0_1_IRQ) & (ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << sourceIndex)) != 0U)
  235. {
  236. tmp32 |= kADC_ETC_Done1StatusFlagMask; /* Customized DONE1 status flags mask, which is defined in fsl_adc_etc.h
  237. file. */
  238. }
  239. if (((base->DONE2_ERR_IRQ) & (ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK << sourceIndex)) != 0U)
  240. {
  241. tmp32 |= kADC_ETC_Done2StatusFlagMask; /* Customized DONE2 status flags mask, which is defined in fsl_adc_etc.h
  242. file. */
  243. }
  244. if (((base->DONE2_ERR_IRQ) & (ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK << sourceIndex)) != 0U)
  245. {
  246. tmp32 |= kADC_ETC_ErrorStatusFlagMask; /* Customized ERROR status flags mask, which is defined in fsl_adc_etc.h
  247. file. */
  248. }
  249. return tmp32;
  250. }
  251. void ADC_ETC_ClearInterruptStatusFlags(ADC_ETC_Type *base, adc_etc_external_trigger_source_t sourceIndex, uint32_t mask)
  252. {
  253. if (0U != (mask & kADC_ETC_Done0StatusFlagMask)) /* Write 1 to clear DONE0 status flags. */
  254. {
  255. base->DONE0_1_IRQ = (ADC_ETC_DONE0_1_IRQ_TRIG0_DONE0_MASK << sourceIndex);
  256. }
  257. if (0U != (mask & kADC_ETC_Done1StatusFlagMask)) /* Write 1 to clear DONE1 status flags. */
  258. {
  259. base->DONE0_1_IRQ = (ADC_ETC_DONE0_1_IRQ_TRIG0_DONE1_MASK << sourceIndex);
  260. }
  261. if (0U != (mask & kADC_ETC_Done2StatusFlagMask)) /* Write 1 to clear DONE2 status flags. */
  262. {
  263. base->DONE2_ERR_IRQ = (ADC_ETC_DONE2_ERR_IRQ_TRIG0_DONE2_MASK << sourceIndex);
  264. }
  265. if (0U != (mask & kADC_ETC_ErrorStatusFlagMask)) /* Write 1 to clear ERROR status flags. */
  266. {
  267. base->DONE2_ERR_IRQ = (ADC_ETC_DONE2_ERR_IRQ_TRIG0_ERR_MASK << sourceIndex);
  268. }
  269. }
  270. uint32_t ADC_ETC_GetADCConversionValue(ADC_ETC_Type *base, uint32_t triggerGroup, uint32_t chainGroup)
  271. {
  272. assert(triggerGroup < ADC_ETC_TRIGn_RESULT_1_0_COUNT);
  273. uint32_t mADCResult;
  274. uint8_t mRemainder = chainGroup % 2U;
  275. switch (chainGroup / 2U)
  276. {
  277. case 0U:
  278. if (0U == mRemainder)
  279. {
  280. mADCResult = ADC_ETC_TRIGn_RESULT_1_0_DATA0_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_1_0);
  281. }
  282. else
  283. {
  284. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_1_0) >> ADC_ETC_TRIGn_RESULT_1_0_DATA1_SHIFT;
  285. }
  286. break;
  287. case 1U:
  288. if (0U == mRemainder)
  289. {
  290. mADCResult = ADC_ETC_TRIGn_RESULT_3_2_DATA2_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_3_2);
  291. }
  292. else
  293. {
  294. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_3_2) >> ADC_ETC_TRIGn_RESULT_3_2_DATA3_SHIFT;
  295. }
  296. break;
  297. case 2U:
  298. if (0U == mRemainder)
  299. {
  300. mADCResult = ADC_ETC_TRIGn_RESULT_5_4_DATA4_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_5_4);
  301. }
  302. else
  303. {
  304. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_5_4) >> ADC_ETC_TRIGn_RESULT_5_4_DATA5_SHIFT;
  305. }
  306. break;
  307. case 3U:
  308. if (0U == mRemainder)
  309. {
  310. mADCResult = ADC_ETC_TRIGn_RESULT_7_6_DATA6_MASK & (base->TRIG[triggerGroup].TRIGn_RESULT_7_6);
  311. }
  312. else
  313. {
  314. mADCResult = (base->TRIG[triggerGroup].TRIGn_RESULT_7_6) >> ADC_ETC_TRIGn_RESULT_7_6_DATA7_SHIFT;
  315. }
  316. break;
  317. default:
  318. return 0U;
  319. }
  320. return mADCResult;
  321. }