1 /*
2  * Copyright 2021-2024 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 /**
8 *   @file
9 *
10 *   @addtogroup adc_sar_ip Adc Sar IPL
11 *   @{
12 */
13 
14 #ifdef __cplusplus
15 extern "C"{
16 #endif
17 
18 /*==================================================================================================
19 *                                        INCLUDE FILES
20 * 1) system and project includes
21 * 2) needed interfaces from external units
22 * 3) internal and external interfaces from this unit
23 ==================================================================================================*/
24 #include "Adc_Sar_Ip.h"
25 #include "Adc_Sar_Ip_Irq.h"
26 #include "Adc_Sar_Ip_HwAccess.h"
27 #include "Adc_Sar_Ip_TrustedFunctions.h"
28 #include "Reg_eSys.h"
29 #include "SchM_Adc.h"
30 
31 #if defined(ADC_SAR_IP_DEV_ERROR_DETECT)
32 #include "OsIf.h"
33 
34 /* local definitions on the limits of the clock frequency */
35 #define ADC_CLOCK_FREQ_MAX_RUNTIME     (80000000U)
36 #define ADC_CLOCK_FREQ_MAX_CALIBRATION (40000000U)
37 
38 #endif /* defined(ADC_SAR_IP_DEV_ERROR_DETECT) */
39 
40 #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
41     /* USER_MODE_REG_PROT_ENABLED is defined for Base sanity check in RegLockMacros.h */
42     #define USER_MODE_REG_PROT_ENABLED      (ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
43     #include "RegLockMacros.h"
44 #endif /* (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT) */
45 
46 /*==================================================================================================
47 *                              SOURCE FILE VERSION INFORMATION
48 ==================================================================================================*/
49 #define ADC_SAR_IP_VENDOR_ID_C                      43
50 #define ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C       4
51 #define ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C       7
52 #define ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_C    0
53 #define ADC_SAR_IP_SW_MAJOR_VERSION_C               2
54 #define ADC_SAR_IP_SW_MINOR_VERSION_C               0
55 #define ADC_SAR_IP_SW_PATCH_VERSION_C               0
56 
57 /*==================================================================================================
58 *                                     FILE VERSION CHECKS
59 ==================================================================================================*/
60 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip.h file are of the same vendor */
61 #if (ADC_SAR_IP_VENDOR_ID_C != ADC_SAR_IP_VENDOR_ID)
62     #error "Adc_Sar_Ip.c and Adc_Sar_Ip.h have different vendor ids"
63 #endif
64 
65 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip.h file are of the same Autosar version */
66 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION) || \
67      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MINOR_VERSION) || \
68      (ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_C != ADC_SAR_IP_AR_RELEASE_REVISION_VERSION) \
69     )
70     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip.h are different"
71 #endif
72 
73 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip.h file are of the same Software version */
74 #if ((ADC_SAR_IP_SW_MAJOR_VERSION_C != ADC_SAR_IP_SW_MAJOR_VERSION) || \
75      (ADC_SAR_IP_SW_MINOR_VERSION_C != ADC_SAR_IP_SW_MINOR_VERSION) || \
76      (ADC_SAR_IP_SW_PATCH_VERSION_C != ADC_SAR_IP_SW_PATCH_VERSION) \
77     )
78   #error "Software Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip.h are different"
79 #endif
80 
81 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_Irq.h file are of the same vendor */
82 #if (ADC_SAR_IP_VENDOR_ID_C != ADC_SAR_IP_VENDOR_ID_IRQ)
83     #error "Adc_Sar_Ip.c and Adc_Sar_Ip_Irq.h have different vendor ids"
84 #endif
85 
86 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_Irq.h file are of the same Autosar version */
87 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_IRQ) || \
88      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_IRQ) || \
89      (ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_C != ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_IRQ) \
90     )
91     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_Irq.h are different"
92 #endif
93 
94 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_Irq.h file are of the same Software version */
95 #if ((ADC_SAR_IP_SW_MAJOR_VERSION_C != ADC_SAR_IP_SW_MAJOR_VERSION_IRQ) || \
96      (ADC_SAR_IP_SW_MINOR_VERSION_C != ADC_SAR_IP_SW_MINOR_VERSION_IRQ) || \
97      (ADC_SAR_IP_SW_PATCH_VERSION_C != ADC_SAR_IP_SW_PATCH_VERSION_IRQ) \
98     )
99   #error "Software Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_Irq.h are different"
100 #endif
101 
102 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_HwAccess.h file are of the same vendor */
103 #if (ADC_SAR_IP_VENDOR_ID_C != ADC_SAR_IP_VENDOR_ID_HWACCESS)
104     #error "Adc_Sar_Ip.c and Adc_Sar_Ip_HwAccess.h have different vendor ids"
105 #endif
106 
107 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_HwAccess.h file are of the same Autosar version */
108 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_HWACCESS) || \
109      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_HWACCESS) || \
110      (ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_C != ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_HWACCESS) \
111     )
112     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_HwAccess.h are different"
113 #endif
114 
115 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_HwAccess.h file are of the same Software version */
116 #if ((ADC_SAR_IP_SW_MAJOR_VERSION_C != ADC_SAR_IP_SW_MAJOR_VERSION_HWACCESS) || \
117      (ADC_SAR_IP_SW_MINOR_VERSION_C != ADC_SAR_IP_SW_MINOR_VERSION_HWACCESS) || \
118      (ADC_SAR_IP_SW_PATCH_VERSION_C != ADC_SAR_IP_SW_PATCH_VERSION_HWACCESS) \
119     )
120   #error "Software Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_HwAccess.h are different"
121 #endif
122 
123 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_TrustedFunctions.h file are of the same vendor */
124 #if (ADC_SAR_IP_VENDOR_ID_C != ADC_SAR_IP_VENDOR_ID_TRUSTEDFUNCTIONS)
125     #error "Adc_Sar_Ip.c and Adc_Sar_Ip_TrustedFunctions.h have different vendor ids"
126 #endif
127 
128 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_TrustedFunctions.h file are of the same Autosar version */
129 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_TRUSTEDFUNCTIONS) || \
130      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_TRUSTEDFUNCTIONS) || \
131      (ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_C != ADC_SAR_IP_AR_RELEASE_REVISION_VERSION_TRUSTEDFUNCTIONS) \
132     )
133     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_TrustedFunctions.h are different"
134 #endif
135 
136 /* Check if Adc_Sar_Ip.c file and Adc_Sar_Ip_TrustedFunctions.h file are of the same Software version */
137 #if ((ADC_SAR_IP_SW_MAJOR_VERSION_C != ADC_SAR_IP_SW_MAJOR_VERSION_TRUSTEDFUNCTIONS) || \
138      (ADC_SAR_IP_SW_MINOR_VERSION_C != ADC_SAR_IP_SW_MINOR_VERSION_TRUSTEDFUNCTIONS) || \
139      (ADC_SAR_IP_SW_PATCH_VERSION_C != ADC_SAR_IP_SW_PATCH_VERSION_TRUSTEDFUNCTIONS) \
140     )
141   #error "Software Version Numbers of Adc_Sar_Ip.c and Adc_Sar_Ip_TrustedFunctions.h are different"
142 #endif
143 
144 #ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
145 /* Check if Adc_Sar_Ip.c file and Reg_eSys.h file are of the same Autosar version */
146 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != REG_ESYS_AR_RELEASE_MAJOR_VERSION) || \
147      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != REG_ESYS_AR_RELEASE_MINOR_VERSION)    \
148     )
149     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and Reg_eSys.h are different"
150 #endif
151 
152 #if defined(ADC_SAR_IP_DEV_ERROR_DETECT)
153     /* Check if Adc_Sar_Ip.c file and OsIf.h file are of the same Autosar version */
154     #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != OSIF_AR_RELEASE_MAJOR_VERSION) || \
155          (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != OSIF_AR_RELEASE_MINOR_VERSION)    \
156         )
157         #error "AutoSar Version Numbers of Adc_Sar_Ip.c and OsIf.h are different"
158     #endif
159 #endif /* defined(ADC_SAR_IP_DEV_ERROR_DETECT) */
160 
161 #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
162     /* Checks against RegLockMacros.h */
163     #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != REGLOCKMACROS_AR_RELEASE_MAJOR_VERSION) || \
164          (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != REGLOCKMACROS_AR_RELEASE_MINOR_VERSION))
165         #error "AUTOSAR Version Numbers of Adc_Sar_Ip.c and RegLockMacros.h are different"
166     #endif
167 #endif /* (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT) */
168 
169 /* Check if Adc_Sar_Ip.c file and SchM_Adc.h file are of the same version */
170 #if ((ADC_SAR_IP_AR_RELEASE_MAJOR_VERSION_C != SCHM_ADC_AR_RELEASE_MAJOR_VERSION) || \
171      (ADC_SAR_IP_AR_RELEASE_MINOR_VERSION_C != SCHM_ADC_AR_RELEASE_MINOR_VERSION) \
172     )
173     #error "AutoSar Version Numbers of Adc_Sar_Ip.c and SchM_Adc.h are different"
174 #endif
175 #endif /* DISABLE_MCAL_INTERMODULE_ASR_CHECK */
176 
177 /*******************************************************************************
178  * Pre-check
179  ******************************************************************************/
180 #ifndef MCAL_ENABLE_USER_MODE_SUPPORT
181     #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
182         #error MCAL_ENABLE_USER_MODE_SUPPORT is not enabled. For running ADC in user mode the MCAL_ENABLE_USER_MODE_SUPPORT needs to be defined
183     #endif /* (STD_ON == ADC_ENABLE_USER_MODE_SUPPORT) */
184 #endif /* ifndef MCAL_ENABLE_USER_MODE_SUPPORT*/
185 
186 /*==================================================================================================
187 *                          LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
188 ==================================================================================================*/
189 
190 /*==================================================================================================
191 *                                       LOCAL MACROS
192 ==================================================================================================*/
193 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
194 /* ADC_SAR_IP_INST_HAS_REG_<bitwidth> macros. Checks the availability of a
195     register index based on the availability of the ADC channels
196     for the particular u32Instance on the platform.
197     <bitwidth> represents the width of the bitfield associated with each
198     ADC channel in the register series.
199 */
200 #define ADC_SAR_IP_INST_HAS_REG_4(inst,regIdx)  ((Adc_Sar_Ip_au32AdcChanBitmap[inst][(regIdx) / 4u] & (0xFFUL << (((regIdx) % 4u) * 8u))) != 0u)
201 #define ADC_SAR_IP_INST_HAS_REG_32(inst,regIdx) ((Adc_Sar_Ip_au32AdcChanBitmap[inst][(regIdx) / 32u] & (0x01UL << ((regIdx) % 32u))) != 0u)
202 
203 /* <bitwidth> = 4. Four bits in the register correspond to one ADC channel */
204 #define ADC_SAR_IP_INST_HAS_CWSELRn(inst,x) (ADC_SAR_IP_INST_HAS_REG_4(inst,x))
205 
206 /* <bitwidth> = 32. The entire 4 byte register is associated with one ADC channel */
207 #define ADC_SAR_IP_INST_HAS_CDRn(inst,n) (ADC_SAR_IP_INST_HAS_REG_32(inst,n))
208 #define ADC_SAR_IP_INST_HAS_CHANn(inst,n) (ADC_SAR_IP_INST_HAS_REG_32(inst,n))
209 
210 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
211 
212 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
213 
214 #ifdef ADC_DSDR_DSD
215 #define ADC_SAR_IP_INST_HAS_DSDR(inst) ((Adc_Sar_Ip_au32AdcFeatureBitmap[inst] & (1UL << 0u)) != 0u)
216 #endif /* ADC_DSDR_DSD */
217 #define ADC_SAR_IP_INST_HAS_PSCR(inst) ((Adc_Sar_Ip_au32AdcFeatureBitmap[inst] & (1UL << 1u)) != 0u)
218 #define ADC_SAR_IP_INST_HAS_CTU(inst) ((Adc_Sar_Ip_au32AdcFeatureBitmap[inst] & (1UL << 2u)) != 0u)
219 #define ADC_SAR_IP_INST_HAS_CTU_TRIGGER_MODE(inst) ((Adc_Sar_Ip_au32AdcFeatureBitmap[inst] & (1UL << 3u)) != 0u)
220 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
221 
222 /* Macros for watchdog registers to help decode and compose bit mask for the functionality */
223 #define ADC_SAR_IP_WDG_REG_MASK_HIGH(registerIdx) ((uint32)((uint32)1UL << (((registerIdx) * 2u) + 1u)))
224 #define ADC_SAR_IP_WDG_REG_MASK_LOW(registerIdx)  ((uint32)((uint32)1UL << ((registerIdx) * 2u)))
225 /*==================================================================================================
226 *                                      LOCAL CONSTANTS
227 ==================================================================================================*/
228 
229 /*==================================================================================================
230 *                                      LOCAL VARIABLES
231 ==================================================================================================*/
232 #define ADC_START_SEC_CONST_UNSPECIFIED
233 #include "Adc_MemMap.h"
234 
235 /* Table of pBase addresses for ADC instances. */
236 ADC_Type * const Adc_Sar_Ip_apxAdcBase[ADC_INSTANCE_COUNT] = IP_ADC_BASE_PTRS;
237 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
238 SAR_ADC_AE_Type * const Adc_Sar_AE_Ip_apxAdcBase[SAR_ADC_AE_INSTANCE_COUNT] = IP_SAR_ADC_AE_BASE_PTRS;
239 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
240 #if ADC_SAR_IP_HAS_TEMPSENSE_CHN
241 #if (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON)
242 static TEMPSENSE_Type * const Adc_Sar_Ip_apxTempsenseBase[TEMPSENSE_INSTANCE_COUNT] = IP_TEMPSENSE_BASE_PTRS;
243 #endif /* (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON) */
244 #endif
245 
246 #define ADC_STOP_SEC_CONST_UNSPECIFIED
247 #include "Adc_MemMap.h"
248 
249 #define ADC_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
250 #include "Adc_MemMap.h"
251 /* Global state structure */
252 VAR_SEC_NOCACHE(Adc_Sar_Ip_axAdcSarState) static Adc_Sar_Ip_StateStructType Adc_Sar_Ip_axAdcSarState[ADC_SAR_IP_INSTANCE_COUNT];
253 
254 #define ADC_STOP_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
255 #include "Adc_MemMap.h"
256 
257 #define ADC_START_SEC_CONST_32
258 #include "Adc_MemMap.h"
259 
260 static const uint8 Adc_Sar_Ip_au8AdcGroupCount[ADC_SAR_IP_INSTANCE_COUNT] = FEATURE_ADC_MAX_GROUP_COUNT;
261 
262 #if ((1U ==  ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL) || (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED)))
263 static const uint32 Adc_Sar_Ip_au32AdcChanBitmap[ADC_SAR_IP_INSTANCE_COUNT][ADC_SAR_IP_NUM_GROUP_CHAN] = FEATURE_ADC_CHN_AVAIL_BITMAP;
264 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
265 
266 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
267 static const uint32 Adc_Sar_Ip_au32AdcFeatureBitmap[ADC_SAR_IP_INSTANCE_COUNT] = FEATURE_ADC_FEAT_AVAIL_BITMAP;
268 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
269 
270 #define ADC_STOP_SEC_CONST_32
271 #include "Adc_MemMap.h"
272 
273 /*==================================================================================================
274 *                                      GLOBAL CONSTANTS
275 ==================================================================================================*/
276 
277 /*==================================================================================================
278 *                                      GLOBAL VARIABLES
279 ==================================================================================================*/
280 
281 /*==================================================================================================
282 *                                   GLOBAL FUNCTION PROTOTYPES
283 ==================================================================================================*/
284 
285 /*==================================================================================================
286 *                                   LOCAL FUNCTION PROTOTYPES
287 ==================================================================================================*/
288 #define ADC_START_SEC_CODE
289 #include "Adc_MemMap.h"
290 
291 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
292 static inline uint8 Adc_Sar_GetResolution(const uint32 Instance);
293 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
294 
295 static inline uint16 Adc_Sar_GetMaskedResult(const uint32 Instance,
296                                              const uint32 Cdr);
297 static inline uint32 Adc_Sar_GetMsrFlags(const uint32 Instance);
298 static inline uint32 Adc_Sar_GetIsrFlags(const uint32 Instance);
299 #if ADC_SAR_IP_HAS_ADCLKSEL
300 static inline uint32 Adc_Sar_GetADCLKSELValue(Adc_Sar_Ip_ClockSelType ClockSel);
301 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
302 static inline uint32 Adc_Sar_CollectMcrMasks(const uint32 Instance,
303                                              const Adc_Sar_Ip_ConfigType * const Config,
304                                              uint32 InitialMcr);
305 static inline void Adc_Sar_ConfigChannels(const uint32 Instance,
306                                           const Adc_Sar_Ip_ChanConfigType * ChannelConfigsPtr,
307                                           uint8 NumChannels);
308 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
309 static inline Adc_Sar_Ip_StatusType Adc_Sar_CheckSelfTestProgress(const uint32 Instance);
310 static inline void Adc_Sar_ConfigSelftestThreshold(const uint32 Instance,
311                                                    const Adc_Sar_Ip_SelfTestThresholdType * SelfTestThresholdConfig);
312 static inline void Adc_Sar_EnableSelftestThreshold(const uint32 Instance);
313 static inline void Adc_Sar_DisableSelftestThreshold(const uint32 Instance);
314 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
315 static uint32 Adc_Sar_GetConvResults(const uint32 Instance,
316                                      const Adc_Sar_Ip_ConvChainType ChainType,
317                                      uint16 * const ResultsRaw,
318                                      Adc_Sar_Ip_ChanResultType * const ResultsStruct,
319                                      const uint32 Length);
320 
321 static void Adc_Sar_ResetWdog(const uint32 Instance);
322 
323 #if FEATURE_ADC_HAS_CLOCK_DIVIDER
324 static inline void Adc_Sar_EnableClkDiv(const uint32 Instance,
325                                         const boolean ClkDivEnable);
326 #endif /* FEATURE_ADC_HAS_CLOCK_DIVIDER */
327 
328 #if ( \
329      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || (STD_ON == ADC_SAR_IP_JECH_ENABLED) || \
330      ((ADC_SAR_IP_HAS_CTU == 1U) && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED)) \
331     )
332 static inline void Adc_Sar_CheckAndCallNotification(void (*Callback)(void));
333 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) .. */
334 
335 #if (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED))
336 static inline void Adc_Sar_CheckAndCallEoctuNotification(const uint32 Instance);
337 #endif
338 
339 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
340 static inline void Adc_Sar_CheckAndCallEocNotification(uint32 Instance,
341                                                        uint16 ChanIdx,
342                                                        uint16 VectAdr,
343                                                        uint32 EocFlag,
344                                                        boolean * CeocfrFlag);
345 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
346 
347 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
348 static inline uint32 Adc_Sar_CheckAndCallWorrNotification(uint32 Instance,
349                                                           uint16 ChanIdx,
350                                                           uint16 VectAdr);
351 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
352 
353 #if ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED))
354 static inline void Adc_CheckAndCallAllChannelNotification(const uint32 Instance);
355 #endif /* ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
356 
357 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
358 #if (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER)
359 static inline void Adc_Sar_ConfigExternalTrigger(const uint32 Instance,
360                                                  const Adc_Sar_Ip_ExtTriggerEdgeType TriggerEdge,
361                                                  const uint32 TrgEdgeSetMask,
362                                                  const uint32 TrgEdgeClrMask,
363                                                  const uint32 TrigSrcMask);
364 #endif /* (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER) */
365 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
366 
367 #if ADC_SAR_IP_HAS_TEMPSENSE_CHN
368 #if (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON)
369 static inline uint32 Adc_Sar_TempsenseConvFp2Int(const uint32 FloatingPoint);
370 static inline uint16 Adc_Sar_TempsenseConvInt2Fp(const sint32 SignedInteger);
371 #endif /* (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON) */
372 #endif /* ADC_SAR_IP_HAS_TEMPSENSE_CHN */
373 
374 static inline void Adc_Sar_SetNormalChain(const uint32 Instance,
375                                           const uint32 * const Mask);
376 static inline void Adc_Sar_SetInjectedChain(const uint32 Instance,
377                                             const uint32 * const Mask);
378 
379 /* The function is used to reduce complexity for parent function */
380 static inline uint32 Adc_Sar_GetValueFromBool(const boolean bVal,
381                                               const uint32 TrueVal,
382                                               const uint32 FalseVal);
383 
384 static inline Adc_Sar_Ip_StatusType Adc_Sar_CalibrationClkRestore(const uint32 u32Instance,
385                                                                      volatile uint32 * MCRAddr,
386                                                                      uint32 McrSavedValue);
387 static inline Adc_Sar_Ip_StatusType Adc_Sar_CalibrationClkSelect(const uint32 u32Instance,
388                                                                     volatile uint32 * MCRAddr,
389                                                                     uint32* McrSavedValue);
390 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
391 static inline Adc_Sar_Ip_StatusType Adc_Sar_CheckTimeoutStatus(const uint32 ActualTimeout,
392                                                                const uint32 ExpectTimeout);
393 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
394 
395 /*==================================================================================================
396 *                                       LOCAL FUNCTIONS
397 ==================================================================================================*/
398 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
Adc_Sar_CheckTimeoutStatus(const uint32 ActualTimeout,const uint32 ExpectTimeout)399 static inline Adc_Sar_Ip_StatusType Adc_Sar_CheckTimeoutStatus(const uint32 ActualTimeout,
400                                                                const uint32 ExpectTimeout)
401 {
402     Adc_Sar_Ip_StatusType RelValue = ADC_SAR_IP_STATUS_SUCCESS;
403     /* Check if the timeout is not expected */
404     if (ActualTimeout >= ExpectTimeout)
405     {
406         RelValue = ADC_SAR_IP_STATUS_TIMEOUT;
407     }
408 
409     /* Return the value of ADC SAR status */
410     return RelValue;
411 }
412 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
413 
414 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
415 /*FUNCTION*********************************************************************
416  *
417  * Function Name : Adc_Sar_GetResolution
418  * Description   : Returns Adc Sar resolution for conversion data
419  *
420  *END*************************************************************************/
Adc_Sar_GetResolution(const uint32 Instance)421 static inline uint8 Adc_Sar_GetResolution(const uint32 Instance)
422 {
423     uint8 Resolution;
424     static const uint8 ResolutionArray[] = {14U, 12U, 10U, 8U}; /* maps each register bit value to resolution bit number */
425     const ADC_Type * const AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
426     uint32 Calbistreg = AdcBasePtr->CALBISTREG;
427     /* ResolutionArray can be used only for 2 bits resolutions. On S32K3 platforms only 2 bits are used so "& 3U" operation is needed */
428     uint8 ResolutionBits = (uint8)(((Calbistreg & ADC_CALBISTREG_RESN_MASK) >> ADC_CALBISTREG_RESN_SHIFT) & 3U);
429 
430     Resolution = ResolutionArray[ResolutionBits];
431 
432     return Resolution;
433 }
434 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
435 
436 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
437 /*FUNCTION*********************************************************************
438  *
439  * Function Name : Adc_Sar_ConfigSelftestThreshold
440  * Description   : Configure self-test threshold value
441  *
442  *END*************************************************************************/
Adc_Sar_ConfigSelftestThreshold(const uint32 Instance,const Adc_Sar_Ip_SelfTestThresholdType * SelfTestThresholdConfig)443 static inline void Adc_Sar_ConfigSelftestThreshold(const uint32 Instance,
444                                                    const Adc_Sar_Ip_SelfTestThresholdType * SelfTestThresholdConfig)
445 {
446     ADC_Type * AdcBasePtr = NULL_PTR;
447 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
448     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
449 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
450 #ifdef ADC_STAW0R_AWDE
451     volatile uint32 * STAW0RAddr = NULL_PTR;
452 #endif /* ADC_STAW0R_AWDE */
453 #ifdef ADC_STAW1R_AWDE
454     volatile uint32 * STAW1RAddr = NULL_PTR;
455 #endif /* ADC_STAW1R_AWDE */
456 #ifdef ADC_STAW1AR_AWDE
457     volatile uint32 * STAW1ARAddr = NULL_PTR;
458     volatile uint32 * STAW1BRAddr = NULL_PTR;
459 #endif /* ADC_STAW1AR_AWDE */
460 #ifdef ADC_STAW2R_AWDE
461     volatile uint32 * STAW2RAddr = NULL_PTR;
462 #endif /* ADC_STAW2R_AWDE */
463 #ifdef ADC_STAW4R_AWDE
464     volatile uint32 * STAW4RAddr = NULL_PTR;
465     volatile uint32 * STAW5RAddr = NULL_PTR;
466 #endif /* ADC_STAW4R_AWDE */
467 
468 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
469     if (Instance >= ADC_INSTANCE_COUNT)
470     {
471         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
472 #ifdef ADC_STAW0R_AWDE
473         STAW0RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW0R);
474 #endif /* ADC_STAW0R_AWDE */
475 #ifdef ADC_STAW1R_AWDE
476         STAW1RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1R);
477 #endif /* ADC_STAW1R_AWDE */
478 #ifdef ADC_STAW1AR_AWDE
479         STAW1ARAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1AR);
480         STAW1BRAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1BR);
481 #endif /* ADC_STAW1AR_AWDE */
482 #ifdef ADC_STAW2R_AWDE
483         STAW2RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW2R);
484 #endif /* ADC_STAW2R_AWDE */
485 #ifdef ADC_STAW4R_AWDE
486         STAW4RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW4R);
487         STAW5RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW5R);
488 #endif /* ADC_STAW4R_AWDE */
489     }
490     else
491 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
492     {
493         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
494 #ifdef ADC_STAW0R_AWDE
495         STAW0RAddr = (volatile uint32 *)&(AdcBasePtr->STAW0R);
496 #endif /* ADC_STAW0R_AWDE */
497 #ifdef ADC_STAW1R_AWDE
498         STAW1RAddr = (volatile uint32 *)&(AdcBasePtr->STAW1R);
499 #endif /* ADC_STAW1R_AWDE */
500 #ifdef ADC_STAW1AR_AWDE
501         STAW1ARAddr = (volatile uint32 *)&(AdcBasePtr->STAW1AR);
502         STAW1BRAddr = (volatile uint32 *)&(AdcBasePtr->STAW1BR);
503 #endif /* ADC_STAW1AR_AWDE */
504 #ifdef ADC_STAW2R_AWDE
505         STAW2RAddr = (volatile uint32 *)&(AdcBasePtr->STAW2R);
506 #endif /* ADC_STAW2R_AWDE */
507 #ifdef ADC_STAW4R_AWDE
508         STAW4RAddr = (volatile uint32 *)&(AdcBasePtr->STAW4R);
509         STAW5RAddr = (volatile uint32 *)&(AdcBasePtr->STAW5R);
510 #endif /* ADC_STAW4R_AWDE */
511     }
512 
513 #ifdef ADC_STAW0R_AWDE
514     /* Configure the self-test watchdog threshold for S0 algorithm */
515     *STAW0RAddr &= ~(ADC_STAW0R_THRH_MASK | ADC_STAW0R_THRL_MASK);
516     *STAW0RAddr |= ADC_STAW0R_THRH(SelfTestThresholdConfig->AdcSTAW0RHighVal) | ADC_STAW0R_THRL(SelfTestThresholdConfig->AdcSTAW0RLowVal);
517 #endif /* ADC_STAW0R_AWDE */
518 
519 #ifdef ADC_STAW1R_AWDE
520     /* Configure the self-test watchdog threshold for S1 algorithm */
521     *STAW1RAddr &= ~(ADC_STAW1R_THRL_MASK);
522     *STAW1RAddr |= ADC_STAW1R_THRL(SelfTestThresholdConfig->AdcSTAW1RLowVal);
523 #endif /* ADC_STAW1R_AWDE */
524 #ifdef ADC_STAW1AR_AWDE
525     /* Configure the self-test watchdog threshold for S1 algorithm */
526     *STAW1ARAddr &= ~(ADC_STAW1AR_THRH_MASK | ADC_STAW1AR_THRL_MASK);
527     *STAW1ARAddr |= ADC_STAW1AR_THRH(SelfTestThresholdConfig->AdcSTAW1ARHighVal) | ADC_STAW1AR_THRL(SelfTestThresholdConfig->AdcSTAW1ARLowVal);
528     *STAW1BRAddr &= ~(ADC_STAW1BR_THRH_MASK | ADC_STAW1BR_THRL_MASK);
529     *STAW1BRAddr |= ADC_STAW1BR_THRH(SelfTestThresholdConfig->AdcSTAW1BRHighVal) | ADC_STAW1BR_THRL(SelfTestThresholdConfig->AdcSTAW1BRLowVal);
530 #endif /* ADC_STAW1AR_AWDE */
531 
532 #ifdef ADC_STAW2R_AWDE
533     /* Configure the self-test watchdog threshold for S2 algorithm */
534     *STAW2RAddr &= ~(ADC_STAW2R_THRL_MASK);
535     *STAW2RAddr |= ADC_STAW2R_THRL(SelfTestThresholdConfig->AdcSTAW2RLowVal);
536 #endif /* ADC_STAW2R_AWDE */
537 
538 #ifdef ADC_STAW4R_AWDE
539     /* Configure the self-test watchdog threshold for C algorithm */
540     *STAW4RAddr &= ~(ADC_STAW4R_THRH_MASK | ADC_STAW4R_THRL_MASK);
541     *STAW4RAddr |= ADC_STAW4R_THRH(SelfTestThresholdConfig->AdcSTAW4RHighVal) | ADC_STAW4R_THRL(SelfTestThresholdConfig->AdcSTAW4RLowVal);
542     *STAW5RAddr &= ~(ADC_STAW5R_THRH_MASK | ADC_STAW5R_THRL_MASK);
543     *STAW5RAddr |= ADC_STAW5R_THRH(SelfTestThresholdConfig->AdcSTAW5RHighVal) | ADC_STAW5R_THRL(SelfTestThresholdConfig->AdcSTAW5RLowVal);
544 #endif /* ADC_STAW4R_AWDE */
545 }
546 
547 /*FUNCTION*********************************************************************
548  *
549  * Function Name : Adc_Sar_EnableSelftestThreshold
550  * Description   : Enable self-test threshold
551  *
552  *END*************************************************************************/
Adc_Sar_EnableSelftestThreshold(const uint32 Instance)553 static inline void Adc_Sar_EnableSelftestThreshold(const uint32 Instance)
554 {
555     ADC_Type * AdcBasePtr = NULL_PTR;
556 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
557     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
558 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
559 #ifdef ADC_STAW0R_AWDE
560     volatile uint32 * STAW0RAddr = NULL_PTR;
561 #endif /* ADC_STAW0R_AWDE */
562 #ifdef ADC_STAW1R_AWDE
563     volatile uint32 * STAW1RAddr = NULL_PTR;
564 #endif /* ADC_STAW1R_AWDE */
565 #ifdef ADC_STAW1AR_AWDE
566     volatile uint32 * STAW1ARAddr = NULL_PTR;
567 #endif /* ADC_STAW1AR_AWDE */
568 #ifdef ADC_STAW2R_AWDE
569     volatile uint32 * STAW2RAddr = NULL_PTR;
570 #endif /* ADC_STAW2R_AWDE */
571 #ifdef ADC_STAW4R_AWDE
572     volatile uint32 * STAW4RAddr = NULL_PTR;
573 #endif /* ADC_STAW4R_AWDE */
574 
575 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
576     if (Instance >= ADC_INSTANCE_COUNT)
577     {
578         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
579 #ifdef ADC_STAW0R_AWDE
580         STAW0RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW0R);
581 #endif /* ADC_STAW0R_AWDE */
582 #ifdef ADC_STAW1R_AWDE
583         STAW1RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1R);
584 #endif /* ADC_STAW1R_AWDE */
585 #ifdef ADC_STAW1AR_AWDE
586         STAW1ARAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1AR);
587 #endif /* ADC_STAW1AR_AWDE */
588 #ifdef ADC_STAW2R_AWDE
589         STAW2RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW2R);
590 #endif /* ADC_STAW2R_AWDE */
591 #ifdef ADC_STAW4R_AWDE
592         STAW4RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW4R);
593 #endif /* ADC_STAW4R_AWDE */
594     }
595     else
596 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
597     {
598         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
599 #ifdef ADC_STAW0R_AWDE
600         STAW0RAddr = (volatile uint32 *)&(AdcBasePtr->STAW0R);
601 #endif /* ADC_STAW0R_AWDE */
602 #ifdef ADC_STAW1R_AWDE
603         STAW1RAddr = (volatile uint32 *)&(AdcBasePtr->STAW1R);
604 #endif /* ADC_STAW1R_AWDE */
605 #ifdef ADC_STAW1AR_AWDE
606         STAW1ARAddr = (volatile uint32 *)&(AdcBasePtr->STAW1AR);
607 #endif /* ADC_STAW1AR_AWDE */
608 #ifdef ADC_STAW2R_AWDE
609         STAW2RAddr = (volatile uint32 *)&(AdcBasePtr->STAW2R);
610 #endif /* ADC_STAW2R_AWDE */
611 #ifdef ADC_STAW4R_AWDE
612         STAW4RAddr = (volatile uint32 *)&(AdcBasePtr->STAW4R);
613 #endif /* ADC_STAW4R_AWDE */
614     }
615 
616 #ifdef ADC_STAW0R_AWDE
617     /* Enable the self-test watchdog threshold for S0 algorithm */
618     *STAW0RAddr |= ADC_STAW0R_AWDE(0x1UL);
619 #endif /* ADC_STAW0R_AWDE */
620 
621 #ifdef ADC_STAW1R_AWDE
622     /* Enable the self-test watchdog threshold for S1 algorithm */
623     *STAW1RAddr |= ADC_STAW1R_AWDE(0x1UL);
624 #endif /* ADC_STAW1R_AWDE */
625 #ifdef ADC_STAW1AR_AWDE
626     /* Enable the self-test watchdog threshold for S1 algorithm */
627     *STAW1ARAddr |= ADC_STAW1AR_AWDE(0x1UL);
628 #endif /* ADC_STAW1AR_AWDE */
629 
630 #ifdef ADC_STAW2R_AWDE
631     /* Enable the self-test watchdog threshold for S2 algorithm */
632     *STAW2RAddr |= ADC_STAW2R_AWDE(0x1UL);
633 #endif /* ADC_STAW2R_AWDE */
634 
635 #ifdef ADC_STAW4R_AWDE
636     /* Enable the self-test watchdog threshold for C algorithm */
637     *STAW4RAddr |= ADC_STAW4R_AWDE(0x1UL);
638 #endif /* ADC_STAW4R_AWDE */
639 }
640 
641 /*FUNCTION*********************************************************************
642  *
643  * Function Name : Adc_Sar_DisableSelftestThreshold
644  * Description   : Disable self-test threshold
645  *
646  *END*************************************************************************/
Adc_Sar_DisableSelftestThreshold(const uint32 Instance)647 static inline void Adc_Sar_DisableSelftestThreshold(const uint32 Instance)
648 {
649     ADC_Type * AdcBasePtr = NULL_PTR;
650 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
651     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
652 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
653 #ifdef ADC_STAW0R_AWDE
654     volatile uint32 * STAW0RAddr = NULL_PTR;
655 #endif /* ADC_STAW0R_AWDE */
656 #ifdef ADC_STAW1R_AWDE
657     volatile uint32 * STAW1RAddr = NULL_PTR;
658 #endif /* ADC_STAW1R_AWDE */
659 #ifdef ADC_STAW1AR_AWDE
660     volatile uint32 * STAW1ARAddr = NULL_PTR;
661 #endif /* ADC_STAW1AR_AWDE */
662 #ifdef ADC_STAW2R_AWDE
663     volatile uint32 * STAW2RAddr = NULL_PTR;
664 #endif /* ADC_STAW2R_AWDE */
665 #ifdef ADC_STAW4R_AWDE
666     volatile uint32 * STAW4RAddr = NULL_PTR;
667 #endif /* ADC_STAW4R_AWDE */
668 
669 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
670     if (Instance >= ADC_INSTANCE_COUNT)
671     {
672         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
673 #ifdef ADC_STAW0R_AWDE
674         STAW0RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW0R);
675 #endif /* ADC_STAW0R_AWDE */
676 #ifdef ADC_STAW1R_AWDE
677         STAW1RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1R);
678 #endif /* ADC_STAW1R_AWDE */
679 #ifdef ADC_STAW1AR_AWDE
680         STAW1ARAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW1AR);
681 #endif /* ADC_STAW1AR_AWDE */
682 #ifdef ADC_STAW2R_AWDE
683         STAW2RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW2R);
684 #endif /* ADC_STAW2R_AWDE */
685 #ifdef ADC_STAW4R_AWDE
686         STAW4RAddr = (volatile uint32 *)&(AdcAEBasePtr->STAW4R);
687 #endif /* ADC_STAW4R_AWDE */
688     }
689     else
690 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
691     {
692         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
693 #ifdef ADC_STAW0R_AWDE
694         STAW0RAddr = (volatile uint32 *)&(AdcBasePtr->STAW0R);
695 #endif /* ADC_STAW0R_AWDE */
696 #ifdef ADC_STAW1R_AWDE
697         STAW1RAddr = (volatile uint32 *)&(AdcBasePtr->STAW1R);
698 #endif /* ADC_STAW1R_AWDE */
699 #ifdef ADC_STAW1AR_AWDE
700         STAW1ARAddr = (volatile uint32 *)&(AdcBasePtr->STAW1AR);
701 #endif /* ADC_STAW1AR_AWDE */
702 #ifdef ADC_STAW2R_AWDE
703         STAW2RAddr = (volatile uint32 *)&(AdcBasePtr->STAW2R);
704 #endif /* ADC_STAW2R_AWDE */
705 #ifdef ADC_STAW4R_AWDE
706         STAW4RAddr = (volatile uint32 *)&(AdcBasePtr->STAW4R);
707 #endif /* ADC_STAW4R_AWDE */
708     }
709 
710 #ifdef ADC_STAW0R_AWDE
711     /* Disable the self-test watchdog threshold for S0 algorithm */
712     *STAW0RAddr &= ~(ADC_STAW0R_AWDE_MASK);
713 #endif /* ADC_STAW0R_AWDE */
714 #ifdef ADC_STAW1R_AWDE
715     /* Disable the self-test watchdog threshold for S1 algorithm */
716     *STAW1RAddr &= ~(ADC_STAW1R_AWDE_MASK);
717 #endif /* ADC_STAW1R_AWDE */
718 #ifdef ADC_STAW1AR_AWDE
719     /* Enable the self-test watchdog threshold for S1 algorithm */
720     *STAW1ARAddr &= ~(ADC_STAW1AR_AWDE_MASK);
721 #endif /* ADC_STAW1AR_AWDE */
722 #ifdef ADC_STAW2R_AWDE
723     /* Disable the self-test watchdog threshold for S2 algorithm */
724     *STAW2RAddr &= ~(ADC_STAW2R_AWDE_MASK);
725 #endif /* ADC_STAW2R_AWDE */
726 #ifdef ADC_STAW4R_AWDE
727     /* Disable the self-test watchdog threshold for C algorithm */
728     *STAW4RAddr &= ~(ADC_STAW4R_AWDE_MASK);
729 #endif /* ADC_STAW4R_AWDE */
730 }
731 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
732 
733 /*FUNCTION*********************************************************************
734  *
735  * Function Name : Adc_Sar_GetMaskedResult
736  * Description   : Returns result masked accordingly with alignment
737  *
738  *END*************************************************************************/
Adc_Sar_GetMaskedResult(const uint32 Instance,const uint32 Cdr)739 static inline uint16 Adc_Sar_GetMaskedResult(const uint32 Instance,
740                                              const uint32 Cdr)
741 {
742     uint32 CdrMask;
743     uint16 Result;
744 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
745     uint8 Resolution;
746     uint32 ResolutionMask;
747     uint8 ResolutionShift;
748 #else
749     uint8 Resolution = ADC_SAR_IP_MAX_RESOLUTION;
750 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
751 
752 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
753     if (FALSE == Adc_Sar_Ip_axAdcSarState[Instance].BypassResolution)
754     {
755         Resolution = Adc_Sar_GetResolution(Instance);
756     }
757     else
758     {
759         Resolution = ADC_SAR_IP_RESULT_RESOLUTION;
760     }
761 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
762 
763     /* If the result is left aligned, adjust register mask accordingly */
764     if (Adc_Sar_Ip_axAdcSarState[Instance].DataAlign == ADC_SAR_IP_DATA_ALIGNED_LEFT)
765     {
766         /* Assumption: the width of the register is less than 16 */
767         CdrMask = (uint32)ADC_CDR_CDATA_MASK << (16u - Resolution);
768         Result = ((uint16)(Cdr & CdrMask)) >> (16u - Resolution + ADC_CDR_CDATA_SHIFT);
769     }
770 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
771     else
772     {
773         ResolutionMask = (uint32)ADC_CDR_CDATA_MASK << (ADC_SAR_IP_RESULT_RESOLUTION - Resolution);
774         ResolutionShift = ADC_SAR_IP_RESULT_RESOLUTION - Resolution + ADC_CDR_CDATA_SHIFT;
775         CdrMask = ((uint32)ADC_CDR_CDATA_MASK >> 1u) & ResolutionMask;
776         Result = ((uint16)(Cdr & CdrMask)) >> ResolutionShift;
777     }
778 #else
779     else
780     {
781         CdrMask = (uint32)ADC_CDR_CDATA_MASK;
782         Result = ((uint16)(Cdr & CdrMask)) >> ADC_CDR_CDATA_SHIFT;
783     }
784 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
785     return Result;
786 }
787 
788 
789 /*FUNCTION*********************************************************************
790  *
791  * Function Name : Adc_Sar_GetMsrFlags
792  * Description   : Returns the flag status from MSR register
793  *
794  *END*************************************************************************/
Adc_Sar_GetMsrFlags(const uint32 Instance)795 static inline uint32 Adc_Sar_GetMsrFlags(const uint32 Instance)
796 {
797     uint32 Msr = 0U;
798     uint32 Flags = 0U;
799     const ADC_Type * AdcBasePtr = NULL_PTR;
800 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
801     const SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
802 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
803 
804 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
805     if (Instance >= ADC_INSTANCE_COUNT)
806     {
807         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
808         Msr = AdcAEBasePtr->MSR;
809     }
810     else
811 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
812     {
813         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
814         Msr = AdcBasePtr->MSR;
815     }
816 
817 #if FEATURE_ADC_HAS_CALIBRATION
818     Flags |= ((Msr & ADC_MSR_CALIBRTD_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_CALIBRATED : 0U;
819 #endif /* FEATURE_ADC_HAS_CALIBRATION */
820     Flags |= ((Msr & ADC_MSR_NSTART_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_NORMAL_STARTED : 0U;
821     Flags |= ((Msr & ADC_MSR_JABORT_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_INJECTED_ABORTED : 0U;
822     Flags |= ((Msr & ADC_MSR_JSTART_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_INJECTED_STARTED : 0U;
823 #if ADC_SAR_IP_HAS_CTU
824 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
825     if (ADC_SAR_IP_INST_HAS_CTU(Instance))
826     {
827 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
828         Flags |= ((Msr & ADC_MSR_CTUSTART_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_CTU_STARTED : 0U;
829 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
830     }
831 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
832 #endif /* ADC_SAR_IP_HAS_CTU */
833     Flags |= ((Msr & ADC_MSR_ACKO_MASK) != 0U) ? ADC_SAR_IP_STATUS_FLAG_AUTOCLOCKOFF : 0U;
834 
835     return Flags;
836 }
837 
838 /*FUNCTION*********************************************************************
839  *
840  * Function Name : Adc_Sar_GetIsrFlags
841  * Description   : Returns the flag status from ISR register
842  *
843  *END*************************************************************************/
Adc_Sar_GetIsrFlags(const uint32 Instance)844 static inline uint32 Adc_Sar_GetIsrFlags(const uint32 Instance)
845 {
846     uint32 Flags = 0U;
847     uint32 Isr = 0U;
848     const ADC_Type * AdcBasePtr = NULL_PTR;
849 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
850     const SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
851 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
852 
853 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
854     if (Instance >= ADC_INSTANCE_COUNT)
855     {
856         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
857         Isr = AdcAEBasePtr->ISR;
858     }
859     else
860 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
861     {
862         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
863         Isr = AdcBasePtr->ISR;
864     }
865     Flags |= ((Isr & ADC_ISR_EOC_MASK) != 0U) ? ADC_SAR_IP_NOTIF_FLAG_NORMAL_EOC : 0U;
866     Flags |= ((Isr & ADC_ISR_ECH_MASK) != 0U) ? ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN : 0U;
867     Flags |= ((Isr & ADC_ISR_JEOC_MASK) != 0U) ? ADC_SAR_IP_NOTIF_FLAG_INJECTED_EOC : 0U;
868     Flags |= ((Isr & ADC_ISR_JECH_MASK) != 0U) ? ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN : 0U;
869 #if ADC_SAR_IP_HAS_CTU
870 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
871     if (ADC_SAR_IP_INST_HAS_CTU(Instance))
872     {
873 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
874         Flags |= ((Isr & ADC_ISR_EOCTU_MASK) != 0U) ? ADC_SAR_IP_NOTIF_FLAG_CTU_EOC : 0U;
875 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
876     }
877 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
878 #endif /* ADC_SAR_IP_HAS_CTU */
879 
880     return Flags;
881 }
882 
883 #if ADC_SAR_IP_HAS_ADCLKSEL
884 /*FUNCTION*********************************************************************
885  *
886  * Function Name : Adc_Sar_GetADCLKSELValue
887  * Description   : This function returns the value that ADCLKSEL field should
888  * have based on the input parameter.
889  *
890  *END*************************************************************************/
Adc_Sar_GetADCLKSELValue(Adc_Sar_Ip_ClockSelType ClockSel)891 static inline uint32 Adc_Sar_GetADCLKSELValue(Adc_Sar_Ip_ClockSelType ClockSel)
892 {
893 #if ADC_SAR_IP_HAS_CLKSEL_EXTENDED
894     return ADC_MCR_ADCLKSEL(ClockSel);
895 #else
896     uint32 Temp = 0u;
897     switch (ClockSel)
898     {
899         case ADC_SAR_IP_CLK_FULL_BUS:
900             /* Full bus clock when MCR[ADCLKSEL] = 1 */
901             Temp = ADC_MCR_ADCLKSEL(1U);
902             break;
903         case ADC_SAR_IP_CLK_HALF_BUS:
904             /* Half bus clock when MCR[ADCLKSEL] = 0 */
905             break;
906         default:
907             /* no-op */
908             break;
909     }
910     return Temp;
911 #endif /* ADC_SAR_IP_HAS_CLKSEL_EXTENDED */
912 }
913 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
914 
915 /*FUNCTION*********************************************************************
916  *
917  * Function Name : Adc_Sar_CollectMcrMasks
918  * Description   : The function collects the mask for MCR register from provided
919  * structure. The funcion is used to reduce the complexity of Adc_Sar_Ip_Init()
920  *
921  *END*************************************************************************/
Adc_Sar_CollectMcrMasks(const uint32 Instance,const Adc_Sar_Ip_ConfigType * const Config,uint32 InitialMcr)922 static inline uint32 Adc_Sar_CollectMcrMasks(const uint32 Instance,
923                                              const Adc_Sar_Ip_ConfigType * const Config,
924                                              uint32 InitialMcr)
925 {
926     uint32 Mcr = InitialMcr;
927 
928     Mcr &= ~(ADC_MCR_MODE_MASK);
929     Mcr |= ADC_MCR_MODE(Config->ConvMode);
930 #if ADC_SAR_IP_HAS_ADCLKSEL
931     Mcr &= ~(ADC_MCR_ADCLKSEL_MASK);
932     Mcr |= Adc_Sar_GetADCLKSELValue(Config->ClkSelect);
933 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
934     Mcr &= ~(ADC_MCR_ACKO_MASK);
935     Mcr |= Adc_Sar_GetValueFromBool(Config->AutoClockOff, ADC_MCR_ACKO_MASK, 0U);
936     Mcr &= ~(ADC_MCR_OWREN_MASK);
937     Mcr |= Adc_Sar_GetValueFromBool(Config->OverwriteEnable, ADC_MCR_OWREN_MASK, 0U);
938     Mcr &= ~(ADC_MCR_WLSIDE_MASK);
939     Mcr |= ADC_MCR_WLSIDE(Config->DataAlign);
940 
941 #if ADC_SAR_IP_HAS_CTU
942 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
943     if (ADC_SAR_IP_INST_HAS_CTU(Instance))
944     {
945 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
946         Mcr &= ~(ADC_MCR_CTUEN_MASK | ADC_MCR_CTU_MODE_MASK); /* Clear CTU_MODE bit of MCR*/
947 
948         switch (Config->CtuMode)
949         {
950             case ADC_SAR_IP_CTU_MODE_CONTROL:
951                 Mcr |= ADC_MCR_CTUEN(1U); /* Enable CTU */
952                 break;
953 #if ADC_SAR_IP_HAS_CTU_TRIGGER_MODE
954             case ADC_SAR_IP_CTU_MODE_TRIGGER:
955                 Mcr |= ADC_MCR_CTU_MODE(1U); /* Set CTU to Trigger Mode CTU_MODE = 1 */
956                 Mcr |= ADC_MCR_CTUEN(1U); /* Enable CTU */
957                 break;
958 #endif /* ADC_SAR_IP_HAS_CTU_TRIGGER_MODE */
959             case ADC_SAR_IP_CTU_MODE_DISABLED:
960                 /* CTU is disabled (CTUEN = 0 and CTU_MODE = 0) */
961                 /* Pass through */
962             default:
963                 ; /* no-op */
964                 break;
965         }
966 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
967     }
968 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
969 #endif /* ADC_SAR_IP_HAS_CTU */
970 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
971 #if FEATURE_ADC_HAS_INJ_EXT_TRIGGER
972     switch (Config->InjectedEdge)
973     {
974         case ADC_SAR_IP_EXT_TRIG_EDGE_FALLING:
975             /* Already on falling edge JEDGE = 0 */
976             Mcr &= ~(ADC_MCR_JTRGEN_MASK);
977             Mcr |= ADC_MCR_JTRGEN_MASK; /* enable Injected trigger */
978             break;
979         case ADC_SAR_IP_EXT_TRIG_EDGE_RISING:
980             /* Enable Injected trigger and set to rising edge JEDGE = 1 */
981             Mcr &= ~(ADC_MCR_JEDGE_MASK | ADC_MCR_JTRGEN_MASK);
982             Mcr |= (ADC_MCR_JEDGE_MASK | ADC_MCR_JTRGEN_MASK);
983             break;
984         case ADC_SAR_IP_EXT_TRIG_EDGE_DISABLED:
985             /* Already set to injected trigger disabled (JTRGEN = 0 and JEDGE = 0) */
986         default:
987             ; /* no-op */
988             break;
989     }
990 #endif /* FEATURE_ADC_HAS_INJ_EXT_TRIGGER */
991 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
992 
993 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
994 #if FEATURE_ADC_HAS_EXT_TRIGGER
995     /* Get normal trigger masks */
996     Mcr &= ~(ADC_MCR_EDGE_MASK);
997     Mcr |= (Config->ExtTrigger == ADC_SAR_IP_EXT_TRIG_EDGE_RISING) ? (ADC_MCR_EDGE(1U)) : 0U;
998     if (Config->ExtTrigger != ADC_SAR_IP_EXT_TRIG_EDGE_DISABLED)
999     {
1000         Mcr &= ~(ADC_MCR_TRGEN_MASK);
1001         Mcr |= Adc_Sar_GetValueFromBool(Config->NormalExtTrgEn, ADC_MCR_TRGEN_MASK, 0U);
1002 #if FEATURE_ADC_HAS_AUX_EXT_TRIGGER
1003         Mcr &= ~(ADC_MCR_XSTRTEN_MASK);
1004         Mcr |= Adc_Sar_GetValueFromBool(Config->NormalAuxExtTrgEn, ADC_MCR_XSTRTEN_MASK, 0U);
1005 #endif /* FEATURE_ADC_HAS_AUX_EXT_TRIGGER */
1006     }
1007 #endif /* FEATURE_ADC_HAS_EXT_TRIGGER */
1008 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
1009 
1010 #if FEATURE_ADC_HAS_AVERAGING
1011     Mcr &= ~(ADC_MCR_AVGEN_MASK);
1012     Mcr |= Adc_Sar_GetValueFromBool(Config->AvgEn, ADC_MCR_AVGEN_MASK, 0U);
1013     Mcr &= ~(ADC_MCR_AVGS_MASK);
1014     Mcr |= ADC_MCR_AVGS(Config->AvgSel);
1015 #else
1016 #if FEATURE_ADC_HAS_CALIBRATION
1017     /* On platforms that use AVGEN only for calibration, reset to default value */
1018     Mcr |= ADC_MCR_AVGEN_MASK;
1019 #endif /* FEATURE_ADC_HAS_CALIBRATION */
1020 #endif /* FEATURE_ADC_HAS_AVERAGING */
1021 
1022 #if FEATURE_ADC_HAS_CALIBRATION
1023 #if ADC_SAR_IP_CALIBRATION_USES_MCR
1024     /* Reset NRSMPL to default value */
1025     Mcr &= ~(ADC_MCR_NRSMPL_MASK);
1026     Mcr |= ADC_MCR_NRSMPL_MASK;
1027 #endif /* ADC_SAR_IP_CALIBRATION_USES_MCR */
1028 #endif /* FEATURE_ADC_HAS_CALIBRATION */
1029 
1030     return Mcr;
1031 }
1032 
1033 
1034 /*FUNCTION*********************************************************************
1035  *
1036  * Function Name : Adc_Sar_ConfigChannels
1037  * Description   : Configure a list of channels by enabling channel notifications
1038  * and setting presampling.
1039  *END*************************************************************************/
Adc_Sar_ConfigChannels(const uint32 Instance,const Adc_Sar_Ip_ChanConfigType * ChannelConfigsPtr,uint8 NumChannels)1040 static inline void Adc_Sar_ConfigChannels(const uint32 Instance,
1041                                           const Adc_Sar_Ip_ChanConfigType * ChannelConfigsPtr,
1042                                           uint8 NumChannels)
1043 {
1044     uint8 Index;
1045     uint32 VectAdr;
1046     uint32 VectBit;
1047 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1048     uint32 CimrMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1049 #else
1050     const uint32 CimrMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1051 #endif
1052 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1053     uint32 CwenrMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1054 #else
1055     const uint32 CwenrMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1056 #endif
1057     uint32 DmarMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1058 #if FEATURE_ADC_HAS_PRESAMPLING
1059     uint32 PsrMask[ADC_SAR_IP_NUM_GROUP_CHAN] = ADC_SAR_IP_NUM_GROUP_CHAN_INIT_VAL;
1060 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
1061     const Adc_Sar_Ip_ChanConfigType * ChnConfig;
1062 
1063     ADC_Type * AdcBasePtr = NULL_PTR;
1064 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1065     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1066 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1067 
1068     for (Index = 0U; Index < NumChannels; Index++)
1069     {
1070         ChnConfig = &(ChannelConfigsPtr[Index]);
1071 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1072         /* Each CWSELR register contains 8 watchdog selections according to 8 channels
1073            Each watchdog selection possibly needs maximum 4 bits for setting
1074            This is to calculate the CWSELR register index and position of channel on that register */
1075         VectAdr = (uint32)ChnConfig->ChanIndex / 8U;
1076         VectBit = (uint32)ChnConfig->ChanIndex % 8U;
1077 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
1078         if (ADC_SAR_IP_INST_HAS_CWSELRn(Instance, VectAdr))
1079         {
1080 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
1081             Adc_Sar_WriteChannelMapping(Instance, VectAdr, VectBit, ChnConfig->WdgThreshRegIndex);
1082             /* Store threshold register index for configured channel */
1083             Adc_Sar_Ip_axAdcSarState[Instance].ChanWdgThresholdIndex[ChnConfig->ChanIndex] = ChnConfig->WdgThreshRegIndex;
1084 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
1085         }
1086 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
1087 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1088 
1089         VectAdr = ADC_SAR_IP_CHAN_2_VECT((uint32)ChnConfig->ChanIndex);
1090         VectBit = ADC_SAR_IP_CHAN_2_BIT((uint32)ChnConfig->ChanIndex);
1091         /* Collect bit-mask for WDG, EOC, DMA and Presample */
1092 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1093         CimrMask[VectAdr]  |= Adc_Sar_GetValueFromBool(ChnConfig->EndOfConvNotification, (1UL << VectBit), 0UL);
1094 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1095 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1096         CwenrMask[VectAdr] |= Adc_Sar_GetValueFromBool(ChnConfig->WdgNotificationEn, (1UL << VectBit), 0UL);
1097 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1098         DmarMask[VectAdr]  |= Adc_Sar_GetValueFromBool(ChnConfig->EndOfConvDmaEnable, (1UL << VectBit), 0UL);
1099 #if FEATURE_ADC_HAS_PRESAMPLING
1100         PsrMask[VectAdr]   |= Adc_Sar_GetValueFromBool(ChnConfig->PresamplingEnable, (1UL << VectBit), 0UL);
1101 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
1102     }
1103 
1104     /* Enable WDG, EOC, DMA and Presample */
1105     for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
1106     {
1107 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1108         if (Instance >= ADC_INSTANCE_COUNT)
1109         {
1110             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1111             CIMR(AdcAEBasePtr, Index) = CimrMask[Index];
1112             CWENR(AdcAEBasePtr, Index) = CwenrMask[Index];
1113             DMAR(AdcAEBasePtr, Index) = DmarMask[Index];
1114 #if FEATURE_ADC_HAS_PRESAMPLING
1115             PSR(AdcAEBasePtr, Index) = PsrMask[Index];
1116 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
1117         }
1118         else
1119 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1120         {
1121             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1122             CIMR(AdcBasePtr, Index) = CimrMask[Index];
1123             CWENR(AdcBasePtr, Index) = CwenrMask[Index];
1124             DMAR(AdcBasePtr, Index) = DmarMask[Index];
1125 #if FEATURE_ADC_HAS_PRESAMPLING
1126             PSR(AdcBasePtr, Index) = PsrMask[Index];
1127 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
1128         }
1129     }
1130 }
1131 
1132 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
1133 /*FUNCTION*********************************************************************
1134  *
1135  * Function Name : Adc_Sar_CheckSelfTestProgress
1136  * Description   : Configures watchdog threshold with provided array of configuration
1137  *
1138  *END*************************************************************************/
Adc_Sar_CheckSelfTestProgress(const uint32 Instance)1139 static inline Adc_Sar_Ip_StatusType Adc_Sar_CheckSelfTestProgress(const uint32 Instance)
1140 {
1141     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
1142     uint32 Reg = 0U;
1143     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
1144     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
1145     uint32 ElapsedTicks;
1146     volatile const uint32 * MSRAddr = NULL_PTR;
1147     volatile const uint32 * STSR1Addr = NULL_PTR;
1148     uint8 Index;
1149 
1150     const ADC_Type * AdcBasePtr = NULL_PTR;
1151 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1152     const SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1153 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1154 
1155 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1156     if (Instance >= ADC_INSTANCE_COUNT)
1157     {
1158         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1159         MSRAddr = (volatile const uint32 *)&(AdcAEBasePtr->MSR);
1160         STSR1Addr = &(AdcAEBasePtr->STSR1);
1161     }
1162     else
1163 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1164     {
1165         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1166         MSRAddr = (volatile const uint32 *)&(AdcBasePtr->MSR);
1167         STSR1Addr = &(AdcBasePtr->STSR1);
1168     }
1169 
1170     /*  Each for loop checks the conversion of all steps in self-test S algorithm
1171     *   ForLoop(0): while (AlgS-start-1) ->S0 -> S1 -> S2 -> while (Alg-end-1) -> C0 to C11 ->
1172     *   ForLoop(1): while (AlgS-start-2) ->S0 -> S1 -> S2 -> while (Alg-end-2)
1173     */
1174     for (Index = 0U; Index < 2U; Index++)
1175     {
1176         /* Wait until Alg S has started*/
1177         ElapsedTicks = 0U;
1178         while ((((*MSRAddr) & ADC_MSR_SELF_TEST_S_MASK) != ADC_MSR_SELF_TEST_S_MASK) && (ElapsedTicks < TimeoutTicks))
1179         {
1180             ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
1181         }
1182         if (ElapsedTicks >= TimeoutTicks)
1183         {
1184             Status = ADC_SAR_IP_STATUS_TIMEOUT;
1185         }
1186         if (Status == ADC_SAR_IP_STATUS_SUCCESS)
1187         {
1188             /* Wait until Alg S has finished*/
1189             ElapsedTicks = 0U;
1190             while ((((*MSRAddr) & ADC_MSR_SELF_TEST_S_MASK) == ADC_MSR_SELF_TEST_S_MASK) && (ElapsedTicks < TimeoutTicks))
1191             {
1192                 ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
1193             }
1194             if (ElapsedTicks >= TimeoutTicks)
1195             {
1196                 Status = ADC_SAR_IP_STATUS_TIMEOUT;
1197             }
1198         }
1199         if (Status == ADC_SAR_IP_STATUS_TIMEOUT)
1200         {
1201             /* Break the loop if timeout occured in order to increase performance */
1202             break;
1203         }
1204     }
1205 
1206     if (Status != ADC_SAR_IP_STATUS_TIMEOUT)
1207     {
1208         Reg |= ADC_STSR1_ERR_S0_MASK;
1209 #if (defined(ADC_STSR1_ERR_S1_MASK) || defined(ADC_STSR1_ERR_S2_MASK) || defined(ADC_STSR1_ERR_C_MASK))
1210         Reg |= ADC_STSR1_ERR_S1_MASK | ADC_STSR1_ERR_S2_MASK | ADC_STSR1_ERR_C_MASK;
1211 #endif
1212         if (((*STSR1Addr) & Reg) != 0UL)
1213         {
1214             Status = ADC_SAR_IP_STATUS_ERROR;
1215         }
1216     }
1217 
1218     return Status;
1219 }
1220 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
1221 /*FUNCTION*********************************************************************
1222  *
1223  * Function Name : Adc_Sar_GetConvResults
1224  * Description   : Reads the conversion results to output arrays
1225  * Params:
1226  *  - Instance : the ADC Instance to read
1227  *  - ChainType : the conversion chain (Normal, Injected or CTU)
1228  *  - ResultsRaw : an uint16 array to write only conversion data
1229  *  - ResultsStruct : an Adc_Sar_Ip_ChanResultType array to write detailed information
1230                       about each conversion result
1231  *  - length : the maximum size of ResultsRaw and ResultsStruct
1232  *
1233  * ResultsRaw or ResultsStruct can be NULL, but not both, as the function will
1234  * have nowhere to write the results.
1235  *
1236  *END*************************************************************************/
Adc_Sar_GetConvResults(const uint32 Instance,const Adc_Sar_Ip_ConvChainType ChainType,uint16 * const ResultsRaw,Adc_Sar_Ip_ChanResultType * const ResultsStruct,const uint32 Length)1237 static uint32 Adc_Sar_GetConvResults(const uint32 Instance,
1238                                      const Adc_Sar_Ip_ConvChainType ChainType,
1239                                      uint16 * const ResultsRaw,
1240                                      Adc_Sar_Ip_ChanResultType * const ResultsStruct,
1241                                      const uint32 Length)
1242 {
1243     uint32 Index = 0u;
1244     boolean LengthExceeded = FALSE;
1245     ADC_Type * AdcBasePtr = NULL_PTR;
1246 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1247     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1248 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1249     uint32 VectAdr;
1250     uint32 VectBit;
1251     uint8 ChnIdx;
1252     uint32 Cdr;
1253     volatile uint32 * CEOCFRAddr = NULL_PTR;
1254     const uint16 AdcChanCount[ADC_SAR_IP_INSTANCE_COUNT][ADC_SAR_IP_NUM_GROUP_CHAN] = FEATURE_ADC_MAX_CHN_COUNT;
1255 
1256 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1257     if (Instance >= ADC_INSTANCE_COUNT)
1258     {
1259         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1260     }
1261     else
1262 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1263     {
1264         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1265     }
1266 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
1267     /* ResultsRaw and ResultsStruct cannot be both NULL */
1268     DevAssert((ResultsRaw != NULL_PTR) || (ResultsStruct != NULL_PTR));
1269 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
1270 
1271     /* Go through each channel group */
1272     for (VectAdr = 0u; VectAdr < Adc_Sar_Ip_au8AdcGroupCount[Instance]; VectAdr++)
1273     {
1274 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1275         if (Instance >= ADC_INSTANCE_COUNT)
1276         {
1277             CEOCFRAddr = &(CEOCFR(AdcAEBasePtr, VectAdr));
1278         }
1279         else
1280 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1281         {
1282             CEOCFRAddr = &(CEOCFR(AdcBasePtr, VectAdr));
1283         }
1284         /* go through each bit in the group, check if there is a completed conversion */
1285         for (VectBit = 0u; VectBit < AdcChanCount[Instance][VectAdr]; VectBit++)
1286         {
1287             ChnIdx = (uint8)((VectAdr * 32u) + VectBit);
1288 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
1289             if ((0u == ChnIdx) && ((ADC_SAR_IP_CONV_CHAIN_INJECTED == ChainType) || (ADC_SAR_IP_CONV_CHAIN_CTU == ChainType)))
1290             {
1291                 continue;
1292             }
1293 #endif /* FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND */
1294 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
1295             if (!(ADC_SAR_IP_INST_HAS_CDRn(Instance, ChnIdx)))
1296             {
1297                 continue; /* skip if the CDR register is not available */
1298             }
1299 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
1300 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1301             if (Instance >= ADC_INSTANCE_COUNT)
1302             {
1303                 Cdr = CDR_AE(AdcAEBasePtr, ChnIdx);
1304             }
1305             else
1306 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1307             {
1308                 Cdr = CDR(AdcBasePtr, ChnIdx);
1309             }
1310 
1311             if ((ADC_CDR_RESULT((uint32)ChainType) | ADC_CDR_VALID_MASK) == (Cdr & (ADC_CDR_RESULT_MASK | ADC_CDR_VALID_MASK)))
1312             {
1313                 /* if the result type matches the one request by ChainType
1314                    and the data is valid, write to the output array(s)
1315                 */
1316                 if (ResultsRaw != NULL_PTR)
1317                 {
1318                     ResultsRaw[Index] = Adc_Sar_GetMaskedResult(Instance, Cdr);
1319                 }
1320                 if (ResultsStruct != NULL_PTR)
1321                 {
1322                     ResultsStruct[Index].ConvData = Adc_Sar_GetMaskedResult(Instance, Cdr);
1323                     ResultsStruct[Index].AdcChnIdx = ChnIdx;
1324                     ResultsStruct[Index].ValidFlag = ((Cdr & ADC_CDR_VALID_MASK) != 0U) ? TRUE : FALSE;
1325                     ResultsStruct[Index].OverWrittenFlag = ((Cdr & ADC_CDR_OVERW_MASK) != 0U) ? TRUE : FALSE;
1326                 }
1327                 /* Increment the current Index and reset the CEOCFR flag */
1328                 *CEOCFRAddr = ((uint32)1UL << VectBit); /* w1c bit */
1329                 Index++;
1330                 if (Index >= Length)
1331                 {
1332                     /* We have filled the output buffer, exit the loop.
1333                      * Data may still exist in the result registers, which won't be reached.
1334                      */
1335                     LengthExceeded = TRUE;
1336                     break;
1337                 }
1338             }
1339         }
1340         if (LengthExceeded)
1341         {
1342             break;
1343         }
1344     }
1345     return Index;
1346 }
1347 
1348 /*FUNCTION*********************************************************************
1349  *
1350  * Function Name : Adc_Sar_ResetWdog
1351  * Description   : Reset and disable the Analog Watchdog feature
1352  *
1353  *END*************************************************************************/
Adc_Sar_ResetWdog(const uint32 Instance)1354 static void Adc_Sar_ResetWdog(const uint32 Instance)
1355 {
1356     uint8 Index;
1357     uint8 MaxThresholdRegs = 0U;
1358 
1359     ADC_Type * AdcBasePtr = NULL_PTR;
1360 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1361     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1362 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1363 
1364 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1365     if (Instance >= ADC_INSTANCE_COUNT)
1366     {
1367         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1368         MaxThresholdRegs = ADC_SAR_AE_IP_THRHLR_COUNT;
1369     }
1370     else
1371 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1372     {
1373         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1374         MaxThresholdRegs = ADC_SAR_IP_THRHLR_COUNT;
1375     }
1376 
1377     for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
1378     {
1379 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1380         if (Instance >= ADC_INSTANCE_COUNT)
1381         {
1382             CWENR(AdcAEBasePtr, Index) = 0u;
1383             AWORR(AdcAEBasePtr, Index) = 0xFFFFFFFFu; /* w1c bits */
1384         }
1385         else
1386 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1387         {
1388             CWENR(AdcBasePtr, Index) = 0u;
1389             AWORR(AdcBasePtr, Index) = 0xFFFFFFFFu; /* w1c bits */
1390         }
1391 
1392     }
1393 
1394     for (Index = 0u; Index < MaxThresholdRegs; Index++)
1395     {
1396         Adc_Sar_WriteThresholds(Instance, Index, 0xFFFFu, 0u);
1397     }
1398 
1399     for (Index = 0u; Index < ADC_SAR_IP_CWSELR_COUNT; Index++)
1400     {
1401 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
1402         if (!(ADC_SAR_IP_INST_HAS_CWSELRn(Instance, Index)))
1403         {
1404             continue; /* skip register if it's not available */
1405         }
1406 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
1407         Adc_Sar_ResetWdogCWSELR(Instance, Index);
1408     }
1409 }
1410 
1411 #if FEATURE_ADC_HAS_CLOCK_DIVIDER
1412 /*FUNCTION*********************************************************************
1413  *
1414  * Function Name : Adc_Sar_EnableClkDiv
1415  * Description   : Configure clock divider
1416  *
1417  *END*************************************************************************/
Adc_Sar_EnableClkDiv(const uint32 Instance,const boolean ClkDivEnable)1418 static inline void Adc_Sar_EnableClkDiv(const uint32 Instance,
1419                                         const boolean ClkDivEnable)
1420 {
1421     ADC_Type * const AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1422 
1423     /* Enable clock divider */
1424     if (ClkDivEnable)
1425     {
1426         AdcBasePtr->CLKDIV_CTRL |= ADC_CLKDIV_CTRL_CLKDIV_ENABLE(1U);
1427     }
1428     else
1429     {
1430         AdcBasePtr->CLKDIV_CTRL &= ~(ADC_CLKDIV_CTRL_CLKDIV_ENABLE_MASK);
1431     }
1432 }
1433 #endif /* FEATURE_ADC_HAS_CLOCK_DIVIDER */
1434 
1435 #if ( \
1436      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || (STD_ON == ADC_SAR_IP_JECH_ENABLED) || \
1437      ((ADC_SAR_IP_HAS_CTU == 1U) && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED)) \
1438     )
1439 /*FUNCTION*********************************************************************
1440  *
1441  * Function Name : Adc_Sar_CheckAndCallNotification
1442  * Description   : Checks if the given callback is not NULL then calls it
1443  *
1444  *END*************************************************************************/
Adc_Sar_CheckAndCallNotification(void (* Callback)(void))1445 static inline void Adc_Sar_CheckAndCallNotification(void (*Callback)(void))
1446 {
1447     if (Callback != NULL_PTR)
1448     {
1449         Callback();
1450     }
1451 }
1452 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) .. */
1453 
1454 #if (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED))
Adc_Sar_CheckAndCallEoctuNotification(const uint32 Instance)1455 static inline void Adc_Sar_CheckAndCallEoctuNotification(const uint32 Instance)
1456 {
1457     volatile const uint32 * CIMRBaseAddr;
1458     volatile uint32 * CEOCFBaseRAddr;
1459     volatile uint32 * ISRAddr;
1460     uint32 Imr;  /* Interrupt mask */
1461     uint32 Cimr; /* Channel Interrupt Mask */
1462     uint32 Ceocfr; /* Channel Pending Flag*/
1463     uint32 ChannelValidMask;
1464     boolean ValidInterrupt = FALSE;
1465     uint32 GroupIdx;
1466     ADC_Type * AdcBasePtr;
1467 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1468     SAR_ADC_AE_Type * AdcAEBasePtr;
1469 
1470     if (Instance >= ADC_INSTANCE_COUNT)
1471     {
1472         AdcAEBasePtr   = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1473         CEOCFBaseRAddr = &(CEOCFR(AdcAEBasePtr, 0U));
1474         CIMRBaseAddr   = &(CIMR(AdcAEBasePtr,   0U));
1475         ISRAddr        = (volatile uint32 *)&(AdcAEBasePtr->ISR);
1476         Imr            = AdcAEBasePtr->IMR;
1477     }
1478     else
1479 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1480     {
1481         AdcBasePtr     = Adc_Sar_Ip_apxAdcBase[Instance];
1482         CEOCFBaseRAddr = &(CEOCFR(AdcBasePtr, 0U));
1483         CIMRBaseAddr   = &(CIMR(AdcBasePtr,   0U));
1484         ISRAddr        = (volatile uint32 *)&(AdcBasePtr->ISR);
1485         Imr            = AdcBasePtr->IMR;
1486     }
1487 
1488     if ( ((*ISRAddr & ADC_ISR_EOCTU_MASK) != 0U) && ((Imr & ADC_IMR_MSKEOCTU_MASK) != 0U) )
1489     {
1490         for (GroupIdx = 0U; GroupIdx < Adc_Sar_Ip_au8AdcGroupCount[Instance]; GroupIdx++)
1491         {
1492             ChannelValidMask = Adc_Sar_Ip_au32AdcChanBitmap[Instance][GroupIdx];
1493             /* Read channels interrupt mask and status in this group */
1494             Cimr             = CIMRBaseAddr[GroupIdx] & ChannelValidMask;
1495             Ceocfr           = CEOCFBaseRAddr[GroupIdx] & ChannelValidMask;
1496             /* CPR_RTD_00644: Check if the interrupt is spurious or not (both enabled and flag bits are set) */
1497             if ((Ceocfr & Cimr) != 0U)
1498             {
1499                 /* Clears flag by w1c */
1500                 CEOCFBaseRAddr[GroupIdx] = Ceocfr;
1501                 ValidInterrupt = TRUE;
1502                 /* Continue to check and clear pending flags for the rest of channel groups.
1503                    Because the EOC events of channels might be consecutively issued very fast.
1504                    For instance:
1505                      - While ISR handler is processing EOC event of a channel
1506                      - other channels might complete their conversions and raise the interrupt requests.
1507                    Therefore, we should clear all the individual channel flags (CEOCFR) along with the CTU flag ISR[EOCTU].
1508                 */
1509             }
1510         }
1511 
1512         if (ValidInterrupt)
1513         {
1514             /* CPR_RTD_00644 */
1515             *ISRAddr = ADC_ISR_EOCTU_MASK;
1516             Adc_Sar_CheckAndCallNotification(Adc_Sar_Ip_axAdcSarState[Instance].EndOfCtuConversionNotification);
1517         }
1518     }
1519 }
1520 #endif /* (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
1521 
1522 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1523 /*FUNCTION*********************************************************************
1524  *
1525  * Function Name : Adc_Sar_CheckAndCallEocNotification
1526  * Description   : Checks if the given channel interrupt was triggered, clears
1527  *                 the interrupt, check if it is not spurious, checks that the
1528  *                 callback is not null.
1529  *
1530  *END*************************************************************************/
Adc_Sar_CheckAndCallEocNotification(uint32 Instance,uint16 ChanIdx,uint16 VectAdr,uint32 EocFlag,boolean * CeocfrFlag)1531 static inline void Adc_Sar_CheckAndCallEocNotification(uint32 Instance,
1532                                                        uint16 ChanIdx,
1533                                                        uint16 VectAdr,
1534                                                        uint32 EocFlag,
1535                                                        boolean * CeocfrFlag)
1536 {
1537     ADC_Type * AdcBasePtr = NULL_PTR;
1538 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1539     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1540 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1541     const uint32 Mask = (uint32)1UL << ADC_SAR_IP_CHAN_2_BIT(ChanIdx);
1542     uint32 Ceocfr = 0U;
1543     uint32 Cimr   = 0U;
1544     volatile uint32 * CEOCFRAddr = NULL_PTR;
1545 
1546 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1547     if (Instance >= ADC_INSTANCE_COUNT)
1548     {
1549         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1550         CEOCFRAddr = &(CEOCFR(AdcAEBasePtr, VectAdr));
1551         Cimr   = (CIMR(AdcAEBasePtr, VectAdr) & Mask);
1552     }
1553     else
1554 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1555     {
1556         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1557         CEOCFRAddr = &(CEOCFR(AdcBasePtr, VectAdr));
1558         Cimr   = (CIMR(AdcBasePtr, VectAdr) & Mask);
1559     }
1560 
1561     Ceocfr = ((*CEOCFRAddr) & Mask);
1562     /* Check if the interrupt was not spurious */
1563     if ((Ceocfr != 0U) && (Cimr != 0U) && (EocFlag != 0U))
1564     {
1565         /* Clears flag by w1c */
1566         *CEOCFRAddr = Mask;
1567         *CeocfrFlag = TRUE;
1568 
1569         /* Check if the callback is not null */
1570         if (Adc_Sar_Ip_axAdcSarState[Instance].EndOfConvNotification != NULL_PTR)
1571         {
1572             Adc_Sar_Ip_axAdcSarState[Instance].EndOfConvNotification(ChanIdx);
1573         }
1574     }
1575 }
1576 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1577 
1578 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1579 /*FUNCTION*********************************************************************
1580  *
1581  * Function Name : Adc_Sar_CheckAndCallWorrNotification
1582  * Description   : Checks if the given channel interrupt was triggered, clears
1583  *                 the interrupt, check if it is not spurious, checks that the
1584  *                 callback is not null and return WTISR flag
1585  *                 in order to be cleared outside of this function when loop of all channels is completed.
1586  *
1587  *END*************************************************************************/
Adc_Sar_CheckAndCallWorrNotification(uint32 Instance,uint16 ChanIdx,uint16 VectAdr)1588 static inline uint32 Adc_Sar_CheckAndCallWorrNotification(uint32 Instance,
1589                                                           uint16 ChanIdx,
1590                                                           uint16 VectAdr)
1591 {
1592     ADC_Type * AdcBasePtr = NULL_PTR;
1593 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1594     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1595 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1596     const uint32 Mask = (uint32)1UL << ADC_SAR_IP_CHAN_2_BIT(ChanIdx);
1597     uint32 Aworr = 0U;
1598     uint32 Cwenr = 0U;
1599     uint32 Wtisr = 0U;
1600     uint32 Wtimr = 0U;
1601     uint32 WdgFlags = 0U;
1602     /* Use 16-bit width instead of 32-bit to avoid CWE INTEGER_OVERFLOW when performing multiplication in macros ADC_SAR_IP_WDG_REG_MASK below */
1603     uint16 ThresholdIndex;
1604     volatile uint32 * AWORRAddr;
1605 
1606 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1607     if (Instance >= ADC_INSTANCE_COUNT)
1608     {
1609         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1610         AWORRAddr = &(AWORR(AdcAEBasePtr, VectAdr));
1611         Cwenr = (CWENR(AdcAEBasePtr, VectAdr) & Mask);
1612         Wtisr = AdcAEBasePtr->WTISR;
1613         Wtimr = AdcAEBasePtr->WTIMR;
1614     }
1615     else
1616 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1617     {
1618         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1619         AWORRAddr = &(AWORR(AdcBasePtr, VectAdr));
1620         Cwenr = (CWENR(AdcBasePtr, VectAdr) & Mask);
1621         Wtisr = AdcBasePtr->WTISR;
1622         Wtimr = AdcBasePtr->WTIMR;
1623     }
1624     Aworr = ((*AWORRAddr) & Mask);
1625 
1626     /* Check if wdg channel enabled associated to the wdg out of range flag */
1627     if ((Aworr != 0U) && (Cwenr != 0U))
1628     {
1629         /* Get the mapping threshold register index corresponding to the configured channel */
1630         ThresholdIndex = (uint16)(Adc_Sar_Ip_axAdcSarState[Instance].ChanWdgThresholdIndex[ChanIdx]);
1631 
1632         /* Check if the high/low flags were not set spuriously. */
1633         if ((Wtimr & (ADC_SAR_IP_WDG_REG_MASK_LOW(ThresholdIndex))) != 0u)
1634         {
1635             WdgFlags |= ((Wtisr & ADC_SAR_IP_WDG_REG_MASK_LOW(ThresholdIndex)) != 0u) ? ADC_SAR_IP_WDG_LOW_FLAG : 0u;
1636         }
1637         if ((Wtimr & (ADC_SAR_IP_WDG_REG_MASK_HIGH(ThresholdIndex))) != 0u)
1638         {
1639             WdgFlags |= ((Wtisr & ADC_SAR_IP_WDG_REG_MASK_HIGH(ThresholdIndex)) != 0u) ? ADC_SAR_IP_WDG_HIGH_FLAG : 0u;
1640         }
1641         if (WdgFlags != 0u)
1642         {
1643             /* Only clear relevant flags if interrupt is not spurious (i.e: satisfy combination of AWORR-CWENR and WTISR-WTIMR) */
1644             *AWORRAddr = Mask;
1645             /* Multiple ADC channels can use same THRHLRx so return the associated WTISR flag value of that threshold
1646                 which will be used for clearing all WTISR flags outside of this function, when completing the loop for ADC channels */
1647             WdgFlags = (uint32)(WdgFlags << (ThresholdIndex << 1U));
1648             /* Check if the callback is not null */
1649             if (Adc_Sar_Ip_axAdcSarState[Instance].WdgOutOfRangeNotification != NULL_PTR)
1650             {
1651                 Adc_Sar_Ip_axAdcSarState[Instance].WdgOutOfRangeNotification(ChanIdx, WdgFlags);
1652             }
1653         }
1654     }
1655 
1656     return WdgFlags;
1657 }
1658 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1659 
1660 #if ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED))
1661 /*LOCAL FUNCTION*********************************************************************
1662  *
1663  * Function Name : Adc_CheckAndCallAllChannelNotification
1664  * Description   : Check for all watchdog interrupts and for all individual channel interrupts
1665  * if it was detected. And then call the appropriate notification
1666  *
1667  *END*********************************************************************************/
Adc_CheckAndCallAllChannelNotification(const uint32 Instance)1668 static inline void Adc_CheckAndCallAllChannelNotification(const uint32 Instance)
1669 {
1670     ADC_Type * AdcBasePtr = NULL_PTR;
1671 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1672     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1673 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1674     uint16 VectAdr;
1675     uint16 PhyChan;
1676     uint16 ChanCnt;
1677     const uint16 AdcChanCount[ADC_SAR_IP_INSTANCE_COUNT][ADC_SAR_IP_NUM_GROUP_CHAN] = FEATURE_ADC_MAX_CHN_COUNT;
1678 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1679     uint32 WtisrMask = 0U;
1680     volatile uint32 * WTISRAddr = NULL_PTR;
1681 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1682 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1683     volatile const uint32 * IMRAddr = NULL_PTR;
1684     volatile uint32 * ISRAddr = NULL_PTR;
1685     uint32 EocFlag = 0U;
1686     boolean CeocfrFlag = FALSE;
1687 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1688 
1689 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1690     if (Instance >= ADC_INSTANCE_COUNT)
1691     {
1692         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1693 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1694         IMRAddr = (volatile uint32 *)&(AdcAEBasePtr->IMR);
1695         ISRAddr = (volatile uint32 *)&(AdcAEBasePtr->ISR);
1696 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1697 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1698         WTISRAddr = (volatile uint32 *)&(AdcAEBasePtr->WTISR);
1699 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1700     }
1701     else
1702 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1703     {
1704         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1705 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1706         IMRAddr = (volatile uint32 *)&(AdcBasePtr->IMR);
1707         ISRAddr = (volatile uint32 *)&(AdcBasePtr->ISR);
1708 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1709 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1710         WTISRAddr = (volatile uint32 *)&(AdcBasePtr->WTISR);
1711 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1712     }
1713 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1714     /* EocFlag = 0 if all EOC flags are spurious interrupts */
1715     /* Avoid Compiler Warning about accessing two volatile variables simultaneously */
1716     EocFlag  = (*IMRAddr);
1717     EocFlag &= (*ISRAddr);
1718     EocFlag &= (ADC_ISR_EOC_MASK | ADC_ISR_JEOC_MASK);
1719 
1720     /* Clear EOC Flag */
1721     if (EocFlag != 0)
1722     {
1723         *ISRAddr = EocFlag;
1724     }
1725 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1726 
1727     for (VectAdr = 0U; VectAdr < Adc_Sar_Ip_au8AdcGroupCount[Instance]; VectAdr++)
1728     {
1729         for (ChanCnt = 0U; ChanCnt < AdcChanCount[Instance][VectAdr]; ChanCnt++)
1730         {
1731             PhyChan = (ChanCnt + (uint16)(ADC_SAR_IP_HW_REG_SIZE * VectAdr));
1732 
1733 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
1734             /* Check end of conversion interrupt */
1735             Adc_Sar_CheckAndCallEocNotification(Instance, PhyChan, VectAdr, EocFlag, &CeocfrFlag);
1736 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
1737 
1738 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1739             /* Check watchdog out of range interrupt */
1740             WtisrMask |= Adc_Sar_CheckAndCallWorrNotification(Instance, PhyChan, VectAdr);
1741 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1742         }
1743     }
1744 
1745 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
1746     if (WtisrMask != 0U)
1747     {
1748         *WTISRAddr = WtisrMask;
1749     }
1750 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
1751 }
1752 #endif /* ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
1753 
1754 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
1755 #if (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER)
1756 /*FUNCTION**********************************************************************
1757 *
1758 * Function Name : Adc_Sar_ConfigExternalTrigger
1759 * Description   : This function configures the external trigger.
1760 *
1761 * END**************************************************************************/
Adc_Sar_ConfigExternalTrigger(const uint32 Instance,const Adc_Sar_Ip_ExtTriggerEdgeType TriggerEdge,const uint32 TrgEdgeSetMask,const uint32 TrgEdgeClrMask,const uint32 TrigSrcMask)1762 static inline void Adc_Sar_ConfigExternalTrigger(const uint32 Instance,
1763                                                  const Adc_Sar_Ip_ExtTriggerEdgeType TriggerEdge,
1764                                                  const uint32 TrgEdgeSetMask,
1765                                                  const uint32 TrgEdgeClrMask,
1766                                                  const uint32 TrigSrcMask)
1767 {
1768     ADC_Type * AdcBasePtr = NULL_PTR;
1769 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1770     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1771 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1772     volatile uint32 * MCRAddr = NULL_PTR;
1773 
1774 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
1775     /* calibration must not be interrupted */
1776     if(FALSE == Adc_Sar_Ip_axAdcSarState[Instance].CalibrationOnGoing)
1777 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
1778     {
1779 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1780         if (Instance >= ADC_INSTANCE_COUNT)
1781         {
1782             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1783             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
1784         }
1785         else
1786 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1787         {
1788             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1789             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
1790         }
1791         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_21();
1792 
1793         switch (TriggerEdge)
1794         {
1795             case ADC_SAR_IP_EXT_TRIG_EDGE_FALLING:
1796                 *MCRAddr &= ~TrgEdgeSetMask;  /* set to falling edge 0 */
1797                 *MCRAddr |= TrigSrcMask;    /* enable external trigger */
1798                 break;
1799             case ADC_SAR_IP_EXT_TRIG_EDGE_RISING:
1800                 /* enable external trigger and set to rising edge EDGE = 1 */
1801                 *MCRAddr |= (TrgEdgeSetMask | TrigSrcMask);
1802                 break;
1803             case ADC_SAR_IP_EXT_TRIG_EDGE_DISABLED:
1804                 /* disable external trigger and reset edge field */
1805                 *MCRAddr &= ~(TrgEdgeClrMask | TrigSrcMask);
1806                 break;
1807             default:
1808                 ; /* no-op */
1809                 break;
1810         }
1811     }
1812     SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_21();
1813 }
1814 #endif /* (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER) */
1815 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
1816 
1817 #if ADC_SAR_IP_HAS_TEMPSENSE_CHN
1818 #if (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON)
1819 /*FUNCTION**********************************************************************
1820  *
1821  * Function Name : Adc_Sar_TempsenseConvFp2Int
1822  * Description   : The function converts the number in signed fixed point format
1823  * (1,11,4) to the integer number multipled with ADC_SAR_IP_TEMPSENSE_MULTIPLIER to avoid
1824  * rounding the decimal part.
1825  *
1826  *END**************************************************************************/
Adc_Sar_TempsenseConvFp2Int(const uint32 FloatingPoint)1827 static inline uint32 Adc_Sar_TempsenseConvFp2Int(const uint32 FloatingPoint)
1828 {
1829     uint32 RetVal;
1830 
1831     /* The integer and decimal part multiple with ADC_SAR_IP_TEMPSENSE_MULTIPLIER to avoid rounding the decimal part */
1832     RetVal  = ((FloatingPoint & ADC_SAR_IP_TEMPSENSE_INTEGER_MASK) >> ADC_SAR_IP_TEMPSENSE_INTEGER_SHIFT) * ADC_SAR_IP_TEMPSENSE_MULTIPLIER;
1833     RetVal += ((FloatingPoint & ADC_SAR_IP_TEMPSENSE_DECIMAL_MASK) * ADC_SAR_IP_TEMPSENSE_MULTIPLIER) / (ADC_SAR_IP_TEMPSENSE_DECIMAL_MASK + 1U);
1834 
1835     return RetVal;
1836 }
1837 
1838 /*FUNCTION**********************************************************************
1839  *
1840  * Function Name : Adc_Sar_TempsenseConvInt2Fp
1841  * Description   : The function converts the number in integer number to signed fixed
1842  * point format (1,11,4). The integer number parameter is multipled with ADC_SAR_IP_TEMPSENSE_MULTIPLIER
1843  *
1844  *END**************************************************************************/
Adc_Sar_TempsenseConvInt2Fp(const sint32 SignedInteger)1845 static inline uint16 Adc_Sar_TempsenseConvInt2Fp(const sint32 SignedInteger)
1846 {
1847     uint16 RetVal;
1848     uint32 Temp;
1849 
1850     if (SignedInteger < 0)
1851     {
1852         RetVal = ADC_SAR_IP_TEMPSENSE_SIGN_MASK;
1853         Temp = (uint32)(- SignedInteger);
1854     }
1855     else
1856     {
1857         RetVal = 0U;
1858         Temp = (uint32)SignedInteger;
1859     }
1860 
1861     /* Calculates the integer part */
1862     RetVal |= (uint16)(((Temp / ADC_SAR_IP_TEMPSENSE_MULTIPLIER) << ADC_SAR_IP_TEMPSENSE_INTEGER_SHIFT) & ADC_SAR_IP_TEMPSENSE_INTEGER_MASK);
1863     /* Calculates the decimal part */
1864     RetVal |= (uint16)(((Temp % ADC_SAR_IP_TEMPSENSE_MULTIPLIER) * (ADC_SAR_IP_TEMPSENSE_DECIMAL_MASK + 1U)) / ADC_SAR_IP_TEMPSENSE_MULTIPLIER);
1865 
1866     return RetVal;
1867 }
1868 #endif /* (ADC_SAR_IP_TEMPSENSE_ENABLED == STD_ON) */
1869 #endif /* ADC_SAR_IP_HAS_TEMPSENSE_CHN */
1870 
1871 /*FUNCTION*********************************************************************
1872  *
1873  * Function Name : Adc_Sar_Ip_IRQHandler
1874  * Description   : Handles Adc Sar interrupts
1875  *
1876  * @implements     Adc_Sar_Ip_IRQHandler_Activity
1877  *END*************************************************************************/
Adc_Sar_Ip_IRQHandler(const uint32 Instance)1878 void Adc_Sar_Ip_IRQHandler(const uint32 Instance)
1879 {
1880     ADC_Type * AdcBasePtr = NULL_PTR;
1881 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1882     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1883 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1884     volatile uint32 * ISRAddr = NULL_PTR;
1885     volatile uint32 * WTISRAddr = NULL_PTR;
1886     uint32 Isr = 0u;
1887     uint32 Wtisr = 0u;
1888 #if ((ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || \
1889      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || \
1890      (STD_ON == ADC_SAR_IP_JECH_ENABLED))
1891     uint32 Imr = 0u;
1892 #endif /* (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || ... */
1893 
1894 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
1895     DevAssert(Instance < ADC_SAR_IP_INSTANCE_COUNT);
1896 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
1897 
1898 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1899     if (Instance >= ADC_INSTANCE_COUNT)
1900     {
1901         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1902         ISRAddr = (volatile uint32 *)&(AdcAEBasePtr->ISR);
1903         WTISRAddr = (volatile uint32 *)&(AdcAEBasePtr->WTISR);
1904 #if ((ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || \
1905      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || \
1906      (STD_ON == ADC_SAR_IP_JECH_ENABLED))
1907         Imr = AdcAEBasePtr->IMR;
1908 #endif /* (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || ... */
1909     }
1910     else
1911 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1912     {
1913         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1914         ISRAddr = (volatile uint32 *)&(AdcBasePtr->ISR);
1915         WTISRAddr = (volatile uint32 *)&(AdcBasePtr->WTISR);
1916 #if ((ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || \
1917      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || \
1918      (STD_ON == ADC_SAR_IP_JECH_ENABLED))
1919         Imr = AdcBasePtr->IMR;
1920 #endif /* (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) || ... */
1921     }
1922 
1923     /* CPR_RTD_00011 */
1924     if (Adc_Sar_Ip_axAdcSarState[Instance].InitStatus)
1925     {
1926         /* Check which interrupt was triggered and not spurious, clear it and call the associated callback */
1927 #if (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED))
1928         Adc_Sar_CheckAndCallEoctuNotification(Instance);
1929 #endif /* (ADC_SAR_IP_HAS_CTU && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) && (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
1930 #if (STD_ON == ADC_SAR_IP_ECH_ENABLED)
1931         if ((((*ISRAddr) & ADC_ISR_ECH_MASK) != 0U) && ((Imr & ADC_IMR_MSKECH_MASK) != 0U))
1932         {
1933             /* CPR_RTD_00644 */
1934             *ISRAddr = ADC_ISR_ECH_MASK;
1935             Adc_Sar_CheckAndCallNotification(Adc_Sar_Ip_axAdcSarState[Instance].EndOfNormalChainNotification);
1936         }
1937 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) */
1938 #if (STD_ON == ADC_SAR_IP_JECH_ENABLED)
1939         if ((((*ISRAddr) & ADC_ISR_JECH_MASK) != 0U) && ((Imr & ADC_IMR_MSKJECH_MASK)!= 0U))
1940         {
1941             /* CPR_RTD_00644 */
1942             *ISRAddr = ADC_ISR_JECH_MASK;
1943             Adc_Sar_CheckAndCallNotification(Adc_Sar_Ip_axAdcSarState[Instance].EndOfInjectedChainNotification);
1944         }
1945 #endif /* (STD_ON == ADC_SAR_IP_JECH_ENABLED) */
1946 
1947 #if ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED))
1948         Adc_CheckAndCallAllChannelNotification(Instance);
1949 #endif /* ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
1950     }
1951     else
1952     {
1953         /* CPR_RTD_00011 */
1954         Isr = *ISRAddr;
1955         *ISRAddr = Isr;
1956 
1957         Wtisr = *WTISRAddr;
1958         *WTISRAddr = Wtisr;
1959     }
1960 }
1961 
1962 /*FUNCTION**********************************************************************
1963  *
1964  * Function Name : Adc_Sar_SetNormalChain
1965  * Description   : This function configures the ADC Normal Chain.
1966  *
1967  *END**************************************************************************/
Adc_Sar_SetNormalChain(const uint32 Instance,const uint32 * const Mask)1968 static inline void Adc_Sar_SetNormalChain(const uint32 Instance,
1969                                           const uint32 * const Mask)
1970 {
1971     uint8 Index;
1972 
1973     ADC_Type * AdcBasePtr = NULL_PTR;
1974 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1975     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
1976 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1977 
1978 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
1979     if (Instance >= ADC_INSTANCE_COUNT)
1980     {
1981         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
1982         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
1983         {
1984             NCMR(AdcAEBasePtr, Index) = Mask[Index];
1985         }
1986     }
1987     else
1988 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
1989     {
1990         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
1991         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
1992         {
1993             NCMR(AdcBasePtr, Index) = Mask[Index];
1994         }
1995     }
1996 }
1997 
1998 /*FUNCTION**********************************************************************
1999  *
2000  * Function Name : Adc_Sar_SetInjectedChain
2001  * Description   : This function configures the ADC Injected Chain.
2002  *
2003  *END**************************************************************************/
Adc_Sar_SetInjectedChain(const uint32 Instance,const uint32 * const Mask)2004 static inline void Adc_Sar_SetInjectedChain(const uint32 Instance,
2005                                             const uint32 * const Mask)
2006 {
2007     uint8 Index;
2008 
2009     ADC_Type * AdcBasePtr = NULL_PTR;
2010 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2011     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2012 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2013 
2014 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2015     if (Instance >= ADC_INSTANCE_COUNT)
2016     {
2017         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
2018         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
2019         {
2020             JCMR(AdcAEBasePtr, Index) = Mask[Index];
2021         }
2022     }
2023     else
2024 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2025     {
2026         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
2027         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[Instance]; Index++)
2028         {
2029             JCMR(AdcBasePtr, Index) = Mask[Index];
2030         }
2031     }
2032 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
2033     JCMR(AdcBasePtr, 0) |= ADC_JCMR0_CH0_MASK;
2034 #endif /* FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND */
2035 }
2036 
2037 /*FUNCTION**********************************************************************
2038  *
2039  * Function Name : Adc_Sar_GetValueFromBool
2040  * Description   : The function is used to reduce complexity for parent function
2041  *
2042  *END**************************************************************************/
Adc_Sar_GetValueFromBool(const boolean bVal,const uint32 TrueVal,const uint32 FalseVal)2043 static inline uint32 Adc_Sar_GetValueFromBool(const boolean bVal,
2044                                               const uint32 TrueVal,
2045                                               const uint32 FalseVal)
2046 {
2047     return ((TRUE == bVal) ? TrueVal : FalseVal);
2048 }
2049 #if FEATURE_ADC_HAS_CALIBRATION
2050 /*FUNCTION**********************************************************************
2051  *
2052  * Function Name : Adc_Sar_CalibrationClkSelect
2053  * Description   : This function configures ADC clock for calibration.
2054  *
2055  *END**************************************************************************/
2056 
Adc_Sar_CalibrationClkSelect(const uint32 u32Instance,volatile uint32 * MCRAddr,uint32 * McrSavedValue)2057 static inline Adc_Sar_Ip_StatusType Adc_Sar_CalibrationClkSelect(const uint32 u32Instance, volatile uint32 * MCRAddr, uint32 * McrSavedValue)
2058 {
2059     uint32 Mcr;
2060     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
2061 
2062     /* Set CLKSEL to CalibrationClkSelect value */
2063     Status = Adc_Sar_Ip_Powerdown(u32Instance);
2064     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
2065     {
2066         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_12();
2067         *McrSavedValue = *MCRAddr;
2068         Mcr = *MCRAddr;
2069 #if ADC_SAR_IP_HAS_ADCLKSEL
2070         Mcr &= ~(ADC_MCR_ADCLKSEL_MASK);
2071         Mcr |= Adc_Sar_GetADCLKSELValue(Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationClkSelect);
2072 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
2073 
2074         /* Disable AutoClockOff */
2075         Mcr &= ~(ADC_MCR_ACKO_MASK);
2076         *MCRAddr = Mcr;
2077         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_12();
2078 
2079         Status = Adc_Sar_Ip_Powerup(u32Instance);
2080 
2081     }
2082     return Status;
2083 }
2084 
2085 /*FUNCTION**********************************************************************
2086  *
2087  * Function Name : Adc_Sar_CalibrationClkRestore
2088  * Description   : This function restore ADC clock after calibration.
2089  *
2090  *END**************************************************************************/
Adc_Sar_CalibrationClkRestore(const uint32 u32Instance,volatile uint32 * MCRAddr,uint32 McrSavedValue)2091 static inline Adc_Sar_Ip_StatusType Adc_Sar_CalibrationClkRestore(const uint32 u32Instance, volatile uint32 * MCRAddr, uint32 McrSavedValue)
2092 {
2093     uint32 Mcr;
2094     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
2095 
2096 #if ADC_SAR_IP_HAS_ADCLKSEL
2097         /* Restore state of ADCLKSEL  */
2098     uint32 AdcClkSel = McrSavedValue & ADC_MCR_ADCLKSEL_MASK;
2099 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
2100 
2101     /* Restore state of ADCKO */
2102     uint32 AdcAutoClkOff = McrSavedValue & ADC_MSR_ACKO_MASK;
2103 
2104     /* Restore the state of ADCLKSEL */
2105     Status = Adc_Sar_Ip_Powerdown(u32Instance);
2106 
2107     SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_12();
2108     Mcr = *MCRAddr;
2109 #if ADC_SAR_IP_HAS_ADCLKSEL
2110     Mcr &= ~(ADC_MCR_ADCLKSEL_MASK);
2111     Mcr |= AdcClkSel;
2112 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
2113     Mcr |= AdcAutoClkOff;
2114     *MCRAddr = Mcr;
2115     SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_12();
2116 
2117     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
2118     {
2119         Status = Adc_Sar_Ip_Powerup(u32Instance);
2120     }
2121 
2122 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
2123     Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing = FALSE;
2124 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
2125     return Status;
2126 }
2127 #endif /* FEATURE_ADC_HAS_CALIBRATION */
2128 /*==================================================================================================
2129 *                                       GLOBAL FUNCTIONS
2130 ==================================================================================================*/
2131 /*FUNCTION**********************************************************************
2132 *
2133 * Function Name : Adc_Sar_Ip_Init
2134 * Description   : This function initializes the ADC_SAR module by configuring all
2135 * available features.
2136 *
2137 * @implements      Adc_Sar_Ip_Init_Activity
2138 * END**************************************************************************/
Adc_Sar_Ip_Init(const uint32 u32Instance,const Adc_Sar_Ip_ConfigType * const pConfig)2139 Adc_Sar_Ip_StatusType Adc_Sar_Ip_Init(const uint32 u32Instance,
2140                                       const Adc_Sar_Ip_ConfigType * const pConfig)
2141 {
2142     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
2143 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
2144     uint8 Index = 0u;
2145 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
2146     volatile uint32 * MCRAddr = NULL_PTR;
2147     volatile uint32 * PDEDRAddr = NULL_PTR;
2148     volatile uint32 * DMAEAddr = NULL_PTR;
2149 #if FEATURE_ADC_SAR_DECODE_DELAY
2150     volatile uint32 * DSDRAddr = NULL_PTR;
2151 #endif /* FEATURE_ADC_SAR_DECODE_DELAY */
2152 #if FEATURE_ADC_HAS_PRESAMPLING
2153     volatile uint32 * PSCRAddr = NULL_PTR;
2154 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2155 
2156     ADC_Type * AdcBasePtr = NULL_PTR;
2157 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2158     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2159 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2160 
2161 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2162     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2163     DevAssert(pConfig != NULL_PTR);
2164 #if ADC_SAR_IP_HAS_CTU
2165 #if (ADC_SAR_IP_HAS_CTU_TRIGGER_MODE == 0u)
2166     /* test that the feature is enabled only on platforms that have it */
2167     DevAssert(pConfig->CtuMode != ADC_SAR_IP_CTU_MODE_TRIGGER);
2168 #endif /* ADC_SAR_IP_HAS_CTU */
2169 #endif /* (ADC_SAR_IP_HAS_CTU_TRIGGER_MODE == 0u) */
2170 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2171 
2172 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2173     if (u32Instance >= ADC_INSTANCE_COUNT)
2174     {
2175         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2176         MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
2177         PDEDRAddr = (volatile uint32 *)&(AdcAEBasePtr->PDEDR);
2178         DMAEAddr = (volatile uint32 *)&(AdcAEBasePtr->DMAE);
2179 #if FEATURE_ADC_SAR_DECODE_DELAY
2180         DSDRAddr = (volatile uint32 *)&(AdcAEBasePtr->DSDR);
2181 #endif /* FEATURE_ADC_SAR_DECODE_DELAY */
2182 #if FEATURE_ADC_HAS_PRESAMPLING
2183         PSCRAddr = (volatile uint32 *)&(AdcAEBasePtr->PSCR);
2184 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2185     }
2186     else
2187 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2188     {
2189         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2190         MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
2191         PDEDRAddr = (volatile uint32 *)&(AdcBasePtr->PDEDR);
2192         DMAEAddr = (volatile uint32 *)&(AdcBasePtr->DMAE);
2193 #if FEATURE_ADC_SAR_DECODE_DELAY
2194         DSDRAddr = (volatile uint32 *)&(AdcBasePtr->DSDR);
2195 #endif /* FEATURE_ADC_SAR_DECODE_DELAY */
2196 #if FEATURE_ADC_HAS_PRESAMPLING
2197         PSCRAddr = (volatile uint32 *)&(AdcBasePtr->PSCR);
2198 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2199     }
2200 
2201 #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
2202     /* Set the UAA bit in REG_PROT to make the instance accessible in user mode */
2203     OsIf_Trusted_Call1param(Adc_Sar_Ip_SetUserAccessAllowed, u32Instance);
2204 #endif
2205 
2206     /* Stop any conversions, if any */
2207     (void)Adc_Sar_Ip_AbortChain(u32Instance, TRUE, FALSE);
2208 
2209     /* Clear CTUEN to allow Powerdown operation to succeed. */
2210 #if defined(ADC_MCR_CTUEN_MASK)
2211     *MCRAddr &= ~ADC_MCR_CTUEN_MASK;
2212 #endif /* ADC_MCR_CTUEN_MASK */
2213 
2214     /* Clear pending interrupt flags - CPR_RTD_01182 */
2215     Adc_Sar_Ip_ClearStatusFlags(u32Instance, ADC_SAR_IP_NOTIF_FLAG_ALL);
2216 
2217     Status = Adc_Sar_Ip_Powerdown(u32Instance);
2218     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
2219     {
2220         /* Collects the mask and writes MCR mask */
2221         *MCRAddr = Adc_Sar_CollectMcrMasks(u32Instance, pConfig, *MCRAddr);
2222 
2223         Adc_Sar_Ip_axAdcSarState[u32Instance].DataAlign = pConfig->DataAlign;
2224 
2225         Status = Adc_Sar_Ip_Powerup(u32Instance);
2226         if (ADC_SAR_IP_STATUS_SUCCESS == Status)
2227         {
2228             if (ADC_SAR_IP_CTU_MODE_TRIGGER == pConfig->CtuMode)
2229             {
2230                 /* Workaround to enable CTU_MODE because it cannot be written in power-down mode in SAF85 */
2231                 *MCRAddr |= ADC_MCR_CTU_MODE(1U);
2232             }
2233 #if FEATURE_ADC_HAS_HIGH_SPEED_ENABLE
2234             /* Enables high speed conversion or calibration */
2235             Adc_Sar_EnableHighSpeed(AdcBasePtr, pConfig->HighSpeedConvEn);
2236 #endif /* FEATURE_ADC_HAS_HIGH_SPEED_ENABLE */
2237 
2238 #if FEATURE_ADC_HAS_CONVERSION_TIMING
2239             /* Set the sample times for each channnel group */
2240             Adc_Sar_Ip_SetSampleTimes(u32Instance, pConfig->SampleTimeArr);
2241 #endif /* FEATURE_ADC_HAS_CONVERSION_TIMING */
2242 
2243             *PDEDRAddr = ADC_PDEDR_PDED(pConfig->PowerDownDelay);
2244 
2245 #if FEATURE_ADC_HAS_CLOCK_DIVIDER
2246             /* Configure clock divider */
2247             Adc_Sar_EnableClkDiv(u32Instance, pConfig->ClkDivEnable);
2248 #endif /* FEATURE_ADC_HAS_CLOCK_DIVIDER */
2249 
2250 #ifdef ADC_DSDR_DSD
2251 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
2252             if (ADC_SAR_IP_INST_HAS_DSDR(u32Instance))
2253             {
2254 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
2255 #if FEATURE_ADC_SAR_DECODE_DELAY
2256                 *DSDRAddr = ADC_DSDR_DSD(pConfig->DecodeDelay);
2257 #endif /* FEATURE_ADC_SAR_DECODE_DELAY */
2258 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
2259             }
2260 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
2261 #endif /* ADC_DSDR_DSD */
2262 
2263             /* Configure chain conversions */
2264             Adc_Sar_SetNormalChain(u32Instance, pConfig->ChanMaskNormal);
2265             Adc_Sar_SetInjectedChain(u32Instance, pConfig->ChanMaskInjected);
2266 
2267 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
2268             /* Configure resolution */
2269             Adc_Sar_Ip_SetResolution(u32Instance, pConfig->AdcResolution);
2270 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
2271 
2272             /* Configure WDG */
2273 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
2274             if ((pConfig->WdgThresholds != NULL_PTR) && (pConfig->NumWdgThresholds > 0u))
2275             {
2276                 for (Index = 0U; Index < pConfig->NumWdgThresholds; Index++)
2277                 {
2278                     Adc_Sar_Ip_SetWdgThreshold(u32Instance, pConfig->WdgThresholds[Index].WdgIndex, &pConfig->WdgThresholds[Index]);
2279                 }
2280             }
2281 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
2282 
2283 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
2284             if (pConfig->SelfTestThresholdConfig != NULL_PTR)
2285             {
2286                 /* Configure self-test threshold value */
2287                 Adc_Sar_ConfigSelftestThreshold(u32Instance, pConfig->SelfTestThresholdConfig);
2288             }
2289 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
2290 
2291             /* Configure DMA for channels */
2292             *DMAEAddr &= ~(ADC_DMAE_DMAEN_MASK | ADC_DMAE_DCLR_MASK);
2293             if (pConfig->DmaEnable)
2294             {
2295                 *DMAEAddr |= (ADC_DMAE_DMAEN(1U) | ADC_DMAE_DCLR((uint32)pConfig->DmaClearSource));
2296             }
2297 
2298             /* Configure per channel notifications and presampling */
2299             if ((pConfig->ChannelConfigsPtr != NULL_PTR) && (pConfig->NumChannels > 0u))
2300             {
2301                 Adc_Sar_ConfigChannels(u32Instance, pConfig->ChannelConfigsPtr, pConfig->NumChannels);
2302             }
2303 
2304 #if FEATURE_ADC_HAS_PRESAMPLING
2305             /* Configure presampling sources */
2306             *PSCRAddr &= ~(ADC_PSCR_PRECONV_MASK);
2307             *PSCRAddr |= ADC_PSCR_PRECONV(pConfig->BypassSampling ? 1u : 0u);
2308 
2309             Adc_Sar_Ip_SetPresamplingSource(u32Instance, ADC_SAR_IP_CHAN_GROUP_0, pConfig->PresamplingSourceArr[0u]);
2310             Adc_Sar_Ip_SetPresamplingSource(u32Instance, ADC_SAR_IP_CHAN_GROUP_1, pConfig->PresamplingSourceArr[1u]);
2311 #if ADC_SAR_IP_NUM_GROUP_CHAN > 2u
2312             Adc_Sar_Ip_SetPresamplingSource(u32Instance, ADC_SAR_IP_CHAN_GROUP_2, pConfig->PresamplingSourceArr[2u]);
2313 #endif /* ADC_SAR_IP_NUM_GROUP_CHAN > 2u */
2314 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2315 
2316 
2317             /* Add notification callbacks to the state structure */
2318 #if (STD_ON == ADC_SAR_IP_ECH_ENABLED)
2319             Adc_Sar_Ip_axAdcSarState[u32Instance].EndOfNormalChainNotification = pConfig->EndOfNormalChainNotification;
2320 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) */
2321 #if (STD_ON == ADC_SAR_IP_JECH_ENABLED)
2322             Adc_Sar_Ip_axAdcSarState[u32Instance].EndOfInjectedChainNotification = pConfig->EndOfInjectedChainNotification;
2323 #endif /* (STD_ON == ADC_SAR_IP_JECH_ENABLED) */
2324 #if ADC_SAR_IP_HAS_CTU
2325 #if (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)
2326             Adc_Sar_Ip_axAdcSarState[u32Instance].EndOfCtuConversionNotification = pConfig->EndOfCtuConversionNotification;
2327 #endif /* (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) */
2328 #endif /* ADC_SAR_IP_HAS_CTU */
2329 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
2330             Adc_Sar_Ip_axAdcSarState[u32Instance].EndOfConvNotification = pConfig->EndOfConvNotification;
2331 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
2332 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
2333             Adc_Sar_Ip_axAdcSarState[u32Instance].WdgOutOfRangeNotification = pConfig->WdgOutOfRangeNotification;
2334 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
2335 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
2336             Adc_Sar_Ip_axAdcSarState[u32Instance].BypassResolution = pConfig->BypassResolution;
2337 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
2338             Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationClkSelect = pConfig->CalibrationClkSelect;
2339 
2340 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2341             if (u32Instance >= ADC_INSTANCE_COUNT)
2342             {
2343                 /* Configure user gain and offset */
2344                 AdcAEBasePtr->ADC_AE_USER_OFFSET_GAIN_REG = ADC_AE_USER_OFFSET(pConfig->UsrOffset) | ADC_AE_USER_GAIN(pConfig->UsrGain);
2345             }
2346             else
2347 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2348             {
2349                 /* Configure user gain and offset */
2350                 AdcBasePtr->ADC_USER_OFFSET_GAIN_REG = ADC_USER_OFFSET(pConfig->UsrOffset) | ADC_USER_GAIN(pConfig->UsrGain);
2351             }
2352 
2353             /* Mark that the driver was initialized */
2354             Adc_Sar_Ip_axAdcSarState[u32Instance].InitStatus = TRUE;
2355 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
2356             Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing = FALSE;
2357 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
2358         }
2359     }
2360 
2361     return Status;
2362 }
2363 
2364 /*FUNCTION**********************************************************************
2365 *
2366 * Function Name : Adc_Sar_Ip_Deinit
2367 * Description   : This function writes all the internal ADC registers with
2368 *  their Reference Manual reset values.
2369 *
2370 * @implements      Adc_Sar_Ip_DeInit_Activity
2371 * END**************************************************************************/
Adc_Sar_Ip_Deinit(const uint32 u32Instance)2372 Adc_Sar_Ip_StatusType Adc_Sar_Ip_Deinit(const uint32 u32Instance)
2373 {
2374     ADC_Type * AdcBasePtr = NULL_PTR;
2375 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2376     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2377 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2378     uint32 Index;
2379     Adc_Sar_Ip_ConfigType DefaultConfig;
2380     Adc_Sar_Ip_StatusType Status;
2381 
2382 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2383     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2384 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2385 
2386     DefaultConfig.ConvMode = ADC_SAR_IP_CONV_MODE_ONESHOT;
2387     DefaultConfig.ClkSelect = ADC_SAR_IP_CLK_FULL_BUS;
2388     DefaultConfig.CalibrationClkSelect = ADC_SAR_IP_CLK_HALF_BUS;
2389 #if FEATURE_ADC_HAS_HIGH_SPEED_ENABLE
2390     DefaultConfig.HighSpeedConvEn = FALSE;
2391 #endif /* FEATURE_ADC_HAS_HIGH_SPEED_ENABLE */
2392 #if ADC_SAR_IP_HAS_CTU
2393     DefaultConfig.CtuMode = ADC_SAR_IP_CTU_MODE_DISABLED;
2394 #endif /* ADC_SAR_IP_HAS_CTU */
2395 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
2396 #if FEATURE_ADC_HAS_INJ_EXT_TRIGGER
2397     DefaultConfig.InjectedEdge = ADC_SAR_IP_EXT_TRIG_EDGE_DISABLED;
2398 #endif /* FEATURE_ADC_HAS_INJ_EXT_TRIGGER */
2399 #if FEATURE_ADC_HAS_EXT_TRIGGER
2400     DefaultConfig.ExtTrigger = ADC_SAR_IP_EXT_TRIG_EDGE_DISABLED;
2401     DefaultConfig.NormalExtTrgEn = FALSE;
2402 #if FEATURE_ADC_HAS_AUX_EXT_TRIGGER
2403     DefaultConfig.NormalAuxExtTrgEn = FALSE;
2404 #endif /* FEATURE_ADC_HAS_AUX_EXT_TRIGGER */
2405 #endif /* FEATURE_ADC_HAS_EXT_TRIGGER */
2406 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
2407 #if (FEATURE_ADC_HAS_CONVERSION_TIMING || FEATURE_ADC_HAS_PRESAMPLING)
2408     for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
2409     {
2410 #if FEATURE_ADC_HAS_CONVERSION_TIMING
2411 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2412     if (u32Instance >= ADC_INSTANCE_COUNT)
2413     {
2414         DefaultConfig.SampleTimeArr[Index] = ADC_SAR_AE_IP_DEF_SAMPLE_TIME;
2415     }
2416     else
2417 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2418     {
2419         DefaultConfig.SampleTimeArr[Index] = ADC_SAR_IP_DEF_SAMPLE_TIME;
2420     }
2421 #endif /* FEATURE_ADC_HAS_CONVERSION_TIMING */
2422 #if FEATURE_ADC_HAS_PRESAMPLING
2423 #if (ADC_PSCR_PREVAL0_WIDTH > 1u)
2424         DefaultConfig.PresamplingSourceArr[Index] = ADC_SAR_IP_PRESAMPLE_DVDD;
2425 #else
2426         DefaultConfig.PresamplingSourceArr[Index] = ADC_SAR_IP_PRESAMPLE_VREFL;
2427 #endif /* (ADC_PSCR_PREVAL0_WIDTH > 1u) */
2428 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2429     }
2430 #endif /* (FEATURE_ADC_HAS_CONVERSION_TIMING || FEATURE_ADC_HAS_PRESAMPLING) */
2431 #if FEATURE_ADC_HAS_PRESAMPLING
2432     DefaultConfig.BypassSampling = FALSE;
2433 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2434     DefaultConfig.AutoClockOff = FALSE;
2435     DefaultConfig.OverwriteEnable = FALSE;
2436     DefaultConfig.DataAlign = ADC_SAR_IP_DATA_ALIGNED_RIGHT;
2437 #if FEATURE_ADC_SAR_DECODE_DELAY
2438     DefaultConfig.DecodeDelay = 0u;
2439 #endif /* FEATURE_ADC_SAR_DECODE_DELAY */
2440     DefaultConfig.PowerDownDelay = 0u;
2441 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
2442     DefaultConfig.SelfTestThresholdConfig = NULL_PTR;
2443 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
2444 #if FEATURE_ADC_HAS_CLOCK_DIVIDER
2445     DefaultConfig.ClkDivEnable = FALSE;
2446 #endif /* FEATURE_ADC_HAS_CLOCK_DIVIDER */
2447 #if FEATURE_ADC_HAS_AVERAGING
2448     DefaultConfig.AvgEn = FALSE;
2449     DefaultConfig.AvgSel = ADC_SAR_IP_AVG_4_CONV;
2450 #endif /* FEATURE_ADC_HAS_AVERAGING */
2451     DefaultConfig.UsrOffset = 0u;
2452     DefaultConfig.UsrGain = 0u;
2453     DefaultConfig.DmaEnable = FALSE;
2454     DefaultConfig.DmaClearSource = ADC_SAR_IP_DMA_REQ_CLEAR_ON_ACK;
2455     DefaultConfig.NumChannels = 0u;
2456     DefaultConfig.ChannelConfigsPtr = NULL_PTR;
2457 #if (STD_ON == ADC_SAR_IP_ECH_ENABLED)
2458     DefaultConfig.EndOfNormalChainNotification = NULL_PTR;
2459 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) */
2460 #if (STD_ON == ADC_SAR_IP_JECH_ENABLED)
2461     DefaultConfig.EndOfInjectedChainNotification = NULL_PTR;
2462 #endif /* (STD_ON == ADC_SAR_IP_JECH_ENABLED) */
2463 #if ADC_SAR_IP_HAS_CTU
2464 #if (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)
2465     DefaultConfig.EndOfCtuConversionNotification = NULL_PTR;
2466 #endif /* (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) */
2467 #endif /* ADC_SAR_IP_HAS_CTU */
2468 
2469 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
2470     DefaultConfig.EndOfConvNotification = NULL_PTR;
2471 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
2472 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
2473     DefaultConfig.NumWdgThresholds = 0u;
2474     DefaultConfig.WdgThresholds = NULL_PTR;
2475     DefaultConfig.WdgOutOfRangeNotification = NULL_PTR;
2476 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
2477     Status = Adc_Sar_Ip_Init(u32Instance, &DefaultConfig);
2478     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
2479     {
2480 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2481         if ((u32Instance >= ADC_INSTANCE_COUNT))
2482         {
2483             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2484             for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
2485             {
2486                 CIMR(AdcAEBasePtr, Index) = 0u;
2487                 CEOCFR(AdcAEBasePtr, Index) = 0xFFFFFFFFu; /* w1c bits */
2488                 DMAR(AdcAEBasePtr, Index) = 0u;
2489 #if FEATURE_ADC_HAS_PRESAMPLING
2490                 PSR(AdcAEBasePtr, Index) = 0u;
2491 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2492             }
2493 
2494             /* Deinit watchdog interrupts */
2495             Adc_Sar_ResetWdog(u32Instance);
2496             AdcAEBasePtr->WTIMR = 0u;
2497         }
2498         else
2499 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2500         {
2501             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2502             for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
2503             {
2504                 CIMR(AdcBasePtr, Index) = 0u;
2505                 CEOCFR(AdcBasePtr, Index) = 0xFFFFFFFFu; /* w1c bits */
2506                 DMAR(AdcBasePtr, Index) = 0u;
2507 #if FEATURE_ADC_HAS_PRESAMPLING
2508                 PSR(AdcBasePtr, Index) = 0u;
2509 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
2510             }
2511 
2512             /* Deinit watchdog interrupts */
2513             Adc_Sar_ResetWdog(u32Instance);
2514             AdcBasePtr->WTIMR = 0u;
2515         }
2516         /* Deinit channel configuration */
2517 
2518         Adc_Sar_Ip_ClearStatusFlags(u32Instance, ADC_SAR_IP_NOTIF_FLAG_ALL);
2519 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
2520         /* Set default resolution */
2521         Adc_Sar_Ip_SetResolution(u32Instance, ADC_SAR_IP_RESOLUTION_12);
2522 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
2523 
2524         /* Mark that the driver was deinitialized */
2525         Adc_Sar_Ip_axAdcSarState[u32Instance].InitStatus = FALSE;
2526 
2527         Status = Adc_Sar_Ip_Powerdown(u32Instance);
2528 
2529 #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
2530         /* Clear the UAA bit in REG_PROT to reset the elevation requirement */
2531         OsIf_Trusted_Call1param(Adc_Sar_Ip_ClrUserAccessAllowed, u32Instance);
2532 #endif
2533     }
2534 
2535     return Status;
2536 }
2537 
2538 /*FUNCTION**********************************************************************
2539 *
2540 * Function Name : Adc_Sar_Ip_ChainConfig
2541 * Description   : This function configures the ADC Normal and Injected Chains
2542 *  with the options provided in the structure.
2543 *
2544 * @implements      Adc_Sar_Ip_ChainConfig_Activity
2545 * END**************************************************************************/
Adc_Sar_Ip_ChainConfig(const uint32 u32Instance,const Adc_Sar_Ip_ChansIdxMaskType * const pChansIdxMask,const Adc_Sar_Ip_ConvChainType pChainType)2546 void Adc_Sar_Ip_ChainConfig(const uint32 u32Instance,
2547                             const Adc_Sar_Ip_ChansIdxMaskType * const pChansIdxMask,
2548                             const Adc_Sar_Ip_ConvChainType pChainType)
2549 {
2550 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2551     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2552     DevAssert(pChansIdxMask != NULL_PTR);
2553 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
2554     uint8 i;
2555 
2556     /* Enabling unavailable channels is forbidden */
2557     for (i = 0U; i < ADC_SAR_IP_NUM_GROUP_CHAN; i++)
2558     {
2559         DevAssert((pChansIdxMask->ChanMaskArr[i] & (~Adc_Sar_Ip_au32AdcChanBitmap[u32Instance][i])) == 0u);
2560     }
2561 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
2562 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2563 
2564     switch (pChainType)
2565     {
2566         case ADC_SAR_IP_CONV_CHAIN_NORMAL:
2567             Adc_Sar_SetNormalChain(u32Instance, pChansIdxMask->ChanMaskArr);
2568             break;
2569         case ADC_SAR_IP_CONV_CHAIN_INJECTED:
2570             Adc_Sar_SetInjectedChain(u32Instance, pChansIdxMask->ChanMaskArr);
2571             break;
2572         default:
2573             ; /* no-op */
2574 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2575             DevAssert(FALSE);
2576 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2577             break;
2578     }
2579 }
2580 
2581 /*FUNCTION**********************************************************************
2582 *
2583 * Function Name : Adc_Sar_Ip_EnableChannel
2584 * Description   : This function enables a channel in a conversion chain (
2585 *  ADC_SAR_IP_CONV_CHAIN_NORMAL or ADC_SAR_IP_CONV_CHAIN_INJECTED).
2586 *
2587 * @implements      Adc_Sar_Ip_EnableChannel_Activity
2588 * END**************************************************************************/
Adc_Sar_Ip_EnableChannel(const uint32 u32Instance,const Adc_Sar_Ip_ConvChainType pChainType,const uint32 u32ChnIdx)2589 void Adc_Sar_Ip_EnableChannel(const uint32 u32Instance,
2590                               const Adc_Sar_Ip_ConvChainType pChainType,
2591                               const uint32 u32ChnIdx)
2592 {
2593     uint32 VectAdr;
2594     uint32 VectBit;
2595     ADC_Type * AdcBasePtr = NULL_PTR;
2596 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2597     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2598 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2599     volatile uint32 * NCMRAddr = NULL_PTR;
2600     volatile uint32 * JCMRAddr = NULL_PTR;
2601 
2602 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2603     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2604     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
2605 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
2606     DevAssert(!((0U == u32ChnIdx) && ((ADC_SAR_IP_CONV_CHAIN_INJECTED == pChainType) || (ADC_SAR_IP_CONV_CHAIN_CTU == pChainType))));
2607 #endif
2608 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
2609     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
2610 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
2611 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2612 
2613     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
2614     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
2615 
2616 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2617     if (u32Instance >= ADC_INSTANCE_COUNT)
2618     {
2619         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2620         NCMRAddr = &(NCMR(AdcAEBasePtr, VectAdr));
2621         JCMRAddr = &(JCMR(AdcAEBasePtr, VectAdr));
2622     }
2623     else
2624 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2625     {
2626         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2627         NCMRAddr = &(NCMR(AdcBasePtr, VectAdr));
2628         JCMRAddr = &(JCMR(AdcBasePtr, VectAdr));
2629     }
2630 
2631     switch (pChainType)
2632     {
2633         case ADC_SAR_IP_CONV_CHAIN_NORMAL:
2634             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_23();
2635             *NCMRAddr |= (1UL << VectBit);
2636             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_23();
2637             break;
2638         case ADC_SAR_IP_CONV_CHAIN_INJECTED:
2639             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_26();
2640             *JCMRAddr |= (1UL << VectBit);
2641             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_26();
2642             break;
2643         default:
2644             ; /* no-op */
2645 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2646             DevAssert(FALSE);
2647 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2648             break;
2649     }
2650 }
2651 
2652 /*FUNCTION**********************************************************************
2653 *
2654 * Function Name : Adc_Sar_Ip_DisableChannel
2655 * Description   : This function disables a channel from a conversion chain (ADC_SAR_IP_CONV_CHAIN_NORMAL
2656 *  or ADC_SAR_IP_CONV_CHAIN_INJECTED).
2657 *
2658 * @implements      Adc_Sar_Ip_DisableChannel_Activity
2659 * END**************************************************************************/
Adc_Sar_Ip_DisableChannel(const uint32 u32Instance,const Adc_Sar_Ip_ConvChainType pChainType,const uint32 u32ChnIdx)2660 void Adc_Sar_Ip_DisableChannel(const uint32 u32Instance,
2661                                const Adc_Sar_Ip_ConvChainType pChainType,
2662                                const uint32 u32ChnIdx)
2663 {
2664     uint32 VectAdr;
2665     uint32 VectBit;
2666     ADC_Type * AdcBasePtr = NULL_PTR;
2667 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2668     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2669 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2670     volatile uint32 * NCMRAddr = NULL_PTR;
2671     volatile uint32 * JCMRAddr = NULL_PTR;
2672 
2673 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2674     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2675     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
2676 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
2677     DevAssert((0U == u32ChnIdx) && (ADC_SAR_IP_CONV_CHAIN_INJECTED == pChainType));
2678 #endif
2679 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
2680     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
2681 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
2682 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2683 
2684     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
2685     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
2686 
2687 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2688     if (u32Instance >= ADC_INSTANCE_COUNT)
2689     {
2690         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2691         NCMRAddr = &(NCMR(AdcAEBasePtr, VectAdr));
2692         JCMRAddr = &(JCMR(AdcAEBasePtr, VectAdr));
2693     }
2694     else
2695 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2696     {
2697         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2698         NCMRAddr = &(NCMR(AdcBasePtr, VectAdr));
2699         JCMRAddr = &(JCMR(AdcBasePtr, VectAdr));
2700     }
2701 
2702     switch (pChainType)
2703     {
2704         case ADC_SAR_IP_CONV_CHAIN_NORMAL:
2705             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_24();
2706             *NCMRAddr &= ~(1UL << VectBit);
2707             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_24();
2708             break;
2709         case ADC_SAR_IP_CONV_CHAIN_INJECTED:
2710             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_27();
2711             *JCMRAddr &= ~(1UL << VectBit);
2712             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_27();
2713             break;
2714         default:
2715             ; /* no-op */
2716 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2717             DevAssert(FALSE);
2718 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2719             break;
2720     }
2721 }
2722 
2723 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
2724 /*FUNCTION**********************************************************************
2725 *
2726 * Function Name : Adc_Sar_Ip_SetResolution
2727 * Description   : This function sets the conversion resolution (number of bits per conversion data)
2728 *
2729 * @implements      Adc_Sar_Ip_SetResolution_Activity
2730 * END**************************************************************************/
Adc_Sar_Ip_SetResolution(const uint32 u32Instance,const Adc_Sar_Ip_Resolution eResolution)2731 void Adc_Sar_Ip_SetResolution(const uint32 u32Instance,
2732                               const Adc_Sar_Ip_Resolution eResolution)
2733 {
2734     uint32 Calbistreg;
2735     ADC_Type * AdcBasePtr = NULL_PTR;
2736 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2737     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2738 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2739 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2740     uint32 Msr;
2741     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2742 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2743     volatile uint32 * CALBISTREGAddr = NULL_PTR;
2744 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
2745     /* calibration must not be interrupted */
2746     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
2747 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
2748     {
2749 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2750         if (u32Instance >= ADC_INSTANCE_COUNT)
2751         {
2752             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2753 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2754         Msr = AdcAEBasePtr->MSR;
2755     #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2756             CALBISTREGAddr = (volatile uint32 *)&(AdcAEBasePtr->CALBISTREG);
2757         }
2758         else
2759 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2760         {
2761             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2762 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2763             Msr = AdcBasePtr->MSR;
2764 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2765             CALBISTREGAddr = (volatile uint32 *)&(AdcBasePtr->CALBISTREG);
2766         }
2767 
2768 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2769         /* The selected ADC should be in IDLE state */
2770         DevAssert((Msr & ADC_MSR_ADCSTATUS_MASK) == ADC_MSR_ADCSTATUS(ADC_SAR_IP_MSR_ADCSTATUS_IDLE));
2771 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2772         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_37();
2773         Calbistreg = *CALBISTREGAddr;
2774         /* Clear the bits and set resolution value */
2775         Calbistreg &= ~(ADC_CALBISTREG_RESN_MASK);
2776         Calbistreg |= ADC_CALBISTREG_RESN(eResolution);
2777         *CALBISTREGAddr = Calbistreg;
2778         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_37();
2779     }
2780 }
2781 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
2782 
2783 /*FUNCTION**********************************************************************
2784 *
2785 * Function Name : Adc_Sar_Ip_StartConversion
2786 * Description   : This function starts a conversion chain (ADC_SAR_IP_CONV_CHAIN_NORMAL
2787 *  or ADC_SAR_IP_CONV_CHAIN_INJECTED).
2788 *
2789 * @implements      Adc_Sar_Ip_StartConversion_Activity
2790 * END**************************************************************************/
Adc_Sar_Ip_StartConversion(const uint32 u32Instance,const Adc_Sar_Ip_ConvChainType pChainType)2791 void Adc_Sar_Ip_StartConversion(const uint32 u32Instance,
2792                                 const Adc_Sar_Ip_ConvChainType pChainType)
2793 {
2794     ADC_Type * AdcBasePtr = NULL_PTR;
2795 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2796     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2797 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2798     volatile uint32 * MCRAddr = NULL_PTR;
2799 
2800 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2801     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2802 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2803 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
2804     /* calibration must not be interrupted */
2805     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
2806 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
2807     {
2808 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2809         if (u32Instance >= ADC_INSTANCE_COUNT)
2810         {
2811             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2812             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
2813         }
2814         else
2815 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2816         {
2817             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2818             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
2819         }
2820 
2821         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_10();
2822         switch (pChainType)
2823         {
2824             case ADC_SAR_IP_CONV_CHAIN_NORMAL:
2825                 *MCRAddr |= ADC_MCR_NSTART(1U);
2826                 break;
2827             case ADC_SAR_IP_CONV_CHAIN_INJECTED:
2828                 *MCRAddr |= ADC_MCR_JSTART(1U);
2829                 break;
2830             default:
2831                 ; /* no-op */
2832 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2833                 DevAssert(FALSE);
2834 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2835                 break;
2836         }
2837         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_10();
2838     }
2839 }
2840 
2841 /*FUNCTION**********************************************************************
2842 *
2843 * Function Name : Adc_Sar_Ip_GetStatusFlags
2844 * Description   : This function returns the status flags of the ADC.
2845 *
2846 * @implements      Adc_Sar_Ip_GetStatusFlags_Activity
2847 * END**************************************************************************/
Adc_Sar_Ip_GetStatusFlags(const uint32 u32Instance)2848 uint32 Adc_Sar_Ip_GetStatusFlags(const uint32 u32Instance)
2849 {
2850     uint32 Flags = 0U;
2851 
2852 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2853     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2854 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2855 
2856     /* Returns the flag status from MSR register */
2857     Flags |= Adc_Sar_GetMsrFlags(u32Instance);
2858     /* Returns the flag status from ISR register */
2859     Flags |= Adc_Sar_GetIsrFlags(u32Instance);
2860 
2861     return Flags;
2862 }
2863 
2864 /*FUNCTION**********************************************************************
2865 *
2866 * Function Name : Adc_Sar_Ip_ClearStatusFlags
2867 * Description   : This function clears the status flags that are set to '1' in
2868 *  the mask.
2869 *
2870 * @implements      Adc_Sar_Ip_ClearStatusFlags_Activity
2871 * END**************************************************************************/
Adc_Sar_Ip_ClearStatusFlags(const uint32 u32Instance,const uint32 u32Mask)2872 void Adc_Sar_Ip_ClearStatusFlags(const uint32 u32Instance,
2873                                  const uint32 u32Mask)
2874 {
2875     uint32 IsrFlags = 0U;
2876     volatile uint32 * ISRAddr = NULL_PTR;
2877 
2878     ADC_Type * AdcBasePtr = NULL_PTR;
2879 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2880     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2881 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2882 
2883 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2884     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2885     DevAssert((u32Mask & (~ADC_SAR_IP_NOTIF_FLAG_ALL)) == 0UL);
2886 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2887 
2888 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2889     if (u32Instance >= ADC_INSTANCE_COUNT)
2890     {
2891         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2892         ISRAddr = (volatile uint32 *)&(AdcAEBasePtr->ISR);
2893     }
2894     else
2895 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2896     {
2897         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
2898         ISRAddr = (volatile uint32 *)&(AdcBasePtr->ISR);
2899     }
2900 
2901     IsrFlags |= ((u32Mask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_EOC) != 0U) ? ADC_ISR_EOC(1U) : 0U;
2902     IsrFlags |= ((u32Mask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN) != 0U) ? ADC_ISR_ECH(1U) : 0U;
2903     IsrFlags |= ((u32Mask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_EOC) != 0U) ? ADC_ISR_JEOC(1U) : 0U;
2904     IsrFlags |= ((u32Mask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN) != 0U) ? ADC_ISR_JECH(1U) : 0U;
2905 #if ADC_SAR_IP_HAS_CTU
2906 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
2907     if (ADC_SAR_IP_INST_HAS_CTU(u32Instance))
2908     {
2909 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
2910         IsrFlags |= ((u32Mask & ADC_SAR_IP_NOTIF_FLAG_CTU_EOC) != 0U) ? ADC_ISR_EOCTU(1U) : 0U;
2911 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
2912     }
2913 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
2914 #endif /* ADC_SAR_IP_HAS_CTU */
2915 
2916     /* Write-1-to-clear bits in ISR register */
2917     *ISRAddr = IsrFlags;
2918 #ifdef FEATURE_CPU_HAS_WRITE_BUFFER
2919         (void) *ISRAddr;
2920 #endif /* FEATURE_CPU_HAS_WRITE_BUFFER */
2921 }
2922 
2923 #if (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED)
2924 /*FUNCTION**********************************************************************
2925 *
2926 * Function Name : Adc_Sar_Ip_SelfTest
2927 * Description   : This function executes a self test on the ADC instance.
2928 *
2929 * @implements      Adc_Sar_Ip_SelfTest_Activity
2930 * END**************************************************************************/
Adc_Sar_Ip_SelfTest(const uint32 u32Instance)2931 Adc_Sar_Ip_StatusType Adc_Sar_Ip_SelfTest(const uint32 u32Instance)
2932 {
2933     ADC_Type * AdcBasePtr = NULL_PTR;
2934 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2935     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
2936 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2937     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
2938 #if ADC_SAR_IP_HAS_SELFTEST_STCR1
2939     uint32 Reg;
2940 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR1 */
2941     uint32 MsrStatus;
2942     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
2943     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
2944     uint32 ElapsedTicks = 0U;
2945 #if (ADC_SAR_IP_SELFTEST_FULL_CLK && ADC_SAR_IP_HAS_ADCLKSEL)
2946     uint32 AdcClkSel = 0u;
2947 #endif /* (ADC_SAR_IP_SELFTEST_FULL_CLK && ADC_SAR_IP_HAS_ADCLKSEL) */
2948     volatile uint32 * MCRAddr = NULL_PTR;
2949     volatile const uint32 * MSRAddr = NULL_PTR;
2950 #if !ADC_SAR_IP_HAS_SELFTEST_USE_CH32
2951     volatile uint32 * NCMR0Addr = NULL_PTR;
2952 #else
2953     volatile uint32 * NCMR1Addr = NULL_PTR;
2954 #endif /* ADC_SAR_IP_HAS_SELFTEST_USE_CH32 */
2955 #if ADC_SAR_IP_HAS_SELFTEST_STCR1
2956     volatile uint32 * STCR1Addr = NULL_PTR;
2957 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR1 */
2958     volatile uint32 * STCR2Addr = NULL_PTR;
2959 #if ADC_SAR_IP_HAS_SELFTEST_STCR3
2960     volatile uint32 * STCR3Addr = NULL_PTR;
2961 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR3 */
2962 #ifdef ADC_GPADC_ANA_TEST0_VDAC
2963     uint32 BackupVdacAnaTest0;
2964 #endif
2965 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
2966     uint32 BackupVinSeRefAnaConf;
2967 #endif
2968 
2969 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
2970     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
2971 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
2972 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
2973     /* calibration must not be interrupted */
2974     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
2975     {
2976 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
2977 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
2978         if (u32Instance >= ADC_INSTANCE_COUNT)
2979         {
2980             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
2981             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
2982             MSRAddr = (volatile uint32 *)&(AdcAEBasePtr->MSR);
2983 #if !ADC_SAR_IP_HAS_SELFTEST_USE_CH32
2984             NCMR0Addr = &(NCMR(AdcAEBasePtr, 0u));
2985 #else
2986             NCMR1Addr = &(NCMR(AdcAEBasePtr, 1u));
2987 #endif /* ADC_SAR_IP_HAS_SELFTEST_USE_CH32 */
2988 #if ADC_SAR_IP_HAS_SELFTEST_STCR1
2989             STCR1Addr = (volatile uint32 *)&(AdcAEBasePtr->STCR1);
2990 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR1 */
2991             STCR2Addr = (volatile uint32 *)&(AdcAEBasePtr->STCR2);
2992 #if ADC_SAR_IP_HAS_SELFTEST_STCR3
2993             STCR3Addr = (volatile uint32 *)&(AdcAEBasePtr->STCR3);
2994 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR3 */
2995         }
2996         else
2997 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
2998         {
2999             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3000             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
3001             MSRAddr = (volatile uint32 *)&(AdcBasePtr->MSR);
3002 #if !ADC_SAR_IP_HAS_SELFTEST_USE_CH32
3003             NCMR0Addr = &(NCMR(AdcBasePtr, 0u));
3004 #else
3005             NCMR1Addr = &(NCMR(AdcBasePtr, 1u));
3006 #endif /* ADC_SAR_IP_HAS_SELFTEST_USE_CH32 */
3007 #if ADC_SAR_IP_HAS_SELFTEST_STCR1
3008             STCR1Addr = (volatile uint32 *)&(AdcBasePtr->STCR1);
3009 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR1 */
3010             STCR2Addr = (volatile uint32 *)&(AdcBasePtr->STCR2);
3011 #if ADC_SAR_IP_HAS_SELFTEST_STCR3
3012             STCR3Addr = (volatile uint32 *)&(AdcBasePtr->STCR3);
3013 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR3 */
3014         }
3015 
3016 #if ADC_SAR_IP_SELFTEST_FULL_CLK
3017         /* Enter into power-down Mode */
3018         Status = Adc_Sar_Ip_Powerdown(u32Instance);
3019         if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3020         {
3021 #if ADC_SAR_IP_HAS_ADCLKSEL
3022             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_11();
3023             /* Save the current state of ADCLKSEL in order to restore it */
3024             AdcClkSel = ((*MCRAddr) & ADC_MCR_ADCLKSEL_MASK);
3025             /* ADC self-test should be run with MCR[ADCLKSE] bit set to 1 */
3026             *MCRAddr &= ~(ADC_MCR_ADCLKSEL_MASK);
3027             *MCRAddr |= ADC_MCR_ADCLKSEL(1U);
3028             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_11();
3029 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
3030 
3031             /* Exit into power-down Mode */
3032             Status = Adc_Sar_Ip_Powerup(u32Instance);
3033             if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3034             {
3035 #endif /* ADC_SAR_IP_SELFTEST_FULL_CLK */
3036                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_25();
3037 #if !ADC_SAR_IP_HAS_SELFTEST_USE_CH32
3038                 /* 1. Program NCMR0 to select channels to be converted for normal conversion.*/
3039                 *NCMR0Addr |= ADC_NCMR_CH0(0x1UL);
3040 #else
3041                 /* Workaround for SAF8544 since self-test result register is written twice with the last channel of chain and self-test channel 32
3042                 Enabling channel 32 at last of chain to have register field having only result of selftest channel 32 */
3043                 *NCMR1Addr |= ADC_NCMR1_CH32(0x1UL);
3044 #endif /* ADC_SAR_IP_HAS_SELFTEST_USE_CH32 */
3045                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_25();
3046 
3047                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_11();
3048                 /* Self-test will only run with CPU mode so clear CTU enable */
3049 #if defined(ADC_MCR_CTUEN_MASK)
3050                 *MCRAddr &= ~(ADC_MCR_CTUEN_MASK);
3051 #endif /* ADC_MCR_CTUEN_MASK */
3052 
3053                 /* 2. Program MCR[MODE] = 1 to select Scan mode. ADC_ONE_SHOT_MODE_U32 ADCDIG_CONTINUOUS_MODE_U32*/
3054                 *MCRAddr |= ADC_MCR_MODE(0x1UL);
3055                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_11();
3056 #if ADC_SAR_IP_HAS_SELFTEST_STCR1
3057                 /* 3. Program sampling duration values in STCR1[INPSAMPx].*/
3058                 Reg = 0u;
3059                 Reg |= ADC_STCR1_INPSAMP_S(0x10UL) | ADC_STCR1_INPSAMP_C(0x10UL);
3060                 *STCR1Addr = Reg;
3061 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR1 */
3062 
3063                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_35();
3064 #if ADC_SAR_IP_HAS_SELFTEST_STCR3
3065                 /* 4. Select the self-testing algorithm in STCR3[ALG]. */
3066                 *STCR3Addr |= ADC_STCR3_ALG(0x3UL);
3067 #endif /* ADC_SAR_IP_HAS_SELFTEST_STCR3 */
3068                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_35();
3069 
3070                 Adc_Sar_EnableSelftestThreshold(u32Instance);
3071 #ifdef ADC_GPADC_ANA_TEST0_VDAC
3072                 /* Save the current state of GPADC_ANA_TEST0[ADAC] in order to restore it */
3073                 BackupVdacAnaTest0 = AdcBasePtr->GPADC_ANA_TEST0;
3074                 AdcBasePtr->GPADC_ANA_TEST0 &= ~(ADC_GPADC_ANA_TEST0_VDAC_MASK);
3075                 AdcBasePtr->GPADC_ANA_TEST0 |= ADC_GPADC_ANA_TEST0_VDAC(8U);
3076 #endif /* ADC_GPADC_ANA_TEST0_VDAC */
3077 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
3078                 /* Save the current state of GPADC_ANA_CONF[VIN_SE_REF] in order to restore it */
3079                 BackupVinSeRefAnaConf = AdcBasePtr->GPADC_ANA_CONF;
3080 #endif
3081 #ifdef ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF
3082                 if (ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_1V6 == ((REG_ACCESS_BY_ADDR(ADC_GPADC_CALCFG0_ADDR) & ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_MASK) >> ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_SHIFT))
3083                 {
3084 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
3085                     /* GPADC_ANA_CONF[VIN_SE_REF] = 1 (enable self-test channel div2 mode) to be aligned with CALCFG0[SET_VREF_OUT_BUF] = 4 (1.6v) (only shown in DDTS) */
3086                     AdcBasePtr->GPADC_ANA_CONF |= ADC_GPADC_ANA_CONF_VIN_SE_REF(1U);
3087 #endif /* ADC_GPADC_ANA_CONF_VIN_SE_REF */
3088                 }
3089                 else if (ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_0V8 == ((REG_ACCESS_BY_ADDR(ADC_GPADC_CALCFG0_ADDR) & ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_MASK) >> ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_SHIFT))
3090                 {
3091 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
3092                     /* GPADC_ANA_CONF[VIN_SE_REF] = 0 (disable self-test channel div2 mode) to be aligned with CALCFG0[SET_VREF_OUT_BUF] = 2 (0.8v) (only shown in DDTS) */
3093                     AdcBasePtr->GPADC_ANA_CONF |= ADC_GPADC_ANA_CONF_VIN_SE_REF(0U);
3094 #endif /* ADC_GPADC_ANA_CONF_VIN_SE_REF */
3095                 }
3096                 else
3097                 {
3098                     /* Overwrite to 4 (1.6v vref) */
3099                     REG_ACCESS_BY_ADDR(ADC_GPADC_CALCFG0_ADDR) &= ~(ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_MASK);
3100                     REG_ACCESS_BY_ADDR(ADC_GPADC_CALCFG0_ADDR) |= ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF(ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF_1V6);
3101 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
3102                     /* GPADC_ANA_CONF[VIN_SE_REF] = 1 (enable self-test channel div2 mode) to be aligned with CALCFG0[SET_VREF_OUT_BUF] = 4 (1.6v) (only shown in DDTS) */
3103                     AdcBasePtr->GPADC_ANA_CONF |= ADC_GPADC_ANA_CONF_VIN_SE_REF(1U);
3104 #endif /* ADC_GPADC_ANA_CONF_VIN_SE_REF */
3105                     /* Wait after changing SET_VREF_OUT_BUF to avoid unstable result */
3106                     TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_BANDGAP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3107                     CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
3108                     ElapsedTicks = 0u;
3109                     while (ElapsedTicks < TimeoutTicks)
3110                     {
3111                         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3112                     }
3113                 }
3114 #endif /* ADC_GPADC_CALCFG0_SET_VREF_OUT_BUF */
3115 
3116                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_35();
3117                 /* 5. Enable the self-testing channel by setting STCR2[EN]. */
3118                 *STCR2Addr |= ADC_STCR2_EN(0x1UL);
3119                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_35();
3120 
3121                 /* 6. Start the normal conversion by setting MCR[NSTART]. */
3122                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_11();
3123                 *MCRAddr |= ADC_MCR_NSTART(0x1UL);
3124                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_11();
3125 
3126                 /*  Check that all algorithms have executed at least once. */
3127                 Status = Adc_Sar_CheckSelfTestProgress(u32Instance);
3128 
3129                 /* Stop the conversion */
3130                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_11();
3131                 *MCRAddr &= ~(ADC_MCR_NSTART(0x1UL));
3132                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_11();
3133 
3134                 if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3135                 {
3136                     /* Read ADC status */
3137                     MsrStatus = ((*MSRAddr) & ADC_MSR_ADCSTATUS_MASK) >> ADC_MSR_ADCSTATUS_SHIFT;
3138                     /* Wait for ADC changes to the expected Idle mode, The bitfield MSR[ADCSTATUS] should be checked to Idle state when MCR[NSTART] is written to 0 */
3139                     TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3140                     ElapsedTicks = 0U;
3141                     while ((MsrStatus != ADC_MSR_ADCSTATUS(ADC_SAR_IP_MSR_ADCSTATUS_IDLE)) && (ElapsedTicks < TimeoutTicks))
3142                     {
3143                         MsrStatus = ((*MSRAddr) & ADC_MSR_ADCSTATUS_MASK) >> ADC_MSR_ADCSTATUS_SHIFT;
3144                         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3145                     }
3146                 }
3147 
3148                 Adc_Sar_DisableSelftestThreshold(u32Instance);
3149 
3150 #ifdef ADC_GPADC_ANA_TEST0_VDAC
3151                 /* Restore the state of GPADC_ANA_TEST0[VDAC] */
3152                 AdcBasePtr->GPADC_ANA_TEST0 = BackupVdacAnaTest0;
3153 #endif /* ADC_GPADC_ANA_TEST0_VDAC */
3154 #ifdef ADC_GPADC_ANA_CONF_VIN_SE_REF
3155                 /* Restore the state of GPADC_ANA_CONF[VIN_SE_REF] */
3156                 AdcBasePtr->GPADC_ANA_CONF = BackupVinSeRefAnaConf;
3157 #endif /* ADC_GPADC_ANA_CONF_VIN_SE_REF */
3158 
3159                 /* Disable Self-test */
3160                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_35();
3161                 *STCR2Addr &= ~(ADC_STCR2_EN(0x1UL));
3162                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_35();
3163 
3164 #if ADC_SAR_IP_SELFTEST_FULL_CLK
3165             }
3166             if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3167             {
3168                 /* Enter into power-down Mode */
3169                 Status = Adc_Sar_Ip_Powerdown(u32Instance);
3170 #if ADC_SAR_IP_HAS_ADCLKSEL
3171                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_11();
3172                 /* Restore the state of ADCLKSEL */
3173                 *MCRAddr &= ~(ADC_MCR_ADCLKSEL_MASK);
3174                 *MCRAddr |= AdcClkSel;
3175                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_11();
3176 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
3177 
3178                 if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3179                 {
3180                     /* Exit into power-down Mode */
3181                     Status = Adc_Sar_Ip_Powerup(u32Instance);
3182                     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3183 #endif /* ADC_SAR_IP_SELFTEST_FULL_CLK */
3184                     {
3185                         Status = Adc_Sar_CheckTimeoutStatus(ElapsedTicks, TimeoutTicks);
3186                     }
3187 #if ADC_SAR_IP_SELFTEST_FULL_CLK
3188                 }
3189             }
3190         }
3191 #endif /* ADC_SAR_IP_SELFTEST_FULL_CLK */
3192 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
3193     }
3194     else
3195     {
3196         Status = ADC_SAR_IP_STATUS_CAL_ONGOING;
3197     }
3198 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
3199     return Status;
3200 }
3201 #endif /* (STD_ON == ADC_SAR_IP_SELFTEST_ENABLED) */
3202 
3203 /*FUNCTION**********************************************************************
3204 *
3205 * Function Name : Adc_Sar_Ip_GetConvDataToArray
3206 * Description   : This function reads the conversion result values for a conversion chain
3207 *  (ADC_SAR_IP_CONV_CHAIN_NORMAL, ADC_SAR_IP_CONV_CHAIN_INJECTED or ADC_SAR_IP_CONV_CHAIN_CTU).
3208 *
3209 * @implements      Adc_Sar_Ip_GetConvDataToArray_Activity
3210 * END**************************************************************************/
Adc_Sar_Ip_GetConvDataToArray(const uint32 u32Instance,const Adc_Sar_Ip_ConvChainType pChainType,const uint32 u32Length,uint16 * const pResults)3211 uint32 Adc_Sar_Ip_GetConvDataToArray(const uint32 u32Instance,
3212                                      const Adc_Sar_Ip_ConvChainType pChainType,
3213                                      const uint32 u32Length,
3214                                      uint16 * const pResults)
3215 {
3216 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3217     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3218 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3219     return Adc_Sar_GetConvResults(u32Instance, pChainType, pResults, NULL_PTR, u32Length);
3220 }
3221 
3222 /*FUNCTION**********************************************************************
3223 *
3224 * Function Name : Adc_Sar_Ip_GetConvResultsToArray
3225 * Description   : This function gets the conversion results for the selected
3226 *  Conversion Chain. It follows the same algorithm as Adc_Sar_Ip_GetConvDataToArray,
3227 *  but will copy some extra information to the output.
3228 *
3229 * @implements      Adc_Sar_Ip_GetConvResultsToArray_Activity
3230 * END**************************************************************************/
Adc_Sar_Ip_GetConvResultsToArray(const uint32 u32Instance,const Adc_Sar_Ip_ConvChainType pChainType,const uint32 u32Length,Adc_Sar_Ip_ChanResultType * const pResults)3231 uint32 Adc_Sar_Ip_GetConvResultsToArray(const uint32 u32Instance,
3232                                         const Adc_Sar_Ip_ConvChainType pChainType,
3233                                         const uint32 u32Length,
3234                                         Adc_Sar_Ip_ChanResultType* const pResults)
3235 {
3236 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3237     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3238 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3239     return Adc_Sar_GetConvResults(u32Instance, pChainType, NULL_PTR, pResults, u32Length);
3240 }
3241 
3242 /*FUNCTION**********************************************************************
3243 *
3244 * Function Name : Adc_Sar_Ip_GetConvData
3245 * Description   : This function returns the result of the conversion for
3246 * a single channel
3247 *
3248 * @implements      Adc_Sar_Ip_GetConvData_Activity
3249 * END**************************************************************************/
Adc_Sar_Ip_GetConvData(const uint32 u32Instance,const uint32 u32ChnIdx)3250 uint16 Adc_Sar_Ip_GetConvData(const uint32 u32Instance,
3251                               const uint32 u32ChnIdx)
3252 {
3253     uint16 Result = 0U;
3254     uint32 VectAdr;
3255     uint32 VectBit;
3256     uint32 Cdr;
3257     ADC_Type * AdcBasePtr = NULL_PTR;
3258 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3259     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3260 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3261 
3262 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3263     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3264     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
3265 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
3266     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
3267 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
3268 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3269 
3270     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
3271     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
3272 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3273     if (u32Instance >= ADC_INSTANCE_COUNT)
3274     {
3275         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3276         Cdr = CDR_AE(AdcAEBasePtr, u32ChnIdx);
3277         /* check if the conversion data is valid */
3278         if (((Cdr & ADC_CDR_VALID_MASK) != 0U))
3279         {
3280             /* the data is correct, store the result in and clear the flag */
3281             Result = Adc_Sar_GetMaskedResult(u32Instance, Cdr);
3282             CEOCFR(AdcAEBasePtr, VectAdr) = ((uint32)1UL << VectBit); /* w1c bit */
3283         }
3284     }
3285     else
3286 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3287     {
3288         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3289         Cdr = CDR(AdcBasePtr, u32ChnIdx);
3290         /* check if the conversion data is valid */
3291         if (((Cdr & ADC_CDR_VALID_MASK) != 0U))
3292         {
3293 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
3294             if (!(((ADC_CDR_RESULT((uint32)ADC_SAR_IP_CONV_CHAIN_INJECTED) == (Cdr & (ADC_CDR_RESULT_MASK))) \
3295                || (ADC_CDR_RESULT((uint32)ADC_SAR_IP_CONV_CHAIN_CTU) == (Cdr & (ADC_CDR_RESULT_MASK)))) \
3296                && (0u == u32ChnIdx) \
3297                  ) \
3298                )
3299 #endif
3300             {
3301                 /* the data is correct, store the result in and clear the flag */
3302                 Result = Adc_Sar_GetMaskedResult(u32Instance, Cdr);
3303                 CEOCFR(AdcBasePtr, VectAdr) = ((uint32)1UL << VectBit); /* w1c bit */
3304             }
3305         }
3306     }
3307 
3308     return Result;
3309 }
3310 
3311 /*FUNCTION**********************************************************************
3312 *
3313 * Function Name : Adc_Sar_Ip_GetConvResult
3314 * Description   : This function returns the result and the status of
3315 * the conversion for a single channel
3316 *
3317 * @implements      Adc_Sar_Ip_GetConvResult_Activity
3318 * END**************************************************************************/
Adc_Sar_Ip_GetConvResult(const uint32 u32Instance,const uint32 u32ChnIdx,const Adc_Sar_Ip_ConvChainType pChainType,Adc_Sar_Ip_ChanResultType * const pResult)3319 void Adc_Sar_Ip_GetConvResult(const uint32 u32Instance,
3320                               const uint32 u32ChnIdx,
3321                               const Adc_Sar_Ip_ConvChainType pChainType,
3322                               Adc_Sar_Ip_ChanResultType * const pResult)
3323 {
3324     uint32 VectAdr;
3325     uint32 VectBit;
3326     uint32 Cdr;
3327     volatile uint32 * CEOCFRAddr = NULL_PTR;
3328     ADC_Type * AdcBasePtr = NULL_PTR;
3329 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3330     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3331 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3332 
3333 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3334     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3335     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
3336     DevAssert(pResult != NULL_PTR);
3337 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
3338     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
3339 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
3340 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3341 
3342     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
3343     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
3344 
3345     pResult->ConvData = 0u;
3346     pResult->AdcChnIdx = (uint8)u32ChnIdx;
3347     pResult->ValidFlag = FALSE;
3348     pResult->OverWrittenFlag = FALSE;
3349 
3350 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3351     if (u32Instance >= ADC_INSTANCE_COUNT)
3352     {
3353         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3354         Cdr = CDR_AE(AdcAEBasePtr, u32ChnIdx);
3355         CEOCFRAddr = &(CEOCFR(AdcAEBasePtr, VectAdr));
3356     }
3357     else
3358 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3359     {
3360         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3361         Cdr = CDR(AdcBasePtr, u32ChnIdx);
3362         CEOCFRAddr = &(CEOCFR(AdcBasePtr, VectAdr));
3363     }
3364 
3365     /* check if the result type matches the one request by pChainType */
3366     if (ADC_CDR_RESULT((uint32)pChainType) == (Cdr & ADC_CDR_RESULT_MASK))
3367     {
3368 #if FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND
3369         if (!((0U == u32ChnIdx) && ((ADC_SAR_IP_CONV_CHAIN_INJECTED == pChainType) || (ADC_SAR_IP_CONV_CHAIN_CTU == pChainType))))
3370 #endif /* FEATURE_ADC_SAF8544_CHANNEL_WORKAROUND */
3371         {
3372             pResult->ValidFlag = ((Cdr & ADC_CDR_VALID_MASK) != 0U) ? TRUE : FALSE;
3373             pResult->OverWrittenFlag = (1U == ((Cdr & ADC_CDR_OVERW_MASK) >> ADC_CDR_OVERW_SHIFT));
3374             pResult->ConvData = Adc_Sar_GetMaskedResult(u32Instance, Cdr);
3375         }
3376     }
3377 
3378     *CEOCFRAddr = ((uint32)1UL << VectBit); /* w1c bit */
3379 }
3380 
3381 #if FEATURE_ADC_HAS_CALIBRATION
3382 /*FUNCTION**********************************************************************
3383 *
3384 * Function Name : Adc_Sar_Ip_DoCalibration
3385 * Description   : This functions executes a calibration sequence. It is recommended
3386 *  to run this sequence before using the ADC converter. The maximum clock frequency
3387 *  for the calibration is 40 MHz, this function sets the ADCLKSEL bit resulting in
3388 *  a maximum input clock frequency of 80 MHz.
3389 *
3390 * @implements      Adc_Sar_Ip_DoCalibration_Activity
3391 * END**************************************************************************/
Adc_Sar_Ip_DoCalibration(const uint32 u32Instance)3392 Adc_Sar_Ip_StatusType Adc_Sar_Ip_DoCalibration(const uint32 u32Instance)
3393 {
3394     ADC_Type * AdcBasePtr = NULL_PTR;
3395 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3396     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3397 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3398     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
3399     Adc_Sar_Ip_StatusType CalStatus = ADC_SAR_IP_STATUS_SUCCESS;
3400     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3401     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
3402     uint32 ElapsedTicks = 0u;
3403 
3404     static uint32 McrSavedValue = 0u;
3405 #if ADC_SAR_IP_CALIBRATION_USES_MCR
3406     uint32 Mcr;
3407 #endif /* ADC_SAR_IP_CALIBRATION_USES_MCR */
3408     volatile uint32 * MCRAddr = NULL_PTR;
3409 #if (!ADC_SAR_IP_CALIBRATION_USES_MCR || FEATURE_ADC_HAS_APPLICATION_EXTENSION)
3410     uint32 Calbistreg;
3411     volatile uint32 * CALBISTREGAddr = NULL_PTR;
3412 #if defined(ADC_CAL2_ENX_MASK)
3413     volatile uint32 * CAL2Addr = NULL_PTR;
3414 #endif /* defined(ADC_CAL2_ENX_MASK) */
3415 #endif /* (!ADC_SAR_IP_CALIBRATION_USES_MCR || FEATURE_ADC_HAS_APPLICATION_EXTENSION) */
3416 
3417 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3418     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3419 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3420 
3421 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3422     if (u32Instance >= ADC_INSTANCE_COUNT)
3423     {
3424         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3425         MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
3426         CALBISTREGAddr = (volatile uint32 *)&(AdcAEBasePtr->CALBISTREG);
3427 #if defined(ADC_CAL2_ENX_MASK)
3428         CAL2Addr = (volatile uint32 *)&(AdcAEBasePtr->CAL2);
3429 #endif /* defined(ADC_CAL2_ENX_MASK) */
3430     }
3431     else
3432 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3433     {
3434         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3435         MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
3436 #if !ADC_SAR_IP_CALIBRATION_USES_MCR
3437         CALBISTREGAddr = (volatile uint32 *)&(AdcBasePtr->CALBISTREG);
3438 #if defined(ADC_CAL2_ENX_MASK)
3439         CAL2Addr = (volatile uint32 *)&(AdcBasePtr->CAL2);
3440 #endif /* defined(ADC_CAL2_ENX_MASK) */
3441 #endif /* !ADC_SAR_IP_CALIBRATION_USES_MCR */
3442     }
3443 
3444 #if (!ADC_SAR_IP_CALIBRATION_USES_MCR || FEATURE_ADC_HAS_APPLICATION_EXTENSION)
3445 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3446             if (u32Instance >= ADC_INSTANCE_COUNT)
3447             {
3448 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3449 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
3450                 if (Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing == FALSE)
3451                 {
3452                     Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing = TRUE;
3453 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
3454                         Status = Adc_Sar_CalibrationClkSelect(u32Instance, MCRAddr, &McrSavedValue);
3455 
3456                         if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3457                         {
3458                             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_36();
3459                             Calbistreg = *CALBISTREGAddr;
3460                             /* clear the bits and set to calibration values */
3461                             Calbistreg &= ~(ADC_SAR_IP_CALBISTREG_TSAMP_MASK | ADC_SAR_IP_CALBISTREG_NR_SMPL_MASK | ADC_SAR_IP_CALBISTREG_AVG_EN_MASK | ADC_SAR_IP_CALBISTREG_TEST_EN_MASK);
3462                             Calbistreg |= ADC_SAR_IP_CALBISTREG_NR_SMPL(0x03u) | ADC_SAR_IP_CALBISTREG_AVG_EN(1U);
3463                             *CALBISTREGAddr = Calbistreg;
3464                             /* clear the calibration failed before a new calibration */
3465                             *CALBISTREGAddr |= ADC_SAR_IP_CALBISTREG_TEST_FAIL_MASK;
3466                             /* Disable the error correction for the smaller capacitances in the CDAC of the ADC */
3467             #if defined(ADC_CAL2_ENX_MASK)
3468                             *CAL2Addr &= ~(ADC_CAL2_ENX_MASK);
3469             #endif /* defined(ADC_CAL2_ENX_MASK) */
3470                             /* Start calibration */
3471                             *CALBISTREGAddr |= ADC_SAR_IP_CALBISTREG_TEST_EN(1U);
3472                             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_36();
3473 
3474                         }
3475 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
3476                         Status = ADC_SAR_IP_STATUS_CAL_ONGOING;
3477                 }
3478                 else
3479 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
3480                 {
3481 
3482                     /* Wait for calibration to finish */
3483                     while (((*CALBISTREGAddr & ADC_SAR_IP_CALBISTREG_C_T_BUSY_MASK) != 0U) && (ElapsedTicks < TimeoutTicks))
3484                     {
3485                         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3486                     }
3487                     if (ElapsedTicks >= TimeoutTicks)
3488                     {
3489                         CalStatus = ADC_SAR_IP_STATUS_TIMEOUT;
3490                     }
3491                     else if ((*CALBISTREGAddr & ADC_SAR_IP_CALBISTREG_TEST_FAIL_MASK) != 0U)
3492                     {
3493                         /* If the calibration failed, return error */
3494                         CalStatus = ADC_SAR_IP_STATUS_ERROR;
3495                     }
3496                     else
3497                     {
3498                         ; /* Empty else branch to avoid MISRA */
3499                     }
3500                     Status = Adc_Sar_CalibrationClkRestore(u32Instance, MCRAddr, McrSavedValue);
3501 
3502                 }
3503 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3504             }
3505             else
3506 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3507 #endif /* (!ADC_SAR_IP_CALIBRATION_USES_MCR || FEATURE_ADC_HAS_APPLICATION_EXTENSION) */
3508             {
3509 #if ADC_SAR_IP_CALIBRATION_USES_MCR
3510 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
3511                 if(Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing == FALSE)
3512                 {
3513                     Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing = TRUE;
3514 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
3515                     Status = Adc_Sar_CalibrationClkSelect(u32Instance, MCRAddr, &McrSavedValue);
3516 
3517                     if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3518                     {
3519                         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_12();
3520                         /* Clear the bits and set to calibration values */
3521                         Mcr = AdcBasePtr->MCR;
3522                         Mcr &= ~(ADC_MCR_TSAMP_MASK | ADC_MCR_NRSMPL_MASK | ADC_MCR_AVGEN_MASK);
3523                         Mcr |= ADC_MCR_NRSMPL(0x03u) | ADC_MCR_AVGEN(1U);
3524                         AdcBasePtr->MCR = Mcr;
3525 
3526                         /* Start calibration */
3527                         AdcBasePtr->MCR |= ADC_MCR_CALSTART(1U);
3528                         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_12();
3529                     }
3530 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
3531                     Status = ADC_SAR_IP_STATUS_CAL_ONGOING;
3532                 }
3533                 else
3534 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)*/
3535                 {
3536                     /* Wait for calibration to finish */
3537                     while (((AdcBasePtr->MSR & ADC_MSR_CALBUSY_MASK) != 0U) && (ElapsedTicks < TimeoutTicks))
3538                     {
3539                         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3540                     }
3541 
3542                     if (ElapsedTicks >= TimeoutTicks)
3543                     {
3544                         CalStatus = ADC_SAR_IP_STATUS_TIMEOUT;
3545                     }
3546                     else if ((AdcBasePtr->MSR & ADC_MSR_CALFAIL_MASK) != 0U)
3547                     {
3548                         /* If the calibration failed, return error */
3549                         CalStatus = ADC_SAR_IP_STATUS_ERROR;
3550                     }
3551                     else
3552                     {
3553                         ; /* Empty else branch to avoid MISRA */
3554                     }
3555                     Status = Adc_Sar_CalibrationClkRestore(u32Instance, MCRAddr, McrSavedValue);
3556                 }
3557 #endif /* ADC_SAR_IP_CALIBRATION_USES_MCR */
3558             }
3559             if (ADC_SAR_IP_STATUS_SUCCESS == Status)
3560             {
3561                 Status = CalStatus;
3562             }
3563     return Status;
3564 }
3565 #endif /* FEATURE_ADC_HAS_CALIBRATION */
3566 
3567 /*FUNCTION**********************************************************************
3568 *
3569 * Function Name : Adc_Sar_Ip_Powerup
3570 * Description   : This function enables the ADC module (by clearing the Powerdown
3571 *  bit).
3572 *
3573 * @implements      Adc_Sar_Ip_Powerup_Activity
3574 * END**************************************************************************/
Adc_Sar_Ip_Powerup(const uint32 u32Instance)3575 Adc_Sar_Ip_StatusType Adc_Sar_Ip_Powerup(const uint32 u32Instance)
3576 {
3577     Adc_Sar_Ip_StatusType ReturnStatus = ADC_SAR_IP_STATUS_SUCCESS;
3578 
3579     const ADC_Type * AdcBasePtr = NULL_PTR;
3580 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3581     const SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3582 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3583 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3584     uint32 BandGapStatus = 0u;
3585 #else
3586     uint32 ExpectedStatus = ADC_MSR_ADCSTATUS(ADC_SAR_IP_MSR_ADCSTATUS_IDLE);  /* expected status is IDLE */
3587     uint32 MsrStatus;
3588     volatile const uint32 * MSRAddr = NULL_PTR;
3589 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3590     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3591     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
3592     uint32 ElapsedTicks = 0u;
3593 
3594 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3595     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3596 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3597 
3598 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3599     if (u32Instance >= ADC_INSTANCE_COUNT)
3600     {
3601         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3602 #if !ADC_SAR_IP_HAS_BANDGAP_STATUS
3603         MSRAddr = (volatile const uint32 *)&(AdcAEBasePtr->MSR);
3604 #endif /* !ADC_SAR_IP_HAS_BANDGAP_STATUS */
3605     }
3606     else
3607 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3608     {
3609         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3610 #if !ADC_SAR_IP_HAS_BANDGAP_STATUS
3611         MSRAddr = (volatile const uint32 *)&(AdcBasePtr->MSR);
3612 #endif /* !ADC_SAR_IP_HAS_BANDGAP_STATUS */
3613     }
3614 
3615 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3616     BandGapStatus = AdcBasePtr->GPADC_READOUT & ADC_GPADC_READOUT_BG_OK_MASK;
3617 #else
3618     MsrStatus = (*MSRAddr) & ADC_MSR_ADCSTATUS_MASK;
3619 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3620 
3621     SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_13();
3622     Adc_Sar_Powerup(u32Instance);
3623     SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_13();
3624 
3625     /* Wait for the device to power up */
3626 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3627     while ((0U == BandGapStatus) && (ElapsedTicks < TimeoutTicks))
3628     {
3629         BandGapStatus = AdcBasePtr->GPADC_READOUT & ADC_GPADC_READOUT_BG_OK_MASK;
3630         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3631     }
3632 #else
3633     while ((MsrStatus != ExpectedStatus) && (ElapsedTicks < TimeoutTicks))
3634     {
3635         MsrStatus = (*MSRAddr) & ADC_MSR_ADCSTATUS_MASK;
3636         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3637     }
3638 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3639 
3640     if (ElapsedTicks >= TimeoutTicks)
3641     {
3642         ReturnStatus = ADC_SAR_IP_STATUS_TIMEOUT;
3643     }
3644 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3645     else
3646     {
3647         /* Wait for 20us after BandGap is OK */
3648         TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_BANDGAP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3649         CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
3650         ElapsedTicks = 0u;
3651         while (ElapsedTicks < TimeoutTicks)
3652         {
3653             ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3654         }
3655     }
3656 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3657 
3658 #if (1U == FEATURE_ADC_HAS_CLOCK_DIVIDER)
3659     if (ADC_SAR_IP_STATUS_SUCCESS == ReturnStatus)
3660     {
3661         /* Ensure the clock div is enabled because it was automatically disabled when entering power-down mode */
3662         Adc_Sar_EnableClkDiv(u32Instance, TRUE);
3663     }
3664 #endif /* 1U == FEATURE_ADC_HAS_CLOCK_DIVIDER */
3665 
3666     return ReturnStatus;
3667 }
3668 
3669 /*FUNCTION**********************************************************************
3670 *
3671 * Function Name : Adc_Sar_Ip_Powerdown
3672 * Description   : This function disables the ADC module (by setting the Powerdown
3673 *  bit).
3674 *
3675 * @implements      Adc_Sar_Ip_Powerdown_Activity
3676 * END**************************************************************************/
Adc_Sar_Ip_Powerdown(const uint32 u32Instance)3677 Adc_Sar_Ip_StatusType Adc_Sar_Ip_Powerdown(const uint32 u32Instance)
3678 {
3679     const ADC_Type * AdcBasePtr = NULL_PTR;
3680 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3681     const SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3682 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3683     Adc_Sar_Ip_StatusType ReturnStatus = ADC_SAR_IP_STATUS_SUCCESS;
3684 
3685 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3686     uint32 BandGapStatus = 0u;
3687 #else
3688     uint32 ExpectedStatus = ADC_MSR_ADCSTATUS(ADC_SAR_IP_MSR_ADCSTATUS_POWER_DOWN);  /* expected status is powered down */
3689     uint32 MsrStatus;
3690     volatile const uint32 * MSRAddr = NULL_PTR;
3691 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3692     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
3693     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
3694     uint32 ElapsedTicks = 0u;
3695 
3696 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3697     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3698 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3699 
3700 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3701     if (u32Instance >= ADC_INSTANCE_COUNT)
3702     {
3703         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3704 #if !ADC_SAR_IP_HAS_BANDGAP_STATUS
3705         MSRAddr = (volatile const uint32 *)&(AdcAEBasePtr->MSR);
3706 #endif /* !ADC_SAR_IP_HAS_BANDGAP_STATUS */
3707     }
3708     else
3709 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3710     {
3711         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3712 #if !ADC_SAR_IP_HAS_BANDGAP_STATUS
3713         MSRAddr = (volatile const uint32 *)&(AdcBasePtr->MSR);
3714 #endif /* !ADC_SAR_IP_HAS_BANDGAP_STATUS */
3715     }
3716 
3717 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3718     BandGapStatus = AdcBasePtr->GPADC_READOUT & ADC_GPADC_READOUT_BG_OK_MASK;
3719 #else
3720     MsrStatus = (*MSRAddr) & ADC_MSR_ADCSTATUS_MASK;
3721 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3722 
3723     SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_14();
3724     Adc_Sar_Powerdown(u32Instance);
3725     SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_14();
3726 
3727     /* Wait for the device to power down */
3728 #if ADC_SAR_IP_HAS_BANDGAP_STATUS
3729     while ((1U == BandGapStatus) && (ElapsedTicks < TimeoutTicks))
3730     {
3731         BandGapStatus = AdcBasePtr->GPADC_READOUT & ADC_GPADC_READOUT_BG_OK_MASK;
3732         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3733     }
3734 #else
3735     while ((MsrStatus != ExpectedStatus) && (ElapsedTicks < TimeoutTicks))
3736     {
3737         MsrStatus = (*MSRAddr) & ADC_MSR_ADCSTATUS_MASK;
3738         ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
3739     }
3740 #endif /* ADC_SAR_IP_HAS_BANDGAP_STATUS */
3741 
3742     if (ElapsedTicks >= TimeoutTicks)
3743     {
3744         ReturnStatus = ADC_SAR_IP_STATUS_TIMEOUT;
3745     }
3746 
3747     return ReturnStatus;
3748 }
3749 
3750 #if ( \
3751      (STD_ON == ADC_SAR_IP_ECH_ENABLED) || (STD_ON == ADC_SAR_IP_JECH_ENABLED) || \
3752      (STD_ON == ADC_SAR_IP_EOC_ENABLED) || \
3753      ((ADC_SAR_IP_HAS_CTU == 1U) && (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)) \
3754     )
3755 /*FUNCTION**********************************************************************
3756 *
3757 * Function Name : Adc_Sar_Ip_EnableNotifications
3758 * Description   : This function enables the ADC notifications set to '1' in the
3759 *  mask parameter.
3760 *
3761 * @implements      Adc_Sar_Ip_EnableNotifications_Activity
3762 * END**************************************************************************/
Adc_Sar_Ip_EnableNotifications(const uint32 u32Instance,const uint32 u32NotificationMask)3763 void Adc_Sar_Ip_EnableNotifications(const uint32 u32Instance,
3764                                     const uint32 u32NotificationMask)
3765 {
3766     ADC_Type * AdcBasePtr = NULL_PTR;
3767 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3768     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3769 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3770     uint32 ImrFlags = 0U;
3771 
3772 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3773     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3774     DevAssert((u32NotificationMask & (~ADC_SAR_IP_NOTIF_FLAG_ALL)) == 0UL);
3775 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3776 
3777 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3778     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_EOC) != 0U) ? ADC_IMR_MSKEOC(1U) : 0U;
3779     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_EOC) != 0U) ? ADC_IMR_MSKJEOC(1U) : 0U;
3780 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3781 #if (STD_ON == ADC_SAR_IP_ECH_ENABLED)
3782     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN) != 0U) ? ADC_IMR_MSKECH(1U) : 0U;
3783 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) */
3784 #if (STD_ON == ADC_SAR_IP_JECH_ENABLED)
3785     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN) != 0U) ? ADC_IMR_MSKJECH(1U) : 0U;
3786 #endif /* (STD_ON == ADC_SAR_IP_JECH_ENABLED) */
3787 #if ADC_SAR_IP_HAS_CTU
3788 #if (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)
3789 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
3790     if (ADC_SAR_IP_INST_HAS_CTU(u32Instance))
3791     {
3792 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
3793         ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_CTU_EOC) != 0U) ? ADC_IMR_MSKEOCTU(1U) : 0U;
3794 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
3795     }
3796 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
3797 #endif /* (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) */
3798 #endif /* ADC_SAR_IP_HAS_CTU */
3799 
3800     /* Clear pending interrupt flags - CPR_RTD_01182 */
3801     Adc_Sar_Ip_ClearStatusFlags(u32Instance, ADC_SAR_IP_NOTIF_FLAG_ALL);
3802 
3803 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3804     if (u32Instance >= ADC_INSTANCE_COUNT)
3805     {
3806         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3807         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_33();
3808         AdcAEBasePtr->IMR |= ImrFlags;
3809         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_33();
3810     }
3811     else
3812 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3813     {
3814         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3815         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_33();
3816         AdcBasePtr->IMR |= ImrFlags;
3817         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_33();
3818     }
3819 }
3820 
3821 /*FUNCTION**********************************************************************
3822 *
3823 * Function Name : Adc_Sar_Ip_DisableNotifications
3824 * Description   : This function disables the ADC notifications set to '1' in the
3825 *  mask parameter.
3826 *
3827 * @implements      Adc_Sar_Ip_DisableNotifications_Activity
3828 * END**************************************************************************/
Adc_Sar_Ip_DisableNotifications(const uint32 u32Instance,const uint32 u32NotificationMask)3829 void Adc_Sar_Ip_DisableNotifications(const uint32 u32Instance,
3830                                      const uint32 u32NotificationMask)
3831 {
3832     ADC_Type * AdcBasePtr = NULL_PTR;
3833 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3834     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3835 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3836     uint32 ImrFlags = 0U;
3837 
3838 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3839     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3840     DevAssert((u32NotificationMask & (~ADC_SAR_IP_NOTIF_FLAG_ALL)) == 0UL);
3841 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3842 
3843 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3844     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_EOC) != 0U) ? ADC_IMR_MSKEOC(1U) : 0U;
3845     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_EOC) != 0U) ? ADC_IMR_MSKJEOC(1U) : 0U;
3846 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3847 #if (STD_ON == ADC_SAR_IP_ECH_ENABLED)
3848     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_NORMAL_ENDCHAIN) != 0U) ? ADC_IMR_MSKECH(1U) : 0U;
3849 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) */
3850 #if (STD_ON == ADC_SAR_IP_JECH_ENABLED)
3851     ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_INJECTED_ENDCHAIN) != 0U) ? ADC_IMR_MSKJECH(1U) : 0U;
3852 #endif /* (STD_ON == ADC_SAR_IP_JECH_ENABLED) */
3853 #if ADC_SAR_IP_HAS_CTU
3854 #if (STD_ON == ADC_SAR_IP_EOCTU_ENABLED)
3855 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
3856     if (ADC_SAR_IP_INST_HAS_CTU(u32Instance))
3857     {
3858 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
3859         ImrFlags |= ((u32NotificationMask & ADC_SAR_IP_NOTIF_FLAG_CTU_EOC) != 0U) ? ADC_IMR_MSKEOCTU(1U) : 0U;
3860 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
3861     }
3862 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
3863 #endif /* (STD_ON == ADC_SAR_IP_EOCTU_ENABLED) */
3864 #endif /* ADC_SAR_IP_HAS_CTU */
3865 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3866     if (u32Instance >= ADC_INSTANCE_COUNT)
3867     {
3868         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3869         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_34();
3870         AdcAEBasePtr->IMR &= ~(ImrFlags);
3871         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_34();
3872     }
3873     else
3874 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3875     {
3876         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3877         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_34();
3878         AdcBasePtr->IMR &= ~(ImrFlags);
3879         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_34();
3880     }
3881 }
3882 #endif /* (STD_ON == ADC_SAR_IP_ECH_ENABLED) .. */
3883 
3884 #if ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED))
3885 /*FUNCTION**********************************************************************
3886 *
3887 * Function Name : Adc_Sar_Ip_EnableChannelNotifications
3888 * Description   : This function enables End-of-Conversion and watchdog
3889 * interrupts generation for a single channel.
3890 *
3891 * @implements      Adc_Sar_Ip_EnableChannelNotifications_Activity
3892 * END**************************************************************************/
Adc_Sar_Ip_EnableChannelNotifications(const uint32 u32Instance,const uint32 u32ChnIdx,const uint32 u32Mask)3893 void Adc_Sar_Ip_EnableChannelNotifications(const uint32 u32Instance,
3894                                            const uint32 u32ChnIdx,
3895                                            const uint32 u32Mask)
3896 {
3897     ADC_Type * AdcBasePtr = NULL_PTR;
3898 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3899     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3900 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3901 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3902     volatile uint32 * CIMRAddr = NULL_PTR;
3903 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3904 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
3905     volatile uint32 * CWENRAddr = NULL_PTR;
3906 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
3907     uint32 VectAdr;
3908     uint32 VectBit;
3909 
3910 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3911     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3912     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
3913     DevAssert((u32Mask & ~(ADC_SAR_IP_CHAN_NOTIF_FLAG_ALL)) == 0UL);
3914 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
3915     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
3916 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
3917 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3918 
3919     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
3920     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
3921 
3922 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3923     if (u32Instance >= ADC_INSTANCE_COUNT)
3924     {
3925         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
3926 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3927         CIMRAddr = &(CIMR(AdcAEBasePtr, VectAdr));
3928 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3929 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
3930         CWENRAddr = &(CWENR(AdcAEBasePtr, VectAdr));
3931 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
3932     }
3933     else
3934 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3935     {
3936         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
3937 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3938         CIMRAddr = &(CIMR(AdcBasePtr, VectAdr));
3939 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3940 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
3941         CWENRAddr = &(CWENR(AdcBasePtr, VectAdr));
3942 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
3943     }
3944 
3945 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3946     if ((u32Mask & ADC_SAR_IP_CHAN_NOTIF_EOC) != 0u)
3947     {
3948         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_30();
3949         *CIMRAddr |= 1UL << VectBit;
3950         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_30();
3951     }
3952 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3953 
3954 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
3955     if ((u32Mask & ADC_SAR_IP_CHAN_NOTIF_WDG) != 0u)
3956     {
3957         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_28();
3958         *CWENRAddr |= 1UL << VectBit;
3959         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_28();
3960     }
3961 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
3962 }
3963 
3964 /*FUNCTION**********************************************************************
3965 *
3966 * Function Name : Adc_Sar_Ip_DisableChannelNotifications
3967 * Description   : This function disables End-of-Conversion and watchdog
3968 * interrupts generation for a single channel.
3969 *
3970 * @implements      Adc_Sar_Ip_DisableChannelNotifications_Activity
3971 * END**************************************************************************/
Adc_Sar_Ip_DisableChannelNotifications(const uint32 u32Instance,const uint32 u32ChnIdx,const uint32 u32Mask)3972 void Adc_Sar_Ip_DisableChannelNotifications(const uint32 u32Instance,
3973                                             const uint32 u32ChnIdx,
3974                                             const uint32 u32Mask)
3975 {
3976     ADC_Type * AdcBasePtr = NULL_PTR;
3977 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
3978     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
3979 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
3980 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
3981     volatile uint32 * CIMRAddr = NULL_PTR;
3982 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
3983 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
3984     volatile uint32 * CWENRAddr = NULL_PTR;
3985 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
3986     uint32 VectAdr;
3987     uint32 VectBit;
3988 
3989 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
3990     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
3991     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
3992     DevAssert((u32Mask & ~(ADC_SAR_IP_CHAN_NOTIF_FLAG_ALL)) == 0UL);
3993 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
3994     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
3995 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
3996 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
3997 
3998     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
3999     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
4000 
4001 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4002     if (u32Instance >= ADC_INSTANCE_COUNT)
4003     {
4004         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4005 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
4006         CIMRAddr = &(CIMR(AdcAEBasePtr, VectAdr));
4007 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
4008 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
4009         CWENRAddr = &(CWENR(AdcAEBasePtr, VectAdr));
4010 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
4011     }
4012     else
4013 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4014     {
4015         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4016 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
4017         CIMRAddr = &(CIMR(AdcBasePtr, VectAdr));
4018 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
4019 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
4020         CWENRAddr = &(CWENR(AdcBasePtr, VectAdr));
4021 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
4022     }
4023 
4024 #if (STD_ON == ADC_SAR_IP_EOC_ENABLED)
4025     if ((u32Mask & ADC_SAR_IP_CHAN_NOTIF_EOC) != 0u)
4026     {
4027         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_31();
4028         *CIMRAddr &= ~(1UL << VectBit);
4029         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_31();
4030     }
4031 #endif /* (STD_ON == ADC_SAR_IP_EOC_ENABLED) */
4032 
4033 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
4034     if ((u32Mask & ADC_SAR_IP_CHAN_NOTIF_WDG) != 0u)
4035     {
4036         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_29();
4037         *CWENRAddr &= ~(1UL << VectBit);
4038         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_29();
4039     }
4040 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
4041 }
4042 #endif /* ((STD_ON == ADC_SAR_IP_WDG_ENABLED) || (STD_ON == ADC_SAR_IP_EOC_ENABLED)) */
4043 
4044 /*FUNCTION**********************************************************************
4045 *
4046 * Function Name : Adc_Sar_Ip_SetClockMode
4047 * Description   : This function initializes the ADC clock configuration.
4048 *
4049 * @implements      Adc_Sar_Ip_SetClockMode_Activity
4050 * END**************************************************************************/
Adc_Sar_Ip_SetClockMode(const uint32 u32Instance,const Adc_Sar_Ip_ClockConfigType * const pConfig)4051 Adc_Sar_Ip_StatusType Adc_Sar_Ip_SetClockMode(const uint32 u32Instance,
4052                                               const Adc_Sar_Ip_ClockConfigType * const pConfig)
4053 {
4054     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
4055 #if ADC_SAR_IP_HAS_ADCLKSEL
4056     uint32 Mcr = 0u;
4057     volatile uint32 * MCRAddr = NULL_PTR;
4058 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
4059     volatile uint32 * PDEDRAddr = NULL_PTR;
4060     ADC_Type * AdcBasePtr = NULL_PTR;
4061 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4062     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4063 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4064 
4065 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4066     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4067     DevAssert(pConfig != NULL_PTR);
4068 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4069 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4070     /* calibration must not be interrupted */
4071     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
4072     {
4073 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4074 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4075         if (u32Instance >= ADC_INSTANCE_COUNT)
4076         {
4077             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4078 #if ADC_SAR_IP_HAS_ADCLKSEL
4079             MCRAddr =(volatile uint32 *) &(AdcAEBasePtr->MCR);
4080 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
4081             PDEDRAddr = (volatile uint32 *)&(AdcAEBasePtr->PDEDR);
4082         }
4083         else
4084 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4085         {
4086             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4087 #if ADC_SAR_IP_HAS_ADCLKSEL
4088             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
4089 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
4090             PDEDRAddr = (volatile uint32 *)&(AdcBasePtr->PDEDR);
4091         }
4092 
4093 #if ADC_SAR_IP_HAS_ADCLKSEL
4094         /* Read MCR value and clear values that will be replaced */
4095         Mcr |= Adc_Sar_GetADCLKSELValue(pConfig->ClkSelect);
4096 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
4097         Status = Adc_Sar_Ip_Powerdown(u32Instance);
4098         if (ADC_SAR_IP_STATUS_SUCCESS == Status)
4099         {
4100 #if ADC_SAR_IP_HAS_ADCLKSEL
4101             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_15();
4102             *MCRAddr = ((*MCRAddr) & ~(ADC_MCR_ADCLKSEL_MASK)) | Mcr;
4103             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_15();
4104 #endif /* ADC_SAR_IP_HAS_ADCLKSEL */
4105 
4106             Status = Adc_Sar_Ip_Powerup(u32Instance);
4107             if (ADC_SAR_IP_STATUS_SUCCESS == Status)
4108             {
4109 #if FEATURE_ADC_HAS_HIGH_SPEED_ENABLE
4110                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_51();
4111                 /* Enables high speed conversion or calibration */
4112                 Adc_Sar_EnableHighSpeed(AdcBasePtr, pConfig->HighSpeedConvEn);
4113                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_51();
4114 #endif /* FEATURE_ADC_HAS_HIGH_SPEED_ENABLE */
4115 
4116 #if FEATURE_ADC_HAS_AVERAGING
4117                 Adc_Sar_Ip_SetAveraging(u32Instance, pConfig->AvgEn, pConfig->AvgSel);
4118 #endif /* FEATURE_ADC_HAS_AVERAGING */
4119 
4120                 /* Set powerdown delay */
4121                 *PDEDRAddr = ADC_PDEDR_PDED(pConfig->PowerDownDelay);
4122 
4123 #if FEATURE_ADC_HAS_CONVERSION_TIMING
4124                 /* Set sample times */
4125                 Adc_Sar_Ip_SetSampleTimes(u32Instance, pConfig->SampleTimeArr);
4126 #endif /* FEATURE_ADC_HAS_CONVERSION_TIMING */
4127             }
4128         }
4129 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4130     }
4131     else
4132     {
4133         Status = ADC_SAR_IP_STATUS_CAL_ONGOING;
4134     }
4135 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4136     return Status;
4137 }
4138 
4139 #if FEATURE_ADC_HAS_CONVERSION_TIMING
4140 /*FUNCTION**********************************************************************
4141 *
4142 * Function Name : Adc_Sar_Ip_SetSampleTimes
4143 * Description   : This function sets the sample times for each channnel group.
4144 *
4145 * @implements      Adc_Sar_Ip_SetSampleTimes_Activity
4146 * END**************************************************************************/
Adc_Sar_Ip_SetSampleTimes(const uint32 u32Instance,const uint8 * const aSampleTimes)4147 void Adc_Sar_Ip_SetSampleTimes(const uint32 u32Instance,
4148                                const uint8 * const aSampleTimes)
4149 {
4150     ADC_Type * AdcBasePtr = NULL_PTR;
4151 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4152     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4153 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4154     uint8 Index;
4155 
4156 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4157     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4158 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4159 
4160 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4161     if (u32Instance >= ADC_INSTANCE_COUNT)
4162     {
4163         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4164         for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
4165         {
4166             /* Set sample times */
4167             CTR(AdcAEBasePtr, Index) = ADC_CTR_INPSAMP(aSampleTimes[Index]);
4168         }
4169     }
4170     else
4171 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4172     {
4173         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4174         for (Index = 0u; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
4175         {
4176             /* Set sample times */
4177             CTR(AdcBasePtr, Index) = ADC_CTR_INPSAMP(aSampleTimes[Index]);
4178         }
4179     }
4180 }
4181 #endif /* FEATURE_ADC_HAS_CONVERSION_TIMING */
4182 
4183 
4184 /*FUNCTION**********************************************************************
4185 *
4186 * Function Name : Adc_Sar_Ip_AbortConversion
4187 * Description   : This function aborts an ongoing conversion.
4188 *
4189 * @implements      Adc_Sar_Ip_AbortConversion_Activity
4190 * END**************************************************************************/
Adc_Sar_Ip_AbortConversion(const uint32 u32Instance)4191 void Adc_Sar_Ip_AbortConversion(const uint32 u32Instance)
4192 {
4193     ADC_Type * AdcBasePtr = NULL_PTR;
4194 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4195     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4196 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4197 
4198 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4199     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4200 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4201 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4202     /* calibration must not be interrupted */
4203     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
4204 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4205     {
4206 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4207         if (u32Instance >= ADC_INSTANCE_COUNT)
4208         {
4209             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4210             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_17();
4211             AdcAEBasePtr->MCR |= ADC_MCR_ABORT(1U);
4212             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_17();
4213         }
4214         else
4215     #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4216         {
4217             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4218             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_17();
4219             AdcBasePtr->MCR |= ADC_MCR_ABORT(1U);
4220             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_17();
4221         }
4222 
4223     }
4224 }
4225 
4226 /*FUNCTION**********************************************************************
4227 *
4228 * Function Name : Adc_Sar_Ip_AbortChain
4229 * Description   : This function aborts an ongoing chain of conversions.
4230 *
4231 * @implements      Adc_Sar_Ip_AbortChain_Activity
4232 * END**************************************************************************/
Adc_Sar_Ip_AbortChain(const uint32 u32Instance,const boolean bBlocking,const boolean bAllowRestart)4233 Adc_Sar_Ip_StatusType Adc_Sar_Ip_AbortChain(const uint32 u32Instance,
4234                                             const boolean bBlocking,
4235                                             const boolean bAllowRestart)
4236 {
4237     ADC_Type * AdcBasePtr = NULL_PTR;
4238 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4239     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4240 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4241     volatile uint32 * MCRAddr = NULL_PTR;
4242     volatile const uint32 * MSRAddr = NULL_PTR;
4243     uint32 MsrStatus;
4244     uint32 TimeoutTicks = OsIf_MicrosToTicks(ADC_SAR_IP_TIMEOUT_VAL, ADC_SAR_IP_TIMEOUT_TYPE);
4245     uint32 CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
4246     uint32 ElapsedTicks = 0u;
4247     Adc_Sar_Ip_StatusType ReturnStatus = ADC_SAR_IP_STATUS_SUCCESS;
4248 
4249 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4250     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4251 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4252 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4253     /* calibration must not be interrupted */
4254     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
4255     {
4256 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4257 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4258         if (u32Instance >= ADC_INSTANCE_COUNT)
4259         {
4260             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4261             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
4262             MSRAddr = (volatile uint32 *)&(AdcAEBasePtr->MSR);
4263         }
4264         else
4265 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4266         {
4267             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4268             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
4269             MSRAddr = (volatile uint32 *)&(AdcBasePtr->MSR);
4270         }
4271 
4272         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_18();
4273         /* The behavior of the ADC depends on MCR[MODE] (One-Shot/Scan Operation modes).
4274         If Scan Operation mode is disabled, MSR[NSTART] is automatically reset together with MCR[ABORTCHAIN].
4275         Otherwise, in Scan Operation mode, a new chain is started. Therefore MCR[NSTART] should be cleared
4276         before abort the current chain of conversions. */
4277         if (!bAllowRestart)
4278         {
4279             *MCRAddr &= ~(ADC_MCR_NSTART(1U));
4280 #if ADC_SAR_IP_ABORTCHAIN_WORKAROUND
4281             /* Workaround to fix abort chain cannot clear MSR[NSTART] bit in scan mode */
4282             while (ElapsedTicks < TimeoutTicks)
4283             {
4284                 ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
4285             }
4286 #endif /* ADC_SAR_IP_ABORTCHAIN_WORKAROUND */
4287         }
4288         *MCRAddr |= ADC_MCR_ABORTCHAIN(1U);
4289         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_18();
4290 
4291         if (bBlocking)
4292         {
4293 #if ADC_SAR_IP_ABORTCHAIN_WORKAROUND
4294             CurrentTicks = OsIf_GetCounter(ADC_SAR_IP_TIMEOUT_TYPE);
4295             ElapsedTicks = 0u;
4296 #endif /* ADC_SAR_IP_ABORTCHAIN_WORKAROUND */
4297             /* Wait for the ongoing conversion to stop */
4298             MsrStatus = *MSRAddr & ADC_MSR_NSTART_MASK;
4299             while ((MsrStatus == ADC_MSR_NSTART_MASK) && (ElapsedTicks < TimeoutTicks))
4300             {
4301                 MsrStatus = *MSRAddr & ADC_MSR_NSTART_MASK;
4302                 ElapsedTicks += OsIf_GetElapsed(&CurrentTicks, ADC_SAR_IP_TIMEOUT_TYPE);
4303             }
4304             if (ElapsedTicks >= TimeoutTicks)
4305             {
4306                 ReturnStatus = ADC_SAR_IP_STATUS_TIMEOUT;
4307             }
4308 #if !ADC_SAR_IP_W1C_ABORT
4309             else
4310             {
4311                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_18();
4312                 /* Clear the ABORT_CHAIN bit if set, otherwise the next chain will be ABORTED without any End of Chain Interrupt */
4313                 if (((*MCRAddr) & ADC_MCR_ABORTCHAIN_MASK) != 0u)
4314                 {
4315                     *MCRAddr &= ~(ADC_MCR_ABORTCHAIN(1U));
4316                 }
4317                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_18();
4318             }
4319 #endif /* ADC_SAR_IP_W1C_ABORT */
4320         }
4321 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4322     }
4323     else
4324     {
4325         ReturnStatus = ADC_SAR_IP_STATUS_CAL_ONGOING;
4326     }
4327 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4328     return ReturnStatus;
4329 }
4330 
4331 #if FEATURE_ADC_HAS_PRESAMPLING
4332 /*FUNCTION**********************************************************************
4333 *
4334 * Function Name : Adc_Sar_Ip_SetPresamplingSource
4335 * Description   : This function configures the Presampling Source for a channel group (0-31, 32-63, 64 -95)
4336 *
4337 * @implements      Adc_Sar_Ip_SetPresamplingSource_Activity
4338 * END**************************************************************************/
Adc_Sar_Ip_SetPresamplingSource(const uint32 u32Instance,const Adc_Sar_Ip_ChanGroupType pChanGroup,const Adc_Sar_Ip_PresamplingSourceType pPresampleSource)4339 void Adc_Sar_Ip_SetPresamplingSource(const uint32 u32Instance,
4340                                      const Adc_Sar_Ip_ChanGroupType pChanGroup,
4341                                      const Adc_Sar_Ip_PresamplingSourceType pPresampleSource)
4342 {
4343     uint32 Pscr;
4344     ADC_Type * AdcBasePtr = NULL_PTR;
4345 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4346     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4347 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4348     volatile uint32 * PSCRAddr = NULL_PTR;
4349 
4350 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4351     if (u32Instance >= ADC_INSTANCE_COUNT)
4352     {
4353         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4354         PSCRAddr = (volatile uint32 *)&(AdcAEBasePtr->PSCR);
4355     }
4356     else
4357 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4358     {
4359         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4360         PSCRAddr = (volatile uint32 *)&(AdcBasePtr->PSCR);
4361     }
4362 
4363 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4364     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4365 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4366 
4367 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4368     if (ADC_SAR_IP_INST_HAS_PSCR(u32Instance))
4369     {
4370 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4371 
4372         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_38();
4373 
4374         Pscr = *PSCRAddr;
4375 
4376         switch (pChanGroup)
4377         {
4378 #ifdef ADC_PSCR_PREVAL0
4379             case ADC_SAR_IP_CHAN_GROUP_0:
4380                 Pscr &= ~(ADC_PSCR_PREVAL0_MASK);
4381                 Pscr |= ADC_PSCR_PREVAL0((uint32)pPresampleSource);
4382                 break;
4383 #endif /* ADC_PSCR_PREVAL0 */
4384 #ifdef ADC_PSCR_PREVAL1
4385             case ADC_SAR_IP_CHAN_GROUP_1:
4386                 Pscr &= ~(ADC_PSCR_PREVAL1_MASK);
4387                 Pscr |= ADC_PSCR_PREVAL1((uint32)pPresampleSource);
4388                 break;
4389 #endif /* ADC_PSCR_PREVAL1 */
4390 #ifdef ADC_PSCR_PREVAL2
4391             case ADC_SAR_IP_CHAN_GROUP_2:
4392                 Pscr &= ~(ADC_PSCR_PREVAL2_MASK);
4393                 Pscr |= ADC_PSCR_PREVAL2((uint32)pPresampleSource);
4394                 break;
4395 #endif /* ADC_PSCR_PREVAL2 */
4396             default:
4397                 ; /* no-op */
4398 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4399                 /* Not supported */
4400                 DevAssert(FALSE);
4401 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4402                 break;
4403         }
4404 
4405         *PSCRAddr = Pscr;
4406 
4407         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_38();
4408 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4409     }
4410 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4411 }
4412 
4413 /*FUNCTION**********************************************************************
4414 *
4415 * Function Name : Adc_Sar_Ip_EnableChannelPresampling
4416 * Description   : This function enables the Presampling on one channel of the ADC.
4417 *
4418 * @implements      Adc_Sar_Ip_EnableChannelPresampling_Activity
4419 * END**************************************************************************/
Adc_Sar_Ip_EnableChannelPresampling(const uint32 u32Instance,const uint32 u32ChnIdx)4420 void Adc_Sar_Ip_EnableChannelPresampling(const uint32 u32Instance,
4421                                          const uint32 u32ChnIdx)
4422 {
4423     uint32 VectAdr;
4424     uint32 VectBit;
4425     ADC_Type * AdcBasePtr = NULL_PTR;
4426 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4427     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4428 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4429 
4430 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4431     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4432     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
4433 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
4434     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
4435 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
4436 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4437 
4438 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4439     if (ADC_SAR_IP_INST_HAS_PSCR(u32Instance))
4440     {
4441 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4442         VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
4443         VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
4444 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4445         if (u32Instance >= ADC_INSTANCE_COUNT)
4446         {
4447             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4448             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_41();
4449             PSR(AdcAEBasePtr, VectAdr) |= 1UL << VectBit;
4450             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_41();
4451         }
4452         else
4453 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4454         {
4455             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4456             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_41();
4457             PSR(AdcBasePtr, VectAdr) |= 1UL << VectBit;
4458             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_41();
4459         }
4460 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4461     }
4462 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4463 }
4464 
4465 /*FUNCTION**********************************************************************
4466 *
4467 * Function Name : Adc_Sar_Ip_DisableChannelPresampling
4468 * Description   : This function disables the Presampling on one channel of the ADC.
4469 *
4470 * @implements      Adc_Sar_Ip_DisableChannelPresampling_Activity
4471 * END**************************************************************************/
Adc_Sar_Ip_DisableChannelPresampling(const uint32 u32Instance,const uint32 u32ChnIdx)4472 void Adc_Sar_Ip_DisableChannelPresampling(const uint32 u32Instance,
4473                                           const uint32 u32ChnIdx)
4474 {
4475     uint32 VectAdr;
4476     uint32 VectBit;
4477     ADC_Type * AdcBasePtr = NULL_PTR;
4478 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4479     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4480 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4481 
4482 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4483     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4484     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
4485 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
4486     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
4487 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
4488 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4489 
4490 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4491     if (ADC_SAR_IP_INST_HAS_PSCR(u32Instance))
4492     {
4493 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4494         VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
4495         VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
4496 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4497         if (u32Instance >= ADC_INSTANCE_COUNT)
4498         {
4499             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4500             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_42();
4501             PSR(AdcAEBasePtr, VectAdr) &= ~(1UL << VectBit);
4502             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_42();
4503         }
4504         else
4505 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4506         {
4507             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4508             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_42();
4509             PSR(AdcBasePtr, VectAdr) &= ~(1UL << VectBit);
4510             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_42();
4511         }
4512 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4513     }
4514 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4515 }
4516 
4517 /*FUNCTION**********************************************************************
4518 *
4519 * Function Name : Adc_Sar_Ip_EnablePresampleConversion
4520 * Description   : This function enables bypass of the Sampling Phase, resulting in a conversion
4521 * of the presampled data. This is available only for channels that have presampling
4522 * enabled.
4523 *
4524 * @implements      Adc_Sar_Ip_EnablePresampleConversion_Activity
4525 * END**************************************************************************/
Adc_Sar_Ip_EnablePresampleConversion(const uint32 u32Instance)4526 void Adc_Sar_Ip_EnablePresampleConversion(const uint32 u32Instance)
4527 {
4528     ADC_Type * AdcBasePtr = NULL_PTR;
4529 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4530     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4531 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4532 
4533 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4534     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4535 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4536 
4537 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4538     if (ADC_SAR_IP_INST_HAS_PSCR(u32Instance))
4539     {
4540 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4541 
4542 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4543         if (u32Instance >= ADC_INSTANCE_COUNT)
4544         {
4545             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4546             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_39();
4547             AdcAEBasePtr->PSCR |= ADC_PSCR_PRECONV(1U);
4548             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_39();
4549         }
4550         else
4551 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4552         {
4553             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4554             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_39();
4555             AdcBasePtr->PSCR |= ADC_PSCR_PRECONV(1U);
4556             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_39();
4557         }
4558 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4559     }
4560 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4561 }
4562 
4563 /*FUNCTION**********************************************************************
4564 *
4565 * Function Name : Adc_Sar_Ip_DisablePresampleConversion
4566 * Description   : This function disables Sampling Phase bypass.
4567 *
4568 * @implements      Adc_Sar_Ip_DisablePresampleConversion_Activity
4569 * END**************************************************************************/
Adc_Sar_Ip_DisablePresampleConversion(const uint32 u32Instance)4570 void Adc_Sar_Ip_DisablePresampleConversion(const uint32 u32Instance)
4571 {
4572     ADC_Type * AdcBasePtr = NULL_PTR;
4573 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4574     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4575 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4576 
4577 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4578     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4579 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4580 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4581     if (ADC_SAR_IP_INST_HAS_PSCR(u32Instance))
4582     {
4583 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4584 
4585 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4586         if (u32Instance >= ADC_INSTANCE_COUNT)
4587         {
4588             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4589             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_40();
4590             AdcAEBasePtr->PSCR &= ~(ADC_PSCR_PRECONV(1U));
4591             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_40();
4592         }
4593         else
4594 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4595         {
4596             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4597             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_40();
4598             AdcBasePtr->PSCR &= ~(ADC_PSCR_PRECONV(1U));
4599             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_40();
4600         }
4601 
4602 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
4603     }
4604 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE */
4605 }
4606 #endif /* FEATURE_ADC_HAS_PRESAMPLING */
4607 
4608 /*FUNCTION**********************************************************************
4609 *
4610 * Function Name : Adc_Sar_Ip_EnableDma
4611 * Description   : This function enables requests to DMA from ADC
4612 *
4613 * @implements      Adc_Sar_Ip_EnableDma_Activity
4614 * END**************************************************************************/
Adc_Sar_Ip_EnableDma(const uint32 u32Instance)4615 void Adc_Sar_Ip_EnableDma(const uint32 u32Instance)
4616 {
4617     ADC_Type * AdcBasePtr = NULL_PTR;
4618 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4619     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4620 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4621 
4622 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4623     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4624 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4625 
4626 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4627     if (u32Instance >= ADC_INSTANCE_COUNT)
4628     {
4629         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4630         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_43();
4631         AdcAEBasePtr->DMAE |= ADC_DMAE_DMAEN(1U);
4632         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_43();
4633     }
4634     else
4635 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4636     {
4637         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4638         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_43();
4639         AdcBasePtr->DMAE |= ADC_DMAE_DMAEN(1U);
4640         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_43();
4641     }
4642 }
4643 
4644 /*FUNCTION**********************************************************************
4645 *
4646 * Function Name : Adc_Sar_Ip_DisableDma
4647 * Description   : This function disables requests to DMA from ADC
4648 *
4649 * @implements      Adc_Sar_Ip_DisableDma_Activity
4650 * END**************************************************************************/
Adc_Sar_Ip_DisableDma(const uint32 u32Instance)4651 void Adc_Sar_Ip_DisableDma(const uint32 u32Instance)
4652 {
4653     ADC_Type * AdcBasePtr = NULL_PTR;
4654 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4655     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4656 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4657 
4658 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4659     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4660 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4661 
4662 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4663     if (u32Instance >= ADC_INSTANCE_COUNT)
4664     {
4665         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4666         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_44();
4667         AdcAEBasePtr->DMAE &= ~(ADC_DMAE_DMAEN(1U));
4668         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_44();
4669     }
4670     else
4671 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4672     {
4673         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4674         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_44();
4675         AdcBasePtr->DMAE &= ~(ADC_DMAE_DMAEN(1U));
4676         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_44();
4677     }
4678 }
4679 
4680 /*FUNCTION**********************************************************************
4681 *
4682 * Function Name : Adc_Sar_Ip_EnableChannelDma
4683 * Description   : This function enables DMA requests triggered by End of Conversion event from
4684 *  a selected channel.
4685 *
4686 * @implements      Adc_Sar_Ip_EnableChannelDma_Activity
4687 * END**************************************************************************/
Adc_Sar_Ip_EnableChannelDma(const uint32 u32Instance,const uint32 u32ChnIdx)4688 void Adc_Sar_Ip_EnableChannelDma(const uint32 u32Instance,
4689                                  const uint32 u32ChnIdx)
4690 {
4691     ADC_Type * AdcBasePtr = NULL_PTR;
4692 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4693     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4694 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4695     uint32 VectAdr;
4696     uint32 VectBit;
4697 
4698 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4699     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4700     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
4701 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
4702     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
4703 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
4704 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4705 
4706     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
4707     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
4708 
4709 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4710     if (u32Instance >= ADC_INSTANCE_COUNT)
4711     {
4712         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4713         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_46();
4714         DMAR(AdcAEBasePtr, VectAdr) |= 1UL << VectBit;
4715         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_46();
4716     }
4717     else
4718 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4719     {
4720         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4721         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_46();
4722         DMAR(AdcBasePtr, VectAdr) |= 1UL << VectBit;
4723         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_46();
4724     }
4725 }
4726 
4727 /*FUNCTION**********************************************************************
4728 *
4729 * Function Name : Adc_Sar_Ip_DisableChannelDma
4730 * Description   : This function disables DMA requests triggered by End of Conversion event from
4731 *  a selected channel.
4732 *
4733 * @implements      Adc_Sar_Ip_DisableChannelDma_Activity
4734 * END**************************************************************************/
Adc_Sar_Ip_DisableChannelDma(const uint32 u32Instance,const uint32 u32ChnIdx)4735 void Adc_Sar_Ip_DisableChannelDma(const uint32 u32Instance,
4736                                   const uint32 u32ChnIdx)
4737 {
4738     ADC_Type * AdcBasePtr = NULL_PTR;
4739 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4740     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4741 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4742     uint32 VectAdr;
4743     uint32 VectBit;
4744 
4745 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4746     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4747     DevAssert(u32ChnIdx < ADC_SAR_IP_CDR_COUNT);
4748 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
4749     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChnIdx));
4750 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
4751 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4752 
4753     VectAdr = ADC_SAR_IP_CHAN_2_VECT(u32ChnIdx);
4754     VectBit = ADC_SAR_IP_CHAN_2_BIT(u32ChnIdx);
4755 
4756 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4757     if (u32Instance >= ADC_INSTANCE_COUNT)
4758     {
4759         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4760         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_47();
4761         DMAR(AdcAEBasePtr, VectAdr) &= ~(1UL << VectBit);
4762         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_47();
4763     }
4764     else
4765 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4766     {
4767         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4768         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_47();
4769         DMAR(AdcBasePtr, VectAdr) &= ~(1UL << VectBit);
4770         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_47();
4771     }
4772 }
4773 
4774 /*FUNCTION**********************************************************************
4775 *
4776 * Function Name : Adc_Sar_Ip_DisableChannelDmaAll
4777 * Description   : This function disables DMA requests triggered by End of Conversion event from
4778 *  all channels.
4779 *
4780 * @implements      Adc_Sar_Ip_DisableChannelDmaAll_Activity
4781 * END**************************************************************************/
Adc_Sar_Ip_DisableChannelDmaAll(const uint32 u32Instance)4782 void Adc_Sar_Ip_DisableChannelDmaAll(const uint32 u32Instance)
4783 {
4784     ADC_Type * AdcBasePtr = NULL_PTR;
4785 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4786     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4787 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4788     uint8 Index;
4789 
4790 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4791     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4792 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4793 
4794 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4795     if (u32Instance >= ADC_INSTANCE_COUNT)
4796     {
4797         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4798         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
4799         {
4800             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_48();
4801             DMAR(AdcAEBasePtr, Index) &= ~(Adc_Sar_Ip_au32AdcChanBitmap[u32Instance][Index]);
4802             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_48();
4803         }
4804     }
4805     else
4806 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4807     {
4808         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4809         for (Index = 0U; Index < Adc_Sar_Ip_au8AdcGroupCount[u32Instance]; Index++)
4810         {
4811             SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_48();
4812             DMAR(AdcBasePtr, Index) &= ~(Adc_Sar_Ip_au32AdcChanBitmap[u32Instance][Index]);
4813             SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_48();
4814         }
4815     }
4816 }
4817 
4818 /*FUNCTION**********************************************************************
4819 *
4820 * Function Name : Adc_Sar_Ip_SetDmaClearSource
4821 * Description   : This function selects the DMA Request Flag Clear Source.
4822 *
4823 * @implements      Adc_Sar_Ip_SetDmaClearSource_Activity
4824 * END**************************************************************************/
Adc_Sar_Ip_SetDmaClearSource(const uint32 u32Instance,const Adc_Sar_Ip_ClearSourceType pDmaClear)4825 void Adc_Sar_Ip_SetDmaClearSource(const uint32 u32Instance,
4826                                   const Adc_Sar_Ip_ClearSourceType pDmaClear)
4827 {
4828     ADC_Type * AdcBasePtr = NULL_PTR;
4829 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4830     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4831 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4832 
4833 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4834     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4835 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4836 
4837 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4838     if (u32Instance >= ADC_INSTANCE_COUNT)
4839     {
4840         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4841         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_45();
4842         AdcAEBasePtr->DMAE &= ~(ADC_DMAE_DCLR_MASK);
4843         AdcAEBasePtr->DMAE |= ADC_DMAE_DCLR((uint32)pDmaClear);
4844         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_45();
4845     }
4846     else
4847 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4848     {
4849         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4850         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_45();
4851         AdcBasePtr->DMAE &= ~(ADC_DMAE_DCLR_MASK);
4852         AdcBasePtr->DMAE |= ADC_DMAE_DCLR((uint32)pDmaClear);
4853         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_45();
4854     }
4855 }
4856 
4857 #if (STD_ON == ADC_SAR_IP_WDG_ENABLED)
4858 /*FUNCTION**********************************************************************
4859 *
4860 * Function Name : Adc_Sar_Ip_SetWdgThreshold
4861 * Description   : This function sets the watchdog thresholds for a certain register.
4862 *
4863 * @implements      Adc_Sar_Ip_SetWdgThreshold_Activity
4864 * END**************************************************************************/
Adc_Sar_Ip_SetWdgThreshold(const uint32 u32Instance,const uint8 u8RegisterIdx,const Adc_Sar_Ip_WdgThresholdType * const pThresholdValues)4865 void Adc_Sar_Ip_SetWdgThreshold(const uint32 u32Instance,
4866                                 const uint8 u8RegisterIdx,
4867                                 const Adc_Sar_Ip_WdgThresholdType * const pThresholdValues)
4868 {
4869     ADC_Type * AdcBasePtr = NULL_PTR;
4870 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4871     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4872 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4873     volatile uint32 * WTIMRAddr = NULL_PTR;
4874 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
4875     uint8 Shift;
4876     uint16 HighThreshold;
4877     uint16 LowThreshold;
4878 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
4879     uint32 Wtimr;
4880 
4881 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4882     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4883     DevAssert(pThresholdValues != NULL_PTR);
4884     DevAssert(u8RegisterIdx < ADC_SAR_IP_THRHLR_COUNT);
4885 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4886 
4887 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4888     if (u32Instance >= ADC_INSTANCE_COUNT)
4889     {
4890         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4891         WTIMRAddr = (volatile uint32 *)&(AdcAEBasePtr->WTIMR);
4892     }
4893     else
4894 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4895     {
4896         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4897         WTIMRAddr = (volatile uint32 *)&(AdcBasePtr->WTIMR);
4898     }
4899 
4900 #if (ADC_SAR_IP_SET_RESOLUTION == STD_ON)
4901     if (FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].BypassResolution)
4902     {
4903         /* Calculate the shift of the threshold value to get the number of bits
4904          * needed by the hardware unit. */
4905         Shift = ADC_SAR_IP_RESULT_RESOLUTION - Adc_Sar_GetResolution(u32Instance);
4906         /* Shift the threshold to obtain the value to be written in the threshold register. */
4907         HighThreshold = (pThresholdValues->HighThreshold) << Shift;
4908         LowThreshold = (pThresholdValues->LowThreshold) << Shift;
4909 
4910         /* If the bits of the high threshold value that are ignored due to
4911          * resolution remain 0, this will trigger interrupts when the conversion
4912          * value is equal to the high threshold value because the ignored bits
4913          * of the conversion result will be more than 0, so the high threshold
4914          * value will need to have the ignored bits set to 1. */
4915         HighThreshold |= (((uint16)1U << Shift) - 1U);
4916 
4917         Adc_Sar_WriteThresholds(u32Instance, u8RegisterIdx, HighThreshold, LowThreshold);
4918     }
4919     else
4920 #endif /* (ADC_SAR_IP_SET_RESOLUTION == STD_ON) */
4921     {
4922         Adc_Sar_WriteThresholds(u32Instance, u8RegisterIdx, pThresholdValues->HighThreshold, pThresholdValues->LowThreshold);
4923     }
4924 
4925     SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_32();
4926 
4927     Wtimr = *WTIMRAddr;
4928 
4929     if (pThresholdValues->HighThresholdIntEn)
4930     {
4931         Wtimr |= (ADC_SAR_IP_WDG_REG_MASK_HIGH(u8RegisterIdx));
4932     }
4933     else
4934     {
4935         Wtimr &= (~ADC_SAR_IP_WDG_REG_MASK_HIGH(u8RegisterIdx));
4936     }
4937     if (pThresholdValues->LowThresholdIntEn)
4938     {
4939         Wtimr |= (ADC_SAR_IP_WDG_REG_MASK_LOW(u8RegisterIdx));
4940     }
4941     else
4942     {
4943         Wtimr &= (~ADC_SAR_IP_WDG_REG_MASK_LOW(u8RegisterIdx));
4944     }
4945 
4946     *WTIMRAddr = Wtimr;
4947 
4948     SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_32();
4949 }
4950 #endif /* (STD_ON == ADC_SAR_IP_WDG_ENABLED) */
4951 
4952 /*FUNCTION**********************************************************************
4953 *
4954 * Function Name : Adc_Sar_Ip_SetConversionMode
4955 * Description   : This function configures the used conversion mode.
4956 * Note: The ADC instance must be in IDLE state in order to change this.
4957 *
4958 * @implements      Adc_Sar_Ip_SetConversionMode_Activity
4959 * END**************************************************************************/
Adc_Sar_Ip_SetConversionMode(const uint32 u32Instance,const Adc_Sar_Ip_ConvModeType eConvMode)4960 void Adc_Sar_Ip_SetConversionMode(const uint32 u32Instance,
4961                                   const Adc_Sar_Ip_ConvModeType eConvMode)
4962 {
4963     ADC_Type * AdcBasePtr = NULL_PTR;
4964 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4965     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
4966 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4967 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4968     volatile const uint32 * MSRAddr = NULL_PTR;
4969 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4970     volatile uint32 * MCRAddr = NULL_PTR;
4971 
4972 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4973     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
4974 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4975 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
4976     /* calibration must not be interrupted */
4977     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
4978 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
4979     {
4980 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
4981         if (u32Instance >= ADC_INSTANCE_COUNT)
4982         {
4983             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
4984 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4985             MSRAddr = (volatile uint32 *)&(AdcAEBasePtr->MSR);
4986 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4987             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
4988         }
4989         else
4990 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
4991         {
4992             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
4993 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
4994             MSRAddr = (volatile uint32 *)&(AdcBasePtr->MSR);
4995 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
4996             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
4997         }
4998 
4999 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5000         /* The selected ADC should be in IDLE state */
5001         DevAssert(((*MSRAddr) & ADC_MSR_ADCSTATUS_MASK) == ADC_MSR_ADCSTATUS(ADC_SAR_IP_MSR_ADCSTATUS_IDLE));
5002 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5003 
5004         /* Edit MODE */
5005         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_19();
5006         switch (eConvMode)
5007         {
5008             case ADC_SAR_IP_CONV_MODE_ONESHOT:
5009                 *MCRAddr &= ~(ADC_MCR_MODE(1u)); /* MODE = 0 */
5010                 break;
5011             case ADC_SAR_IP_CONV_MODE_SCAN:
5012                 *MCRAddr |= ADC_MCR_MODE(1u); /* MODE = 1 */
5013                 break;
5014             default:
5015                 ; /* no-op */
5016                 break;
5017         }
5018         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_19();
5019     }
5020 }
5021 
5022 #if ADC_SAR_IP_HAS_CTU
5023 /*FUNCTION**********************************************************************
5024 *
5025 * Function Name : Adc_Sar_Ip_SetCtuMode
5026 * Description   : This function configures the CTU mode and enable.
5027 *
5028 * @implements      Adc_Sar_Ip_SetCtuMode_Activity
5029 * END**************************************************************************/
Adc_Sar_Ip_SetCtuMode(const uint32 u32Instance,const Adc_Sar_Ip_CtuModeType eCtuMode)5030 Adc_Sar_Ip_StatusType Adc_Sar_Ip_SetCtuMode(const uint32 u32Instance,
5031                                             const Adc_Sar_Ip_CtuModeType eCtuMode)
5032 {
5033     ADC_Type * AdcBasePtr = NULL_PTR;
5034 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5035     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
5036 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5037     Adc_Sar_Ip_StatusType Status = ADC_SAR_IP_STATUS_SUCCESS;
5038     volatile uint32 * MCRAddr = NULL_PTR;
5039 
5040 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5041     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
5042 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
5043     DevAssert(!((FALSE == ADC_SAR_IP_INST_HAS_CTU_TRIGGER_MODE(u32Instance)) && (ADC_SAR_IP_CTU_MODE_TRIGGER == eCtuMode)));
5044 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
5045 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5046 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
5047     /* calibration must not be interrupted */
5048     if(FALSE == Adc_Sar_Ip_axAdcSarState[u32Instance].CalibrationOnGoing)
5049     {
5050 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
5051 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5052         if (u32Instance >= ADC_INSTANCE_COUNT)
5053         {
5054             AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT];
5055             MCRAddr = (volatile uint32 *)&(AdcAEBasePtr->MCR);
5056         }
5057         else
5058 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5059         {
5060             AdcBasePtr = Adc_Sar_Ip_apxAdcBase[u32Instance];
5061             MCRAddr = (volatile uint32 *)&(AdcBasePtr->MCR);
5062         }
5063 
5064         /* Clear CTUEN to allow Powerdown operation to succeed. */
5065         SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_20();
5066         *MCRAddr &= ~ADC_MCR_CTUEN_MASK;
5067         SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_20();
5068 
5069         /* Power down */
5070         Status = Adc_Sar_Ip_Powerdown(u32Instance);
5071         if (ADC_SAR_IP_STATUS_SUCCESS == Status)
5072         {
5073             /* Configure CTU */
5074 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
5075             if (ADC_SAR_IP_INST_HAS_CTU(u32Instance))
5076             {
5077 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
5078                 SchM_Enter_Adc_ADC_EXCLUSIVE_AREA_20();
5079                 switch (eCtuMode)
5080                 {
5081                     case ADC_SAR_IP_CTU_MODE_CONTROL:
5082                         *MCRAddr &= ~(ADC_MCR_CTU_MODE(1U)); /* CTU_MODE = 0 */
5083                         *MCRAddr |= ADC_MCR_CTUEN(1U); /* CTUEN = 1 */
5084                         break;
5085 #if ADC_SAR_IP_HAS_CTU_TRIGGER_MODE
5086                     case ADC_SAR_IP_CTU_MODE_TRIGGER:
5087                         /* Set CTU_MODE = 1 and CTUEN = 1 */
5088                         *MCRAddr |= (ADC_MCR_CTU_MODE(1U) | ADC_MCR_CTUEN(1U));
5089                         break;
5090 #endif /* ADC_SAR_IP_HAS_CTU_TRIGGER_MODE */
5091                         /* Set CTU_MODE = 0 and CTUEN = 0 */
5092                     case ADC_SAR_IP_CTU_MODE_DISABLED:
5093                         *MCRAddr &= ~(ADC_MCR_CTU_MODE(1U) | ADC_MCR_CTUEN(1U));
5094                         break;
5095                     default:
5096                         ; /* no-op */
5097                         break;
5098                 }
5099                 SchM_Exit_Adc_ADC_EXCLUSIVE_AREA_20();
5100 #if ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE
5101             }
5102 #endif /*ADC_SAR_IP_BAD_ACCESS_PROT_FEATURE*/
5103 
5104             /* Power up */
5105             Status = Adc_Sar_Ip_Powerup(u32Instance);
5106         }
5107 #if (ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON)
5108     }
5109     else
5110     {
5111         Status = ADC_SAR_IP_STATUS_CAL_ONGOING;
5112     }
5113 #endif /*(ADC_SAR_IP_ASYNC_CALIBARTION_ENABLED == STD_ON) */
5114     return Status;
5115 }
5116 #endif /* ADC_SAR_IP_HAS_CTU */
5117 
5118 #if (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE)
5119 #if (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER)
5120 /*FUNCTION**********************************************************************
5121 *
5122 * Function Name : Adc_Sar_Ip_SetExternalTrigger
5123 * Description   : This function configures the external trigger.
5124 *
5125 * @implements      Adc_Sar_Ip_SetExternalTrigger_Activity
5126 * END**************************************************************************/
Adc_Sar_Ip_SetExternalTrigger(const uint32 u32Instance,const Adc_Sar_Ip_ExtTriggerEdgeType eTriggerEdge,const Adc_Sar_Ip_ExtTriggerSourceType eTrggerSrc)5127 void Adc_Sar_Ip_SetExternalTrigger(const uint32 u32Instance,
5128                                    const Adc_Sar_Ip_ExtTriggerEdgeType eTriggerEdge,
5129                                    const Adc_Sar_Ip_ExtTriggerSourceType eTrggerSrc)
5130 {
5131 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5132     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
5133 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5134 
5135     /* Switch between injected and normal external trigger */
5136     switch (eTrggerSrc)
5137     {
5138 #if FEATURE_ADC_HAS_EXT_TRIGGER
5139         case ADC_SAR_IP_NORMAL_EXT_TRIG:
5140             Adc_Sar_ConfigExternalTrigger(u32Instance, eTriggerEdge, ADC_MCR_EDGE_MASK, 0U, ADC_MCR_TRGEN_MASK);
5141             break;
5142 #if FEATURE_ADC_HAS_AUX_EXT_TRIGGER
5143         case ADC_SAR_IP_AUX_NORMAL_EXT_TRIG:
5144             Adc_Sar_ConfigExternalTrigger(u32Instance, eTriggerEdge, ADC_MCR_EDGE_MASK, 0U, ADC_MCR_XSTRTEN_MASK);
5145             break;
5146         case ADC_SAR_IP_ALL_NORMAL_EXT_TRIG:
5147             Adc_Sar_ConfigExternalTrigger(u32Instance, eTriggerEdge, ADC_MCR_EDGE_MASK, ADC_MCR_EDGE_MASK, (ADC_MCR_TRGEN_MASK | ADC_MCR_XSTRTEN_MASK));
5148             break;
5149 #endif /* FEATURE_ADC_HAS_AUX_EXT_TRIGGER */
5150 #endif /* FEATURE_ADC_HAS_EXT_TRIGGER */
5151 #if FEATURE_ADC_HAS_INJ_EXT_TRIGGER
5152         case ADC_SAR_IP_INJECTED_EXT_TRIG:
5153             Adc_Sar_ConfigExternalTrigger(u32Instance, eTriggerEdge, ADC_MCR_JEDGE_MASK, ADC_MCR_JEDGE_MASK, ADC_MCR_JTRGEN_MASK);
5154             break;
5155 #endif /* FEATURE_ADC_HAS_INJ_EXT_TRIGGER */
5156         default:
5157             ; /* no-op */
5158             break;
5159     }
5160 }
5161 #endif /* (FEATURE_ADC_HAS_INJ_EXT_TRIGGER || FEATURE_ADC_HAS_EXT_TRIGGER) */
5162 #endif /* (ADC_SAR_IP_EXTERNAL_TRIGGER_ENABLE) */
5163 
5164 /*FUNCTION**********************************************************************
5165 *
5166 * Function Name : Adc_Sar_Ip_SetUserGainAndOffset
5167 * Description   : This function configures user gain and offset.
5168 *
5169 * @implements      Adc_Sar_Ip_SetUserGainAndOffset_Activity
5170 * END**************************************************************************/
Adc_Sar_Ip_SetUserGainAndOffset(const uint32 Instance,const uint16 Gain,const uint8 Offset)5171 void Adc_Sar_Ip_SetUserGainAndOffset(const uint32 Instance,
5172                                      const uint16 Gain,
5173                                      const uint8 Offset)
5174 {
5175     uint32 RegVal;
5176     ADC_Type * AdcBasePtr = NULL_PTR;
5177 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5178     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
5179 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5180     /* Write in RegVal the value needed for the register. */
5181 
5182 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5183     DevAssert(Instance < ADC_SAR_IP_INSTANCE_COUNT);
5184 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5185 
5186 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5187 
5188     if (Instance >= ADC_INSTANCE_COUNT)
5189     {
5190         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
5191 
5192         RegVal = ADC_AE_USER_OFFSET(Offset);
5193         RegVal |= ADC_AE_USER_GAIN(Gain);
5194         AdcAEBasePtr->ADC_AE_USER_OFFSET_GAIN_REG = RegVal;
5195     }
5196     else
5197 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5198     {
5199         AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
5200 
5201         RegVal = ADC_USER_OFFSET(Offset);
5202         RegVal |= ADC_USER_GAIN(Gain);
5203         AdcBasePtr->ADC_USER_OFFSET_GAIN_REG = RegVal;
5204     }
5205 }
5206 
5207 
5208 /*FUNCTION*********************************************************************
5209  *
5210  * Function Name : Adc_Sar_Ip_GetDataAddress
5211  * Description   : Returns the address of the specified CDR register
5212  * @implements      Adc_Sar_Ip_GetDataAddress_Activity
5213  *END*************************************************************************/
Adc_Sar_Ip_GetDataAddress(uint32 u32Instance,uint32 u32ChannelIndex)5214 uint32 Adc_Sar_Ip_GetDataAddress(uint32 u32Instance,
5215                                  uint32 u32ChannelIndex)
5216 {
5217     uint32 returnAddr = 0U;
5218 
5219 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5220     DevAssert(u32Instance < ADC_SAR_IP_INSTANCE_COUNT);
5221     DevAssert(u32ChannelIndex < ADC_SAR_IP_CDR_COUNT);
5222 #if ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL
5223     DevAssert(ADC_SAR_IP_INST_HAS_CHANn(u32Instance, u32ChannelIndex));
5224 #endif /* ADC_SAR_IP_BAD_ACCESS_PROT_CHANNEL */
5225 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5226 
5227 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5228     if (u32Instance >= ADC_INSTANCE_COUNT)
5229     {
5230         returnAddr = (uint32)&(CDR_AE(Adc_Sar_AE_Ip_apxAdcBase[u32Instance - ADC_INSTANCE_COUNT], u32ChannelIndex)) - ADC_SAR_IP_APPLICATION_EXTENSION_BASE_ADDRESS;
5231     }
5232     else
5233 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5234     {
5235         returnAddr = (Adc_Sar_Ip_uintPtrType)&(CDR(Adc_Sar_Ip_apxAdcBase[u32Instance], u32ChannelIndex));
5236     }
5237     return returnAddr;
5238 }
5239 
5240 #if (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT)
5241 /*FUNCTION**********************************************************************
5242  *
5243  * Function Name : Adc_Sar_Ip_SetUserAccessAllowed
5244  * Description   : Sets the UAA bit in REG_PROT to make the instance accessible in user mode.
5245  *
5246  *END**************************************************************************/
Adc_Sar_Ip_SetUserAccessAllowed(const uint32 Instance)5247 void Adc_Sar_Ip_SetUserAccessAllowed(const uint32 Instance)
5248 {
5249 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5250     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
5251 #else
5252 #ifdef SAR_ADC_PROT_MEM_U32
5253     ADC_Type * AdcBasePtr = NULL_PTR;
5254 #endif /* SAR_ADC_PROT_MEM_U32 */
5255 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5256 
5257 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5258     DevAssert(Instance < ADC_SAR_IP_INSTANCE_COUNT);
5259 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5260 
5261 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5262     if (Instance >= ADC_INSTANCE_COUNT)
5263     {
5264         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
5265         SET_USER_ACCESS_ALLOWED((uint32)AdcAEBasePtr, SAR_ADC_AE_PROT_MEM_U32);
5266     }
5267 #else
5268 #ifdef SAR_ADC_PROT_MEM_U32
5269     AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
5270     SET_USER_ACCESS_ALLOWED((uint32)AdcBasePtr, SAR_ADC_PROT_MEM_U32);
5271 #else
5272     (void)Instance;
5273 #endif /* SAR_ADC_PROT_MEM_U32 */
5274 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5275 }
5276 
5277 /*FUNCTION**********************************************************************
5278  *
5279  * Function Name : Adc_Sar_Ip_ClrUserAccessAllowed
5280  * Description   : Clears the UAA bit in REG_PROT to make the instance inaccessible in user mode.
5281  *
5282  *END**************************************************************************/
Adc_Sar_Ip_ClrUserAccessAllowed(const uint32 Instance)5283 void Adc_Sar_Ip_ClrUserAccessAllowed(const uint32 Instance)
5284 {
5285 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5286     SAR_ADC_AE_Type * AdcAEBasePtr = NULL_PTR;
5287 #else
5288 #ifdef SAR_ADC_PROT_MEM_U32
5289     ADC_Type * AdcBasePtr = NULL_PTR;
5290 #endif /* SAR_ADC_PROT_MEM_U32 */
5291 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5292 
5293 #if (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON)
5294     DevAssert(Instance < ADC_SAR_IP_INSTANCE_COUNT);
5295 #endif /* (ADC_SAR_IP_DEV_ERROR_DETECT == STD_ON) */
5296 
5297 #if FEATURE_ADC_HAS_APPLICATION_EXTENSION
5298     if (Instance >= ADC_INSTANCE_COUNT)
5299     {
5300         AdcAEBasePtr = Adc_Sar_AE_Ip_apxAdcBase[Instance - ADC_INSTANCE_COUNT];
5301         CLR_USER_ACCESS_ALLOWED((uint32)AdcAEBasePtr, SAR_ADC_AE_PROT_MEM_U32);
5302     }
5303 #else
5304 #ifdef SAR_ADC_PROT_MEM_U32
5305     AdcBasePtr = Adc_Sar_Ip_apxAdcBase[Instance];
5306     CLR_USER_ACCESS_ALLOWED((uint32)AdcBasePtr, SAR_ADC_PROT_MEM_U32);
5307 #else
5308     (void)Instance;
5309 #endif /* SAR_ADC_PROT_MEM_U32 */
5310 #endif /* FEATURE_ADC_HAS_APPLICATION_EXTENSION */
5311 }
5312 #endif /* (STD_ON == ADC_SAR_IP_ENABLE_USER_MODE_SUPPORT) */
5313 
5314 #define ADC_STOP_SEC_CODE
5315 #include "Adc_MemMap.h"
5316 
5317 #ifdef __cplusplus
5318 }
5319 #endif
5320 
5321 /** @} */
5322