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