1 /*
2 * Copyright 2020-2023 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 /**
8 * @file Trgmux_Ip.c
9 *
10 * @version 3.0.0
11 *
12 * @brief AUTOSAR Mcl - Trgmux Ip driver source file.
13 * @details
14 *
15 * @addtogroup TRGMUX_IP_DRIVER TRGMUX IP Driver
16 * @{
17 */
18
19 #ifdef __cplusplus
20 extern "C"{
21 #endif
22
23 /*==================================================================================================
24 * INCLUDE FILES
25 * 1) system and project includes
26 * 2) needed interfaces from external units
27 * 3) internal and external interfaces from this unit
28 ==================================================================================================*/
29 #include "Trgmux_Ip.h"
30 #include "Trgmux_Ip_HwAcc.h"
31
32 #include "SchM_Mcl.h"
33
34 /*==================================================================================================
35 SOURCE FILE VERSION INFORMATION
36 ==================================================================================================*/
37 #define TRGMUX_IP_VENDOR_ID_C 43
38 #define TRGMUX_IP_AR_RELEASE_MAJOR_VERSION_C 4
39 #define TRGMUX_IP_AR_RELEASE_MINOR_VERSION_C 7
40 #define TRGMUX_IP_AR_RELEASE_REVISION_VERSION_C 0
41 #define TRGMUX_IP_SW_MAJOR_VERSION_C 3
42 #define TRGMUX_IP_SW_MINOR_VERSION_C 0
43 #define TRGMUX_IP_SW_PATCH_VERSION_C 0
44
45 /*==================================================================================================
46 FILE VERSION CHECKS
47 ==================================================================================================*/
48
49 /* Check if Trgmux_Ip.c file and Trgmux_Ip.h file are of the same vendor */
50 #if (TRGMUX_IP_VENDOR_ID_C != TRGMUX_IP_VENDOR_ID)
51 #error "Trgmux_Ip.c and Trgmux_Ip.h have different vendor ids"
52 #endif
53
54 /* Check if Trgmux_Ip.c file and Trgmux_Ip.h file are of the same Autosar version */
55 #if ((TRGMUX_IP_AR_RELEASE_MAJOR_VERSION_C != TRGMUX_IP_AR_RELEASE_MAJOR_VERSION) || \
56 (TRGMUX_IP_AR_RELEASE_MINOR_VERSION_C != TRGMUX_IP_AR_RELEASE_MINOR_VERSION) || \
57 (TRGMUX_IP_AR_RELEASE_REVISION_VERSION_C != TRGMUX_IP_AR_RELEASE_REVISION_VERSION) \
58 )
59 #error "AutoSar Version Numbers of Trgmux_Ip.c and Trgmux_Ip.h are different"
60 #endif
61
62 /* Check if Trgmux_Ip.c file and Trgmux_Ip.h file are of the same Software version */
63 #if ((TRGMUX_IP_SW_MAJOR_VERSION_C != TRGMUX_IP_SW_MAJOR_VERSION) || \
64 (TRGMUX_IP_SW_MINOR_VERSION_C != TRGMUX_IP_SW_MINOR_VERSION) || \
65 (TRGMUX_IP_SW_PATCH_VERSION_C != TRGMUX_IP_SW_PATCH_VERSION) \
66 )
67 #error "Software Version Numbers of Trgmux_Ip.c and Trgmux_Ip.h are different"
68 #endif
69
70 /* Check if Trgmux_Ip.c file and Trgmux_Ip_HwAcc.h file are of the same vendor */
71 #if (TRGMUX_IP_VENDOR_ID_C != TRGMUX_IP_HWACC_VENDOR_ID)
72 #error "Trgmux_Ip.c and Trgmux_Ip_HwAcc.h have different vendor ids"
73 #endif
74
75 /* Check if Trgmux_Ip.c file and Trgmux_Ip_HwAcc.h file are of the same Autosar version */
76 #if ((TRGMUX_IP_AR_RELEASE_MAJOR_VERSION_C != TRGMUX_IP_HWACC_AR_RELEASE_MAJOR_VERSION) || \
77 (TRGMUX_IP_AR_RELEASE_MINOR_VERSION_C != TRGMUX_IP_HWACC_AR_RELEASE_MINOR_VERSION) || \
78 (TRGMUX_IP_AR_RELEASE_REVISION_VERSION_C != TRGMUX_IP_HWACC_AR_RELEASE_REVISION_VERSION) \
79 )
80 #error "AutoSar Version Numbers of Trgmux_Ip.c and Trgmux_Ip_HwAcc.h are different"
81 #endif
82
83 /* Check if Trgmux_Ip.c file and Trgmux_Ip_HwAcc.h file are of the same Software version */
84 #if ((TRGMUX_IP_SW_MAJOR_VERSION_C != TRGMUX_IP_HWACC_SW_MAJOR_VERSION) || \
85 (TRGMUX_IP_SW_MINOR_VERSION_C != TRGMUX_IP_HWACC_SW_MINOR_VERSION) || \
86 (TRGMUX_IP_SW_PATCH_VERSION_C != TRGMUX_IP_HWACC_SW_PATCH_VERSION) \
87 )
88 #error "Software Version Numbers of Trgmux_Ip.c and Trgmux_Ip_HwAcc.h are different"
89 #endif
90
91 #ifndef DISABLE_MCAL_INTERMODULE_ASR_CHECK
92 /* Check if Trgmux_Ip.c file and SchM_Mcl header file are of the same Autosar version */
93 #if ((TRGMUX_IP_AR_RELEASE_MAJOR_VERSION_C != SCHM_MCL_AR_RELEASE_MAJOR_VERSION) || \
94 (TRGMUX_IP_AR_RELEASE_MINOR_VERSION_C != SCHM_MCL_AR_RELEASE_MINOR_VERSION))
95 #error "AutoSar Version Numbers of Trgmux_Ip.c and SchM_Mcl.h are different"
96 #endif
97 #endif
98
99 #if (STD_ON == TRGMUX_IP_IS_AVAILABLE)
100 /*==================================================================================================
101 * LOCAL TYPEDEFS (STRUCTURES, UNIONS, ENUMS)
102 ==================================================================================================*/
103
104 /*==================================================================================================
105 * LOCAL MACROS
106 ==================================================================================================*/
107 #define MCL_START_SEC_CODE
108 #include "Mcl_MemMap.h"
109
110 #ifdef MCAL_ENABLE_USER_MODE_SUPPORT
111 #if (STD_ON == TRGMUX_IP_USER_MODE_SUPPORT_IS_AVAILABLE)
112 #define Trgmux_Ip_HwAcc_Init(pTrgmux,TrgmuxCount) \
113 (OsIf_Trusted_Call_Return2param((uint32)hwAcc_Init, pTrgmux,TrgmuxCount))
114 #define Trgmux_Ip_HwAcc_SetInputForOutput(pTrgmux, Instance, Input, Output) \
115 (OsIf_Trusted_Call4params(hwAcc_SetInputForOutput, pTrgmux, Instance, Input, Output))
116 #define Trgmux_Ip_HwAcc_SetLockForOutput(pTrgmux, Output) \
117 (OsIf_Trusted_Call2params(hwAcc_SetLockForOutput, pTrgmux, Output))
118 #define Trgmux_Ip_HwAcc_GetLockForOutput(pTrgmux, Output) \
119 (OsIf_Trusted_Call_Return2param((uint32)hwAcc_GetLockForOutput, pTrgmux, Output))
120 #else
121 #define Trgmux_Ip_HwAcc_Init(pTrgmux,TrgmuxCount) \
122 (hwAcc_Init(pTrgmux, TrgmuxCount))
123 #define Trgmux_Ip_HwAcc_SetInputForOutput(pTrgmux, Instance, Input, Output) \
124 (hwAcc_SetInputForOutput(pTrgmux, Instance, Input, Output))
125 #define Trgmux_Ip_HwAcc_SetLockForOutput(pTrgmux, Output) \
126 (hwAcc_SetLockForOutput(pTrgmux, Output))
127 #define Trgmux_Ip_HwAcc_GetLockForOutput(pTrgmux, Output) \
128 (hwAcc_GetLockForOutput(pTrgmux, Output))
129 #endif /* STD_ON == TRGMUX_IP_USER_MODE_SUPPORT_IS_AVAILABLE */
130 #else
131 #define Trgmux_Ip_HwAcc_Init(pTrgmux, TrgmuxCount) \
132 (hwAcc_Init(pTrgmux, TrgmuxCount))
133 #define Trgmux_Ip_HwAcc_SetInputForOutput(pTrgmux, Instance, Input, Output) \
134 (hwAcc_SetInputForOutput(pTrgmux, Instance, Input, Output))
135 #define Trgmux_Ip_HwAcc_SetLockForOutput(pTrgmux, Output) \
136 (hwAcc_SetLockForOutput(pTrgmux, Output))
137 #define Trgmux_Ip_HwAcc_GetLockForOutput(pTrgmux, Output) \
138 (hwAcc_GetLockForOutput(pTrgmux, Output))
139 #endif /* MCAL_ENABLE_USER_MODE_SUPPORT */
140
141 #define MCL_STOP_SEC_CODE
142 #include "Mcl_MemMap.h"
143
144 /*==================================================================================================
145 * LOCAL CONSTANTS
146 ==================================================================================================*/
147
148 /*==================================================================================================
149 * LOCAL VARIABLES
150 ==================================================================================================*/
151
152 /*==================================================================================================
153 * GLOBAL CONSTANTS
154 ==================================================================================================*/
155
156 /*==================================================================================================
157 * GLOBAL VARIABLES
158 ==================================================================================================*/
159 #define MCL_START_SEC_CONFIG_DATA_UNSPECIFIED
160 #include "Mcl_MemMap.h"
161
162 static TRGMUX_Type * const Trgmux_Ip_paxBaseInst[TRGMUX_INSTANCE_COUNT] = IP_TRGMUX_BASE_PTRS;
163
164 #define MCL_STOP_SEC_CONFIG_DATA_UNSPECIFIED
165 #include "Mcl_MemMap.h"
166
167 #define MCL_START_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
168 #include "Mcl_MemMap.h"
169
170 /* Pointer to the TRGMUX Initialization Configuration. Based on this configuration pointer,
171 the TRGMUX Driver obtains all information for the Logic Triggers and corresponding
172 Triggers Configurations.
173 The Pointer is loaded when Trgmux_Ip_Init() is called. */
174 VAR_SEC_NOCACHE(Trgmux_Ip_pxInit) static const Trgmux_Ip_InitType * Trgmux_Ip_pxInit;
175
176 #define MCL_STOP_SEC_VAR_CLEARED_UNSPECIFIED_NO_CACHEABLE
177 #include "Mcl_MemMap.h"
178
179 /*==================================================================================================
180 * LOCAL FUNCTION PROTOTYPES
181 ==================================================================================================*/
182 #define MCL_START_SEC_CODE
183 #include "Mcl_MemMap.h"
184
185 #if (TRGMUX_IP_MULTICORE_IS_AVAILABLE == STD_ON)
186 static Trgmux_Ip_StatusType Static_Trgmux_Ip_ValidateMultiCoreChannelCall(uint8 CoreId);
187 #endif /* TRGMUX_IP_MULTICORE_IS_AVAILABLE == STD_ON */
188
189 /*==================================================================================================
190 * LOCAL FUNCTIONS
191 ==================================================================================================*/
192 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
Static_Trgmux_Ip_ValidateMultiCoreChannelCall(uint8 CoreId)193 static Trgmux_Ip_StatusType Static_Trgmux_Ip_ValidateMultiCoreChannelCall(uint8 CoreId)
194 {
195 Trgmux_Ip_StatusType Valid = TRGMUX_IP_STATUS_WRONG_CORE;
196 uint8 CurrentCoreId = (uint8)OsIf_GetCoreID();
197
198 /* Check that the core can access Channel Trgmux */
199 if (CurrentCoreId == CoreId)
200 {
201 Valid = TRGMUX_IP_STATUS_SUCCESS;
202 }
203 else
204 {
205 /* Do nothing */
206 }
207 return Valid;
208 }
209 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
210
211 /*==================================================================================================
212 * GLOBAL FUNCTIONS
213 ==================================================================================================*/
Trgmux_Ip_Init(const Trgmux_Ip_InitType * const pxTrgmuxInit)214 Trgmux_Ip_StatusType Trgmux_Ip_Init(const Trgmux_Ip_InitType * const pxTrgmuxInit)
215 {
216 TRGMUX_Type * LocTrgmuxBase;
217 uint32 LocInstanceIdx;
218 uint32 LocHwInst;
219 uint32 LocTriggerIdx;
220 uint32 LocInput;
221 uint32 LocOutput;
222 uint8 LocInst;
223 boolean LocLock;
224 Trgmux_Ip_StatusType Status = TRGMUX_IP_STATUS_SUCCESS;
225
226 TRGMUX_IP_DEV_ASSERT(NULL_PTR != pxTrgmuxInit);
227 /* Enter exclusive area to protect TRGMUXn */
228 SchM_Enter_Mcl_MCL_EXCLUSIVE_AREA_19();
229
230 for(LocInstanceIdx = 0U; LocInstanceIdx < TRGMUX_IP_NOF_INSTANCE; LocInstanceIdx++)
231 {
232 LocHwInst = Trgmux_Ip_InstanceArr[LocInstanceIdx];
233 /* Clear register */
234 LocTrgmuxBase = Trgmux_Ip_paxBaseInst[LocHwInst];
235
236 #ifdef MCAL_ENABLE_USER_MODE_SUPPORT
237 #if (STD_ON == TRGMUX_IP_USER_MODE_SUPPORT_IS_AVAILABLE)
238 if((Std_ReturnType)TRGMUX_IP_STATUS_SUCCESS != Trgmux_Ip_HwAcc_Init(LocTrgmuxBase, TRGMUX_IP_TRGMUXn_INSTANCE_COUNT(LocHwInst)))
239 #else
240 if(TRGMUX_IP_STATUS_SUCCESS != Trgmux_Ip_HwAcc_Init(LocTrgmuxBase,TRGMUX_IP_TRGMUXn_INSTANCE_COUNT(LocHwInst)))
241 #endif
242 #else
243 if(TRGMUX_IP_STATUS_SUCCESS != Trgmux_Ip_HwAcc_Init(LocTrgmuxBase,TRGMUX_IP_TRGMUXn_INSTANCE_COUNT(LocHwInst)))
244 #endif
245 {
246 Status = TRGMUX_IP_STATUS_LOCKED;
247 }
248 else
249 {
250 /* Do nothing */
251 }
252 }
253
254 if(TRGMUX_IP_STATUS_SUCCESS == Status)
255 {
256 /* Set register with configured value */
257 for(LocTriggerIdx = 0U; LocTriggerIdx < TRGMUX_IP_NOF_CFG_LOGIC_TRIGGERS; LocTriggerIdx++)
258 {
259 LocInst = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->HwInstId;
260 LocOutput = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->Output;
261 LocInput = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->Input;
262 LocTrgmuxBase = Trgmux_Ip_paxBaseInst[LocInst];
263 Trgmux_Ip_HwAcc_SetInputForOutput(LocTrgmuxBase, LocInst, LocInput, LocOutput);
264 }
265
266 /* Set register lock */
267 for(LocTriggerIdx = 0U; LocTriggerIdx < TRGMUX_IP_NOF_CFG_LOGIC_TRIGGERS; LocTriggerIdx++)
268 {
269 LocLock = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->Lock;
270 if(TRUE == LocLock)
271 {
272 LocInst = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->HwInstId;
273 LocTrgmuxBase = Trgmux_Ip_paxBaseInst[LocInst];
274 LocOutput = pxTrgmuxInit->paxLogicTrigger[LocTriggerIdx]->Output;
275 Trgmux_Ip_HwAcc_SetLockForOutput(LocTrgmuxBase, LocOutput);
276 }
277 }
278
279 Trgmux_Ip_pxInit = pxTrgmuxInit;
280 }
281 else
282 {
283 /* Do nothing*/
284 }
285
286 /* Exit exclusive area to protect TRGMUXn */
287 SchM_Exit_Mcl_MCL_EXCLUSIVE_AREA_19();
288
289 return Status;
290 }
291
Trgmux_Ip_SetInput(const uint32 LogicTrigger,const uint32 Input)292 Trgmux_Ip_StatusType Trgmux_Ip_SetInput(const uint32 LogicTrigger, const uint32 Input)
293 {
294 uint32 LocHwInst = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->HwInstId;
295 uint32 LocOutput = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->Output;
296 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
297 uint8 CoreId = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->CoreId;
298 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
299 TRGMUX_Type * LocTrgmuxBase = Trgmux_Ip_paxBaseInst[LocHwInst];
300 Trgmux_Ip_StatusType Status = TRGMUX_IP_STATUS_SUCCESS;
301
302 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
303 Status = Static_Trgmux_Ip_ValidateMultiCoreChannelCall(CoreId);
304 if(TRGMUX_IP_STATUS_SUCCESS == Status)
305 {
306 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
307 if(FALSE != Trgmux_Ip_HwAcc_GetLockForOutput(LocTrgmuxBase, LocOutput))
308 {
309 Status = TRGMUX_IP_STATUS_LOCKED;
310 }
311
312 if(TRGMUX_IP_STATUS_LOCKED != Status)
313 {
314 /* Enter exclusive area to protect TRGMUXn */
315 SchM_Enter_Mcl_MCL_EXCLUSIVE_AREA_20();
316 Trgmux_Ip_HwAcc_SetInputForOutput(LocTrgmuxBase, (uint8)LocHwInst, Input, LocOutput);
317 /* Exit exclusive area to protect TRGMUXn */
318 SchM_Exit_Mcl_MCL_EXCLUSIVE_AREA_20();
319 }
320 else
321 {
322 /* Do nothing */
323 }
324 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
325 }
326 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
327
328 return Status;
329 }
330
Trgmux_Ip_SetLock(const uint32 LogicTrigger)331 Trgmux_Ip_StatusType Trgmux_Ip_SetLock(const uint32 LogicTrigger)
332 {
333 uint32 LocHwInst = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->HwInstId;
334 uint32 LocOutput = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->Output;
335 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
336 uint8 CoreId = Trgmux_Ip_pxInit->paxLogicTrigger[LogicTrigger]->CoreId;
337 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
338 TRGMUX_Type * LocTrgmuxBase = Trgmux_Ip_paxBaseInst[LocHwInst];
339 Trgmux_Ip_StatusType Status = TRGMUX_IP_STATUS_SUCCESS;
340
341 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
342 Status = Static_Trgmux_Ip_ValidateMultiCoreChannelCall(CoreId);
343 if(TRGMUX_IP_STATUS_SUCCESS == Status)
344 {
345 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
346 if(FALSE != Trgmux_Ip_HwAcc_GetLockForOutput(LocTrgmuxBase, LocOutput))
347 {
348 Status = TRGMUX_IP_STATUS_LOCKED;
349 }
350
351 if(TRGMUX_IP_STATUS_LOCKED != Status)
352 {
353 /* Enter exclusive area to protect TRGMUXn */
354 SchM_Enter_Mcl_MCL_EXCLUSIVE_AREA_21();
355 Trgmux_Ip_HwAcc_SetLockForOutput(LocTrgmuxBase, LocOutput);
356 /* Exit exclusive area to protect TRGMUXn */
357 SchM_Exit_Mcl_MCL_EXCLUSIVE_AREA_21();
358 }
359 else
360 {
361 /*Do nothing*/
362 }
363 #if (STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE)
364 }
365 #endif /* STD_ON == TRGMUX_IP_MULTICORE_IS_AVAILABLE */
366
367 return Status;
368 }
369
370 #define MCL_STOP_SEC_CODE
371 #include "Mcl_MemMap.h"
372
373 #endif /* TRGMUX_IP_IS_AVAILABLE */
374
375 #ifdef __cplusplus
376 }
377 #endif
378
379 /** @} */
380