1 /*
2  * Copyright 2017-2019, 2021 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef _FSL_CLOCK_H_
9 #define _FSL_CLOCK_H_
10 
11 #include "fsl_common.h"
12 
13 /*! @addtogroup clock */
14 /*! @{ */
15 
16 /*! @file */
17 
18 /*******************************************************************************
19  * Definitions
20  *****************************************************************************/
21 
22 /*! @name Driver version */
23 /*@{*/
24 /*! @brief CLOCK driver version 2.3.3. */
25 #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 3, 3))
26 /*@}*/
27 
28 /* Definition for delay API in clock driver, users can redefine it to the real application. */
29 #ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY
30 #define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (15000000UL)
31 #endif
32 
33 /*! @brief lower power oscilltor clock frequency.
34  *
35  * This variable is used to store the lower power oscillator frequency which is
36  * set by CLOCK_InitLPOsc, and it is returned by CLOCK_GetLPOscFreq.
37  */
38 extern volatile uint32_t g_LP_Osc_Freq;
39 
40 /*! @brief external clock frequency.
41  *
42  * This variable is used to store the external clock frequency which is include
43  * external oscillator clock and external clk in clock frequency value, it is
44  * set by CLOCK_InitExtClkin when CLK IN is used as external clock or by CLOCK_InitSysOsc
45  * when external oscillator is used as external clock ,and it is returned by
46  * CLOCK_GetExtClkFreq.
47  */
48 extern volatile uint32_t g_Ext_Clk_Freq;
49 
50 /*! @brief external clock frequency.
51  *
52  * This variable is used to store the FRO osc clock frequency.
53  */
54 extern volatile uint32_t g_Fro_Osc_Freq;
55 
56 /*! @brief FRO clock setting API address in ROM. */
57 #define CLOCK_FRO_SETTING_API_ROM_ADDRESS (0x0F001CD3U)
58 /*! @brief FAIM base address*/
59 #define CLOCK_FAIM_BASE (0x50010000U)
60 
61 /*! @brief Clock ip name array for ADC. */
62 #define ADC_CLOCKS  \
63     {               \
64         kCLOCK_Adc, \
65     }
66 /*! @brief Clock ip name array for ACMP. */
67 #define ACMP_CLOCKS  \
68     {                \
69         kCLOCK_Acmp, \
70     }
71 /*! @brief Clock ip name array for DAC. */
72 #define DAC_CLOCKS  \
73     {               \
74         kCLOCK_Dac, \
75     }
76 /*! @brief Clock ip name array for SWM. */
77 #define SWM_CLOCKS  \
78     {               \
79         kCLOCK_Swm, \
80     }
81 /*! @brief Clock ip name array for ROM. */
82 #define ROM_CLOCKS  \
83     {               \
84         kCLOCK_Rom, \
85     }
86 /*! @brief Clock ip name array for SRAM. */
87 #define SRAM_CLOCKS  \
88     {                \
89         kCLOCK_Ram0, \
90     }
91 /*! @brief Clock ip name array for IOCON. */
92 #define IOCON_CLOCKS  \
93     {                 \
94         kCLOCK_Iocon, \
95     }
96 /*! @brief Clock ip name array for GPIO. */
97 #define GPIO_CLOCKS   \
98     {                 \
99         kCLOCK_Gpio0, \
100     }
101 /*! @brief Clock ip name array for GPIO_INT. */
102 #define GPIO_INT_CLOCKS \
103     {                   \
104         kCLOCK_GpioInt, \
105     }
106 /*! @brief Clock ip name array for CRC. */
107 #define CRC_CLOCKS  \
108     {               \
109         kCLOCK_Crc, \
110     }
111 /*! @brief Clock ip name array for WWDT. */
112 #define WWDT_CLOCKS  \
113     {                \
114         kCLOCK_Wwdt, \
115     }
116 /*! @brief Clock ip name array for SCT0. */
117 #define SCT_CLOCKS  \
118     {               \
119         kCLOCK_Sct, \
120     }
121 /*! @brief Clock ip name array for I2C. */
122 #define I2C_CLOCKS                \
123     {                             \
124         kCLOCK_I2c0, kCLOCK_I2c1, \
125     }
126 /*! @brief Clock ip name array for I2C. */
127 #define USART_CLOCKS                \
128     {                               \
129         kCLOCK_Uart0, kCLOCK_Uart1, \
130     }
131 /*! @brief Clock ip name array for SPI. */
132 #define SPI_CLOCKS   \
133     {                \
134         kCLOCK_Spi0, \
135     }
136 /*! @brief Clock ip name array for CAPT. */
137 #define CAPT_CLOCKS  \
138     {                \
139         kCLOCK_Capt, \
140     }
141 /*! @brief Clock ip name array for CTIMER. */
142 #define CTIMER_CLOCKS   \
143     {                   \
144         kCLOCK_Ctimer0, \
145     }
146 /*! @brief Clock ip name array for MRT. */
147 #define MRT_CLOCKS  \
148     {               \
149         kCLOCK_Mrt, \
150     }
151 /*! @brief Clock ip name array for WKT. */
152 #define WKT_CLOCKS  \
153     {               \
154         kCLOCK_Wkt, \
155     }
156 /*! @brief Clock ip name array for PLU. */
157 #define PLU_CLOCKS  \
158     {               \
159         kCLOCK_PLU, \
160     }
161 
162 /*! @brief Internal used Clock definition only. */
163 #define CLK_GATE_DEFINE(reg, bit)  ((((reg)&0xFFU) << 8U) | ((bit)&0xFFU))
164 #define CLK_GATE_GET_REG(x)        (((uint32_t)(x) >> 8U) & 0xFFU)
165 #define CLK_GATE_GET_BITS_SHIFT(x) ((uint32_t)(x)&0xFFU)
166 /* clock mux register definition */
167 #define CLK_MUX_DEFINE(reg, mux)             (((offsetof(SYSCON_Type, reg) & 0xFFU) << 8U) | ((mux)&0xFFU))
168 #define CLK_MUX_GET_REG(x)                   ((volatile uint32_t *)(((uint32_t)(SYSCON)) + (((uint32_t)(x) >> 8U) & 0xFFU)))
169 #define CLK_MUX_GET_MUX(x)                   ((uint32_t)(x)&0xFFU)
170 #define CLK_MAIN_CLK_MUX_DEFINE(preMux, mux) ((preMux) << 8U | (mux))
171 #define CLK_MAIN_CLK_MUX_GET_PRE_MUX(x)      (((uint32_t)(x) >> 8U) & 0xFFU)
172 #define CLK_MAIN_CLK_MUX_GET_MUX(x)          ((uint32_t)(x)&0xFFU)
173 /* clock divider register definition */
174 #define CLK_DIV_DEFINE(reg) (((uint32_t)offsetof(SYSCON_Type, reg)) & 0xFFFU)
175 #define CLK_DIV_GET_REG(x)  *((volatile uint32_t *)(((uint32_t)(SYSCON)) + ((uint32_t)(x)&0xFFFU)))
176 /* watch dog oscillator definition */
177 //#define CLK_WDT_OSC_DEFINE(freq, regValue) ((freq & 0xFFFFFFU) | ((regValue & 0xFFU) << 24U))
178 //#define CLK_WDT_OSC_GET_FREQ(x) ((uint32_t)x & 0xFFFFFFU)
179 //#define CLK_WDT_OSC_GET_REG(x) ((x >> 24U) & 0xFFU)
180 /* Fractional clock register map */
181 /* Fractional clock register map */
182 #define CLK_FRG_DIV_REG_MAP(base) (*(base))
183 #define CLK_FRG_MUL_REG_MAP(base) (*((uint32_t *)((uint32_t)(base) + 4U)))
184 #define CLK_FRG_SEL_REG_MAP(base) (*((uint32_t *)((uint32_t)(base) + 8U)))
185 /* register offset */
186 #define SYS_AHB_CLK_CTRL0 (0U)
187 #define SYS_AHB_CLK_CTRL1 (4U)
188 /*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */
189 typedef enum _clock_ip_name
190 {
191     kCLOCK_IpInvalid = 0U,                                      /*!< Invalid Ip Name. */
192     kCLOCK_Sys       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 0U),  /*!< Clock gate name: Sys. */
193     kCLOCK_Rom       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 1U),  /*!< Clock gate name: Rom. */
194     kCLOCK_Ram0      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 2U),  /*!< Clock gate name: Ram0. */
195     kCLOCK_Flash     = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 4U),  /*!< Clock gate name: Flash. */
196     kCLOCK_I2c0      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 5U),  /*!< Clock gate name: I2c0. */
197     kCLOCK_Gpio0     = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 6U),  /*!< Clock gate name: Gpio0. */
198     kCLOCK_Swm       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 7U),  /*!< Clock gate name: Swm. */
199     kCLOCK_Wkt       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 9U),  /*!< Clock gate name: Wkt. */
200     kCLOCK_Mrt       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 10U), /*!< Clock gate name: Mrt. */
201     kCLOCK_Spi0      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 11U), /*!< Clock gate name: Spi0. */
202     kCLOCK_Crc       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 13U), /*!< Clock gate name: Crc. */
203     kCLOCK_Uart0     = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 14U), /*!< Clock gate name: Uart0. */
204     kCLOCK_Uart1     = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 15U), /*!< Clock gate name: Uart1. */
205     kCLOCK_Wwdt      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 17U), /*!< Clock gate name: Wwdt. */
206     kCLOCK_Iocon     = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 18U), /*!< Clock gate name: Iocon. */
207     kCLOCK_Acmp      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 19U), /*!< Clock gate name: Acmp. */
208     kCLOCK_I2c1      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 21U), /*!< Clock gate name: I2c1. */
209     kCLOCK_Adc       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 24U), /*!< Clock gate name: Adc. */
210     kCLOCK_Ctimer0   = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 25U), /*!< Clock gate name: Ctimer0. */
211     kCLOCK_Dac       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 27U), /*!< Clock gate name: Dac. */
212     kCLOCK_GpioInt   = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 28U), /*!< Clock gate name: GpioInt. */
213     kCLOCK_Capt      = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL1, 0U),  /*!< Clock gate name: Capt. */
214     kCLOCK_PLU       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL1, 5U),  /*!< Clock gate name: PLU. */
215 } clock_ip_name_t;
216 
217 /*! @brief Clock name used to get clock frequency. */
218 typedef enum _clock_name
219 {
220     kCLOCK_CoreSysClk, /*!< Cpu/AHB/AHB matrix/Memories,etc */
221     kCLOCK_MainClk,    /*!< Main clock */
222     kCLOCK_Fro,        /*!< FRO18/24/30 */
223     kCLOCK_FroDiv,     /*!< FRO div clock */
224     kCLOCK_ExtClk,     /*!< External Clock */
225     kCLOCK_LPOsc,      /*!< Watchdog Oscillator */
226     kCLOCK_Frg0,       /*!< fractional rate0 */
227 } clock_name_t;
228 
229 /*! @brief Clock Mux Switches
230  *CLK_MUX_DEFINE(reg, mux)
231  *reg is used to define the mux register
232  *mux is used to define the mux value
233  *
234  */
235 typedef enum _clock_select
236 {
237     kCAPT_Clk_From_Fro     = CLK_MUX_DEFINE(CAPTCLKSEL, 0U), /*!< Mux CAPT_Clk from Fro. */
238     kCAPT_Clk_From_MainClk = CLK_MUX_DEFINE(CAPTCLKSEL, 1U), /*!< Mux CAPT_Clk from MainClk. */
239     kCAPT_Clk_From_Fro_Div = CLK_MUX_DEFINE(CAPTCLKSEL, 3U), /*!< Mux CAPT_Clk from Fro_Div. */
240     kCAPT_Clk_From_LPOsc   = CLK_MUX_DEFINE(CAPTCLKSEL, 4U), /*!< Mux CAPT_Clk from LPOsc. */
241 
242     kADC_Clk_From_Fro    = CLK_MUX_DEFINE(ADCCLKSEL, 0U), /*!< Mux ADC_Clk from Fro. */
243     kADC_Clk_From_Extclk = CLK_MUX_DEFINE(ADCCLKSEL, 1U), /*!< Mux ADC_Clk from Extclk. */
244 
245     kUART0_Clk_From_Fro     = CLK_MUX_DEFINE(UART0CLKSEL, 0U), /*!< Mux UART0_Clk from Fro. */
246     kUART0_Clk_From_MainClk = CLK_MUX_DEFINE(UART0CLKSEL, 1U), /*!< Mux UART0_Clk from MainClk. */
247     kUART0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(UART0CLKSEL, 2U), /*!< Mux UART0_Clk from Frg0Clk. */
248     kUART0_Clk_From_Fro_Div = CLK_MUX_DEFINE(UART0CLKSEL, 4U), /*!< Mux UART0_Clk from Fro_Div. */
249 
250     kUART1_Clk_From_Fro     = CLK_MUX_DEFINE(UART1CLKSEL, 0U), /*!< Mux UART1_Clk from Fro. */
251     kUART1_Clk_From_MainClk = CLK_MUX_DEFINE(UART1CLKSEL, 1U), /*!< Mux UART1_Clk from MainClk. */
252     kUART1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(UART1CLKSEL, 2U), /*!< Mux UART1_Clk from Frg0Clk. */
253     kUART1_Clk_From_Fro_Div = CLK_MUX_DEFINE(UART1CLKSEL, 4U), /*!< Mux UART1_Clk from Fro_Div. */
254 
255     kI2C0_Clk_From_Fro     = CLK_MUX_DEFINE(I2C0CLKSEL, 0U), /*!< Mux I2C0_Clk from Fro. */
256     kI2C0_Clk_From_MainClk = CLK_MUX_DEFINE(I2C0CLKSEL, 1U), /*!< Mux I2C0_Clk from MainClk. */
257     kI2C0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(I2C0CLKSEL, 2U), /*!< Mux I2C0_Clk from Frg0Clk. */
258     kI2C0_Clk_From_Fro_Div = CLK_MUX_DEFINE(I2C0CLKSEL, 4U), /*!< Mux I2C0_Clk from Fro_Div. */
259 
260     kI2C1_Clk_From_Fro     = CLK_MUX_DEFINE(I2C1CLKSEL, 0U), /*!< Mux I2C1_Clk from Fro. */
261     kI2C1_Clk_From_MainClk = CLK_MUX_DEFINE(I2C1CLKSEL, 1U), /*!< Mux I2C1_Clk from MainClk. */
262     kI2C1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(I2C1CLKSEL, 2U), /*!< Mux I2C1_Clk from Frg0Clk. */
263     kI2C1_Clk_From_Fro_Div = CLK_MUX_DEFINE(I2C1CLKSEL, 4U), /*!< Mux I2C1_Clk from Fro_Div. */
264 
265     kSPI0_Clk_From_Fro     = CLK_MUX_DEFINE(SPI0CLKSEL, 0U), /*!< Mux SPI0_Clk from Fro. */
266     kSPI0_Clk_From_MainClk = CLK_MUX_DEFINE(SPI0CLKSEL, 1U), /*!< Mux SPI0_Clk from MainClk. */
267     kSPI0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(SPI0CLKSEL, 2U), /*!< Mux SPI0_Clk from Frg0Clk. */
268     kSPI0_Clk_From_Fro_Div = CLK_MUX_DEFINE(SPI0CLKSEL, 4U), /*!< Mux SPI0_Clk from Fro_Div. */
269 
270     kFRG0_Clk_From_Fro     = CLK_MUX_DEFINE(FRG[0].FRGCLKSEL, 0U), /*!< Mux FRG0_Clk from Fro. */
271     kFRG0_Clk_From_MainClk = CLK_MUX_DEFINE(FRG[0].FRGCLKSEL, 1U), /*!< Mux FRG0_Clk from MainClk. */
272 
273     kCLKOUT_From_Fro     = CLK_MUX_DEFINE(CLKOUTSEL, 0U), /*!< Mux CLKOUT from Fro. */
274     kCLKOUT_From_MainClk = CLK_MUX_DEFINE(CLKOUTSEL, 1U), /*!< Mux CLKOUT from MainClk. */
275     kCLKOUT_From_ExtClk  = CLK_MUX_DEFINE(CLKOUTSEL, 3U), /*!< Mux CLKOUT from ExtClk. */
276     kCLKOUT_From_Lposc   = CLK_MUX_DEFINE(CLKOUTSEL, 4U), /*!< Mux CLKOUT from Lposc. */
277 } clock_select_t;
278 
279 /*! @brief Clock divider
280  */
281 typedef enum _clock_divider
282 {
283     kCLOCK_DivAhbClk = CLK_DIV_DEFINE(SYSAHBCLKDIV), /*!< Ahb Clock Divider. */
284     kCLOCK_DivAdcClk = CLK_DIV_DEFINE(ADCCLKDIV),    /*!< Adc Clock Divider. */
285     kCLOCK_DivClkOut = CLK_DIV_DEFINE(CLKOUTDIV),    /*!< Clk Out Divider. */
286 } clock_divider_t;
287 
288 //
289 // typedef enum _clock_wdt_analog_freq
290 //{
291 //    kCLOCK_WdtAnaFreq0HZ = CLK_WDT_OSC_DEFINE(0U, 0U),
292 //    kCLOCK_WdtAnaFreq600KHZ = CLK_WDT_OSC_DEFINE(600000U, 1U),
293 //    kCLOCK_WdtAnaFreq1050KHZ = CLK_WDT_OSC_DEFINE(1050000U, 2u),
294 //    kCLOCK_WdtAnaFreq1400KHZ = CLK_WDT_OSC_DEFINE(1400000U, 3U),
295 //    kCLOCK_WdtAnaFreq1750KHZ = CLK_WDT_OSC_DEFINE(1750000U, 4U),
296 //    kCLOCK_WdtAnaFreq2100KHZ = CLK_WDT_OSC_DEFINE(2100000U, 5U),
297 //    kCLOCK_WdtAnaFreq2400KHZ = CLK_WDT_OSC_DEFINE(2400000U, 6U),
298 //    kCLOCK_WdtAnaFreq2700KHZ = CLK_WDT_OSC_DEFINE(2700000U, 7U),
299 //    kCLOCK_WdtAnaFreq3000KHZ = CLK_WDT_OSC_DEFINE(3000000U, 8U),
300 //    kCLOCK_WdtAnaFreq3250KHZ = CLK_WDT_OSC_DEFINE(3250000U, 9U),
301 //    kCLOCK_WdtAnaFreq3500KHZ = CLK_WDT_OSC_DEFINE(3500000U, 10U),
302 //    kCLOCK_WdtAnaFreq3750KHZ = CLK_WDT_OSC_DEFINE(3750000U, 11U),
303 //    kCLOCK_WdtAnaFreq4000KHZ = CLK_WDT_OSC_DEFINE(4000000U, 12U),
304 //    kCLOCK_WdtAnaFreq4200KHZ = CLK_WDT_OSC_DEFINE(4200000U, 13U),
305 //    kCLOCK_WdtAnaFreq4400KHZ = CLK_WDT_OSC_DEFINE(4400000U, 14U),
306 //    kCLOCK_WdtAnaFreq4600KHZ = CLK_WDT_OSC_DEFINE(4600000U, 15U),
307 //} clock_wdt_analog_freq_t;
308 
309 /*! @brief fro output frequency source definition */
310 // typedef enum _clock_fro_src
311 //{
312 //   kCLOCK_FroSrcLpwrBootValue = 0U,
313 //    kCLOCK_FroSrcFroOsc = 1U << SYSCON_FROOSCCTRL_DIRECT_SHIFT,
314 //} clock_fro_src_t;
315 
316 /*! @brief fro oscillator output frequency value definition */
317 typedef enum _clock_fro_osc_freq
318 {
319     kCLOCK_FroOscOut18M = 18000U, /*!< FRO oscillator output 18M */
320     kCLOCK_FroOscOut24M = 24000U, /*!< FRO oscillator output 24M */
321     kCLOCK_FroOscOut30M = 30000U, /*!< FRO oscillator output 30M */
322 } clock_fro_osc_freq_t;
323 
324 /*! @brief PLL clock definition.*/
325 // typedef enum _clock_sys_pll_src
326 //{
327 //    kCLOCK_SysPllSrcFRO = 0U,
328 //    kCLOCK_SysPllSrcExtClk = 1U,
329 //    kCLOCK_SysPllSrcWdtOsc = 2U,
330 //    kCLOCK_SysPllSrcFroDiv = 3U,
331 //} clock_sys_pll_src;
332 
333 /*!< Main clock source definition */
334 typedef enum _clock_main_clk_src
335 {
336     kCLOCK_MainClkSrcFro    = CLK_MAIN_CLK_MUX_DEFINE(0U, 0U), /*!< main clock source from FRO */
337     kCLOCK_MainClkSrcExtClk = CLK_MAIN_CLK_MUX_DEFINE(1U, 0U), /*!< main clock source from Ext clock */
338     kCLOCK_MainClkSrcLPOsc  = CLK_MAIN_CLK_MUX_DEFINE(2U, 0U), /*!< main clock source from lower power oscillator */
339     kCLOCK_MainClkSrcFroDiv = CLK_MAIN_CLK_MUX_DEFINE(3U, 0U), /*!< main clock source from FRO Div */
340     // kCLOCK_MainClkSrcSysPll = CLK_MAIN_CLK_MUX_DEFINE(0U, 1U),
341 } clock_main_clk_src_t;
342 
343 /*! @brief PLL configuration structure */
344 // typedef struct _clock_sys_pll
345 //{
346 //    uint32_t targetFreq;
347 //    clock_sys_pll_src src;
348 //} clock_sys_pll_t;
349 
350 /*******************************************************************************
351  * API
352  ******************************************************************************/
353 
354 #if defined(__cplusplus)
355 extern "C" {
356 #endif /* __cplusplus */
357 
358 /*!
359  * @name Clock gate, mux, and divider.
360  * @{
361  */
362 
363 /*
364  *! @brief enable ip clock.
365  *
366  * @param clk clock ip definition.
367  */
CLOCK_EnableClock(clock_ip_name_t clk)368 static inline void CLOCK_EnableClock(clock_ip_name_t clk)
369 {
370     *(volatile uint32_t *)(((uint32_t)(&SYSCON->SYSAHBCLKCTRL0)) + CLK_GATE_GET_REG(clk)) |=
371         1UL << CLK_GATE_GET_BITS_SHIFT(clk);
372 }
373 
374 /*
375  *!@brief disable ip clock.
376  *
377  * @param clk clock ip definition.
378  */
CLOCK_DisableClock(clock_ip_name_t clk)379 static inline void CLOCK_DisableClock(clock_ip_name_t clk)
380 {
381     *(volatile uint32_t *)(((uint32_t)(&SYSCON->SYSAHBCLKCTRL0)) + CLK_GATE_GET_REG(clk)) &=
382         ~(1UL << CLK_GATE_GET_BITS_SHIFT(clk));
383 }
384 
385 /*
386  *! @brief	Configure the clock selection muxes.
387  * @param	mux	: Clock to be configured.
388  * @return	Nothing
389  */
CLOCK_Select(clock_select_t sel)390 static inline void CLOCK_Select(clock_select_t sel)
391 {
392     *(CLK_MUX_GET_REG(sel)) = CLK_MUX_GET_MUX(sel);
393 }
394 
395 /*
396  *! @brief	Setup peripheral clock dividers.
397  * @param	name	: Clock divider name
398  * @param   value: Value to be divided
399  * @return	Nothing
400  */
CLOCK_SetClkDivider(clock_divider_t name,uint32_t value)401 static inline void CLOCK_SetClkDivider(clock_divider_t name, uint32_t value)
402 {
403     CLK_DIV_GET_REG(name) = value & 0xFFU;
404 }
405 
406 /*
407  *! @brief  Get peripheral clock dividers.
408  * @param   name    : Clock divider name
409  * @return  clock divider value
410  */
CLOCK_GetClkDivider(clock_divider_t name)411 static inline uint32_t CLOCK_GetClkDivider(clock_divider_t name)
412 {
413     return CLK_DIV_GET_REG(name) & 0xFFU;
414 }
415 
416 /*
417  *! @brief   Setup Core clock dividers.
418  * Be careful about the core divider value, due to core/system frequency should be lower than 30MHZ.
419  * @param   value: Value to be divided
420  * @return  Nothing
421  */
CLOCK_SetCoreSysClkDiv(uint32_t value)422 static inline void CLOCK_SetCoreSysClkDiv(uint32_t value)
423 {
424     assert(value != 0U);
425 
426     SYSCON->SYSAHBCLKDIV = (SYSCON->SYSAHBCLKDIV & (~SYSCON_SYSAHBCLKDIV_DIV_MASK)) | SYSCON_SYSAHBCLKDIV_DIV(value);
427 }
428 
429 /*! @brief  Set main clock reference source.
430  * @param src Reference clock_main_clk_src_t to set the main clock source.
431  */
432 void CLOCK_SetMainClkSrc(clock_main_clk_src_t src);
433 
434 /*
435  *! @brief	Set Fractional generator multiplier value.
436  * @param   base: Fractional generator register address
437  * @param	mul	: FRG multiplier value.
438  * @return	Nothing
439  */
CLOCK_SetFRGClkMul(uint32_t * base,uint32_t mul)440 static inline void CLOCK_SetFRGClkMul(uint32_t *base, uint32_t mul)
441 {
442     CLK_FRG_DIV_REG_MAP(base) = SYSCON_FRG_FRGDIV_DIV_MASK;
443     CLK_FRG_MUL_REG_MAP(base) = SYSCON_FRG_FRGMULT_MULT(mul);
444 }
445 
446 /*! @brief Set FRO clock source
447  * @param src, please reference _clock_fro_src definition.
448  *
449  */
450 // void CLOCK_SetFroOutClkSrc(clock_fro_src_t src);
451 
452 /* @} */
453 
454 /*!
455  * @name Get frequency
456  * @{
457  */
458 
459 /*! @brief  Return Frequency of FRG0 Clock.
460  *  @return Frequency of FRG0 Clock.
461  */
462 uint32_t CLOCK_GetFRG0ClkFreq(void);
463 
464 /*! @brief  Return Frequency of Main Clock.
465  *  @return Frequency of Main Clock.
466  */
467 uint32_t CLOCK_GetMainClkFreq(void);
468 
469 /*! @brief  Return Frequency of FRO.
470  *  @return Frequency of FRO.
471  */
472 uint32_t CLOCK_GetFroFreq(void);
473 
474 /*! @brief  Return Frequency of core.
475  *  @return Frequency of core.
476  */
CLOCK_GetCoreSysClkFreq(void)477 static inline uint32_t CLOCK_GetCoreSysClkFreq(void)
478 {
479     return CLOCK_GetMainClkFreq() / (SYSCON->SYSAHBCLKDIV & 0xffU);
480 }
481 
482 /*! @brief  Return Frequency of ClockOut
483  *  @return Frequency of ClockOut
484  */
485 uint32_t CLOCK_GetClockOutClkFreq(void);
486 
487 /*! @brief  Get UART0 frequency
488  * @retval UART0 frequency value.
489  */
490 uint32_t CLOCK_GetUart0ClkFreq(void);
491 
492 /*! @brief  Get UART1 frequency
493  * @retval UART1 frequency value.
494  */
495 uint32_t CLOCK_GetUart1ClkFreq(void);
496 
497 /*! @brief	Return Frequency of selected clock
498  *  @return	Frequency of selected clock
499  */
500 uint32_t CLOCK_GetFreq(clock_name_t clockName);
501 
502 /*! @brief  Get watch dog OSC frequency
503  * @retval watch dog OSC frequency value.
504  */
CLOCK_GetLPOscFreq(void)505 static inline uint32_t CLOCK_GetLPOscFreq(void)
506 {
507     return g_LP_Osc_Freq;
508 }
509 
510 /*! @brief  Get external clock frequency
511  * @retval external clock frequency value.
512  */
CLOCK_GetExtClkFreq(void)513 static inline uint32_t CLOCK_GetExtClkFreq(void)
514 {
515     return g_Ext_Clk_Freq;
516 }
517 /* @} */
518 
519 /*!
520  * @name PLL operations
521  * @{
522  */
523 
524 /*! @brief  System PLL initialize.
525  *  @param config System PLL configurations.
526  */
527 // void CLOCK_InitSystemPll(const clock_sys_pll_t *config);
528 
529 /* @} */
530 
531 /*!
532  * @name Fractional clock operations
533  * @{
534  */
535 
536 /*! @brief Set FRG0 output frequency.
537  * @param freq  target output frequency,freq < input and (input / freq) < 2 should be satisfy.
538  * @retval true - successfully, false - input argument is invalid.
539  *
540  */
541 bool CLOCK_SetFRG0ClkFreq(uint32_t freq);
542 
543 /* @} */
544 
545 /*!
546  * @name External/internal oscillator clock operations
547  * @{
548  */
549 
550 /*! @brief  Init external CLK IN, select the CLKIN as the external clock source.
551  * @param clkInFreq external clock in frequency.
552  */
553 void CLOCK_InitExtClkin(uint32_t clkInFreq);
554 
555 /*! @brief  Deinit watch dog OSC */
CLOCK_DeinitLpOsc(void)556 static inline void CLOCK_DeinitLpOsc(void)
557 {
558     SYSCON->PDRUNCFG |= SYSCON_PDRUNCFG_LPOSC_PD_MASK;
559 }
560 
561 // void CLOCK_InitSysOsc(uint32_t oscFreq);
562 
563 // static inline void CLOCK_DeinitSysOsc(void)
564 //{
565 //
566 //    SYSCON->PDRUNCFG |= SYSCON_PDRUNCFG_SYSOSC_PD_MASK;
567 //}
568 
569 // void CLOCK_InitWdtOsc(clock_wdt_analog_freq_t wdtOscFreq, uint32_t wdtOscDiv);
570 
571 // static inline void CLOCK_DeinitWdtOsc(void)
572 //{
573 //    SYSCON->PDRUNCFG |= SYSCON_PDRUNCFG_LPOSC_PD_MASK;
574 //}
575 
576 /*! @brief Set FRO oscillator output frequency.
577  *  Initialize the FRO clock to given frequency (18, 24 or 30 MHz).
578  * @param freq Please refer to definition of clock_fro_osc_freq_t, frequency must be one of 18000, 24000 or 30000 KHz.
579  *
580  */
581 void CLOCK_SetFroOscFreq(clock_fro_osc_freq_t freq);
582 
583 /* @} */
584 
585 #if defined(__cplusplus)
586 }
587 #endif /* __cplusplus */
588 
589 /*! @} */
590 
591 #endif /* _FSL_CLOCK_H_ */
592