1 /*
2 ** ###################################################################
3 **     Processors:          MIMX8UD7CVP08_dsp1
4 **                          MIMX8UD7DVK08_dsp1
5 **                          MIMX8UD7DVP08_dsp1
6 **
7 **     Compiler:            Xtensa Compiler
8 **     Reference manual:    IMX8ULPRM, Rev. D, December. 2022
9 **     Version:             rev. 5.0, 2023-04-27
10 **     Build:               b240228
11 **
12 **     Abstract:
13 **         Provides a system configuration function and a global variable that
14 **         contains the system frequency. It configures the device and initializes
15 **         the oscillator (PLL) that is part of the microcontroller device.
16 **
17 **     Copyright 2016 Freescale Semiconductor, Inc.
18 **     Copyright 2016-2024 NXP
19 **     SPDX-License-Identifier: BSD-3-Clause
20 **
21 **     http:                 www.nxp.com
22 **     mail:                 support@nxp.com
23 **
24 **     Revisions:
25 **     - rev. 1.0 (2020-05-25)
26 **         Initial version.
27 **     - rev. 2.0 (2020-09-18)
28 **         Base on rev A RM
29 **     - rev. 3.0 (2021-01-20)
30 **         Base on rev A.1 RM
31 **     - rev. 4.0 (2021-07-05)
32 **         Base on rev B RM
33 **     - rev. 5.0 (2023-04-27)
34 **         Base on rev D RM
35 **
36 ** ###################################################################
37 */
38 
39 /*!
40  * @file MIMX8UD7_dsp1
41  * @version 1.0
42  * @date 280224
43  * @brief Device specific configuration file for MIMX8UD7 (implementation file)
44  *
45  * Provides a system configuration function and a global variable that contains
46  * the system frequency. It configures the device and initializes the oscillator
47  * (PLL) that is part of the microcontroller device.
48  */
49 
50 #include <stdint.h>
51 #include "fsl_device_registers.h"
52 
53 /* ----------------------------------------------------------------------------
54    -- Core clock
55    ---------------------------------------------------------------------------- */
56 
57 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
58 
59 /* ----------------------------------------------------------------------------
60    -- SystemInit()
61    ---------------------------------------------------------------------------- */
getPll0Freq(void)62 static uint32_t getPll0Freq(void)
63 {
64     uint32_t freq;
65     uint32_t mult;
66     uint8_t pll0Multi[] = {0U, 15U, 16U, 20U, 22U, 25U, 30U, 0U};
67 
68     if ((CGC_RTD->PLL0CFG & CGC_PLL0CFG_SOURCE_MASK) != 0UL) /* If use FRO24M */
69     {
70         freq = CLK_FRO_192MHZ / 8U;
71     }
72     else /* Use System OSC. */
73     {
74         freq = CLK_XTAL_OSC_CLK;
75     }
76 
77     mult = ((CGC_RTD->PLL0CFG & CGC_PLL0CFG_MULT_MASK) >> CGC_PLL0CFG_MULT_SHIFT);
78     freq *= pll0Multi[mult]; /* Multiplier. */
79 
80 
81     return freq;
82 }
83 
SystemInit(void)84 void SystemInit(void)
85 {
86     SystemInitHook();
87 }
88 
89 /* ----------------------------------------------------------------------------
90    -- SystemCoreClockUpdate()
91    ---------------------------------------------------------------------------- */
92 
SystemCoreClockUpdate(void)93 void SystemCoreClockUpdate(void)
94 {
95     uint32_t fracValue;
96     uint32_t CGCOUTClock;
97     /* Identify current system clock source. */
98     switch (CGC_RTD->FUSIONCLK & CGC_FUSIONCLK_SCS_MASK)
99     {
100         case CGC_FUSIONCLK_SCS(0):
101             /* FRO clock */
102             CGCOUTClock = CLK_FRO_192MHZ;
103             break;
104         case CGC_FUSIONCLK_SCS(1):
105             /* PLL0 PFD0 */
106             CGCOUTClock = getPll0Freq();
107             fracValue   = (CGC_RTD->PLL0PFDCFG & CGC_PLL0PFDCFG_PFD0_MASK) >> CGC_PLL0PFDCFG_PFD0_SHIFT;
108             CGCOUTClock = (uint32_t)(((uint64_t)CGCOUTClock * 18U) / fracValue);
109             break;
110         case CGC_FUSIONCLK_SCS(2):
111             /* PLL0 PFD1 */
112             CGCOUTClock = getPll0Freq();
113             fracValue   = (CGC_RTD->PLL0PFDCFG & CGC_PLL0PFDCFG_PFD1_MASK) >> CGC_PLL0PFDCFG_PFD1_SHIFT;
114             CGCOUTClock = (uint32_t)(((uint64_t)CGCOUTClock * 18U) / fracValue);
115             break;
116         case CGC_FUSIONCLK_SCS(3):
117             /* SOSC */
118             CGCOUTClock = CLK_XTAL_OSC_CLK;
119             break;
120         case CGC_FUSIONCLK_SCS(4):
121             /* RTC32K */
122             CGCOUTClock = CLK_RTC_32K_CLK;
123             break;
124         case CGC_FUSIONCLK_SCS(5):
125             /* LVDS */
126             CGCOUTClock = CLK_LVDS_CLK;
127             break;
128         case CGC_FUSIONCLK_SCS(6):
129             /* PLL0 */
130             CGCOUTClock = getPll0Freq();
131             break;
132         default:
133             CGCOUTClock = 0U;
134             break;
135     }
136     /* Divide the CGC output clock to get the Fusion Core clock. */
137     CGCOUTClock /= ((CGC_RTD->FUSIONCLK & CGC_FUSIONCLK_DIVCORE_MASK) >> CGC_FUSIONCLK_DIVCORE_SHIFT) + 1U;
138     /* Update System Core Clock. */
139     SystemCoreClock = CGCOUTClock;
140 }
141 
142 /* ----------------------------------------------------------------------------
143    -- SystemInitHook()
144    ---------------------------------------------------------------------------- */
145 
SystemInitHook(void)146 __attribute__((weak)) void SystemInitHook(void)
147 {
148     /* Void implementation of the weak function. */
149 }
150