1 /*
2  * Copyright 2020-2023 NXP
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #ifndef CLOCK_IP_H
8 #define CLOCK_IP_H
9 
10 /**
11 *   @file    Clock_Ip.h
12 *   @version    2.0.0
13 *
14 *   @brief   CLOCK IP driver header file.
15 *   @details CLOCK IP driver header file.
16 *
17 *   @addtogroup CLOCK_DRIVER Clock Ip Driver
18 *   @{
19 */
20 
21 
22 #if defined(__cplusplus)
23 extern "C"{
24 #endif
25 
26 /*==================================================================================================
27 *                                          INCLUDE FILES
28 * 1) system and project includes
29 * 2) needed interfaces from external units
30 * 3) internal and external interfaces from this unit
31 ==================================================================================================*/
32 #include "Clock_Ip_Types.h"
33 #include "Clock_Ip_Cfg.h"
34 /*==================================================================================================
35 *                               SOURCE FILE VERSION INFORMATION
36 ==================================================================================================*/
37 #define CLOCK_IP_VENDOR_ID                       43
38 #define CLOCK_IP_AR_RELEASE_MAJOR_VERSION        4
39 #define CLOCK_IP_AR_RELEASE_MINOR_VERSION        7
40 #define CLOCK_IP_AR_RELEASE_REVISION_VERSION     0
41 #define CLOCK_IP_SW_MAJOR_VERSION                2
42 #define CLOCK_IP_SW_MINOR_VERSION                0
43 #define CLOCK_IP_SW_PATCH_VERSION                0
44 
45 /*==================================================================================================
46 *                                      FILE VERSION CHECKS
47 ==================================================================================================*/
48 /* Check if Clock_Ip.h file and Clock_Ip_Types.h file have same versions */
49 #if (CLOCK_IP_VENDOR_ID  != CLOCK_IP_TYPES_VENDOR_ID)
50     #error "Clock_Ip.h and Clock_Ip_Types.h have different vendor IDs"
51 #endif
52 
53 /* Check if Clock_Ip.h file and Clock_Ip_Types.h file are of the same Autosar version */
54 #if ((CLOCK_IP_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_TYPES_AR_RELEASE_MAJOR_VERSION) || \
55      (CLOCK_IP_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_TYPES_AR_RELEASE_MINOR_VERSION) || \
56      (CLOCK_IP_AR_RELEASE_REVISION_VERSION != CLOCK_IP_TYPES_AR_RELEASE_REVISION_VERSION))
57     #error "AutoSar Version Numbers of Clock_Ip.h and Clock_Ip_Types.h are different"
58 #endif
59 
60 /* Check if Clock_Ip.h file and Clock_Ip_Types.h file are of the same Software version */
61 #if ((CLOCK_IP_SW_MAJOR_VERSION != CLOCK_IP_TYPES_SW_MAJOR_VERSION) || \
62      (CLOCK_IP_SW_MINOR_VERSION != CLOCK_IP_TYPES_SW_MINOR_VERSION) || \
63      (CLOCK_IP_SW_PATCH_VERSION != CLOCK_IP_TYPES_SW_PATCH_VERSION))
64     #error "Software Version Numbers of Clock_Ip.h and Clock_Ip_Types.h are different"
65 #endif
66 
67 /* Check if Clock_Ip.h file and Clock_Ip_Cfg.h file have same versions */
68 #if (CLOCK_IP_VENDOR_ID  != CLOCK_IP_CFG_VENDOR_ID)
69     #error "Clock_Ip.h and Clock_Ip_Cfg.h have different vendor IDs"
70 #endif
71 
72 /* Check if Clock_Ip.h file and Clock_Ip_Cfg.h file are of the same Autosar version */
73 #if ((CLOCK_IP_AR_RELEASE_MAJOR_VERSION    != CLOCK_IP_CFG_AR_RELEASE_MAJOR_VERSION) || \
74      (CLOCK_IP_AR_RELEASE_MINOR_VERSION    != CLOCK_IP_CFG_AR_RELEASE_MINOR_VERSION) || \
75      (CLOCK_IP_AR_RELEASE_REVISION_VERSION != CLOCK_IP_CFG_AR_RELEASE_REVISION_VERSION))
76     #error "AutoSar Version Numbers of Clock_Ip.h and Clock_Ip_Cfg.h are different"
77 #endif
78 
79 /* Check if Clock_Ip.h file and Clock_Ip_Cfg.h file are of the same Software version */
80 #if ((CLOCK_IP_SW_MAJOR_VERSION != CLOCK_IP_CFG_SW_MAJOR_VERSION) || \
81      (CLOCK_IP_SW_MINOR_VERSION != CLOCK_IP_CFG_SW_MINOR_VERSION) || \
82      (CLOCK_IP_SW_PATCH_VERSION != CLOCK_IP_CFG_SW_PATCH_VERSION))
83     #error "Software Version Numbers of Clock_Ip.h and Clock_Ip_Cfg.h are different"
84 #endif
85 /*==================================================================================================
86 *                                            CONSTANTS
87 ==================================================================================================*/
88 
89 /*==================================================================================================
90 *                                       DEFINES AND MACROS
91 ==================================================================================================*/
92 
93 /*==================================================================================================
94 *                                              ENUMS
95 ==================================================================================================*/
96 
97 /*==================================================================================================
98 *                                  STRUCTURES AND OTHER TYPEDEFS
99 ==================================================================================================*/
100 
101 /*==================================================================================================
102 *                                  GLOBAL VARIABLE DECLARATIONS
103 ==================================================================================================*/
104 
105 /*==================================================================================================
106 *                                       FUNCTION PROTOTYPES
107 ==================================================================================================*/
108 
109 /* Clock start section code */
110 #define MCU_START_SEC_CODE
111 
112 #include "Mcu_MemMap.h"
113 
114 
115 /*!
116  * @brief Set clock configuration according to pre-defined structure.
117  *
118  * This function sets system to target clock configuration; It sets the
119  * clock modules registers for clock mode change.
120  *
121  * @param[in] Config  Pointer to configuration structure.
122  *
123  * @return void
124  *
125  * @note If external clock is used in the target mode, please make sure it is
126  * enabled, for example, if the external oscillator is used, please setup correctly.
127  */
128 Clock_Ip_StatusType Clock_Ip_Init(Clock_Ip_ClockConfigType const * Config);
129 
130 /*!
131  * @brief Set the PLL and other MCU specific clock options.
132  *
133  * This function initializes the PLL and other MCU specific clock options.
134  * The clock configuration parameters are provided via the configuration structure.
135  *
136  * This function shall start the PLL lock procedure (if PLL
137  * shall be initialized) and shall return without waiting until the PLL is locked.
138  *
139  * @param[in] Config  Pointer to configuration structure.
140  *
141  * @return void
142  */
143 void Clock_Ip_InitClock(Clock_Ip_ClockConfigType const * Config);
144 
145 /*!
146  * @brief Returns the lock status of the PLL.
147  *
148  * This function returns status of the PLL: undefined, unlocked or locked.
149  * This function returns undefined status if this function is called prior
150  * to calling of the function Clock_Ip_InitClock
151  *
152  * @return Status.  Pll lock status
153  */
154 Clock_Ip_PllStatusType Clock_Ip_GetPllStatus(void);
155 
156 /*!
157  * @brief Activates the PLL in MCU clock distribution.
158  *
159  * This function activates the PLL clock to
160  * the MCU clock distribution.
161  *
162  * This function removes the current clock source
163  * (for example internal oscillator clock) from MCU clock distribution.
164  *
165  * Application layer calls this function after the status of the PLL has been detected as
166  * locked by the function Clock_Ip_GetPllStatus.
167  *
168  * The function Clock_Ip_DistributePll shall return without affecting
169  * the MCU hardware if the PLL clock has been automatically activated by the MCU
170  * hardware.
171  *
172  * @return void
173  */
174 void Clock_Ip_DistributePll(void);
175 
176 
177 
178 /*!
179  * @brief Install a clock notifications callback
180  *
181  * This function installs a callback for
182  * reporting notifications from clock driver
183  *
184  *
185  * @param[in] Clock_Ip_NotificationsCallbackType  notifications callback
186  *
187  * @return void
188  *
189  * @implements Clock_Ip_InstallNotificationsCallback_Activity
190  */
191 void Clock_Ip_InstallNotificationsCallback(Clock_Ip_NotificationsCallbackType Callback);
192 /*!
193  * @brief Disables a clock monitor.
194  *
195  * This function disables a clock monitor.
196  *
197  * @param[in] ClockName  Clock Name.
198  *
199  * @return void
200  */
201 void Clock_Ip_DisableClockMonitor(Clock_Ip_NameType ClockName);
202 /*!
203  * @brief Disables clock for a peripheral.
204  *
205  * This function disables clock for a peripheral.
206  *
207  * @param[in] ClockName  Clock Name.
208  *
209  * @return void
210  */
211 void Clock_Ip_DisableModuleClock(Clock_Ip_NameType ClockName);
212 
213 /*!
214  * @brief Enables clock for a peripheral.
215  *
216  * This function enables clock for a peripheral.
217  *
218  * @param[in] ClockName  Clock Name.
219  *
220  * @return void
221  */
222 void Clock_Ip_EnableModuleClock(Clock_Ip_NameType ClockName);
223 
224 
225 #if (defined(CLOCK_IP_POWER_MODE_CHANGE_NOTIFICATION))
226   #if (STD_ON == CLOCK_IP_POWER_MODE_CHANGE_NOTIFICATION)
227 
228 /*!
229  * @brief Sends notifications regarding power mode transition
230  *
231  * This function sends notifications regarding power mode transition.
232  * It is called by power driver each time power mode is changed.
233  *
234  *
235  * @param[in] PowerMode  Power mode.
236  * @param[in] PowerMode  Power mode notification.
237  *
238  * @return void
239  */
240 void Clock_Ip_PowerModeChangeNotification(  Clock_Ip_PowerModesType PowerMode,
241                                             Clock_Ip_PowerNotificationType Notification
242                                           );
243   #endif
244 #endif
245 
246 
247 #if (defined(CLOCK_IP_GET_FREQUENCY_API))
248   #if (CLOCK_IP_GET_FREQUENCY_API == STD_ON)
249 
250 
251  /*!
252  * @brief Gets the clock frequency for a specific clock name.
253  *
254  * This function checks the current clock configurations and then calculates
255  * the clock frequency for a specific clock name defined in Clock_Ip_NameType.
256  * Clock modules must be properly configured before using this function.
257  * See features.h for supported clock names for different chip families.
258  * The returned value is in Hertz. If frequency is required for a peripheral and the
259  * module is not clocked, then 0 Hz frequency is returned.
260  *
261  * @param[in] ClockName Clock names defined in Clock_Ip_NameType
262  * @return frequency    Returned clock frequency value in Hertz
263  */
264 uint32 Clock_Ip_GetClockFrequency(Clock_Ip_NameType ClockName);
265   #endif
266 #endif
267 
268 
269 /* Clock stop section code */
270 #define MCU_STOP_SEC_CODE
271 
272 #include "Mcu_MemMap.h"
273 
274 #if defined(__cplusplus)
275 }
276 #endif /* __cplusplus*/
277 
278 /*! @}*/
279 
280 #endif /* CLOCK_IP_H */
281 
282