fsl_adc_etc.c 14 KB

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