/* * Copyright 2017 NXP * All rights reserved. * * SPDX-License-Identifier: BSD-3-Clause */ #include "fsl_common.h" #include "clock_config.h" /******************************************************************************* * Definitions ******************************************************************************/ /* OSC 27M configuration */ const osc_config_t g_osc27MConfig = { .oscMode = kOSC_OscMode, .oscDiv = 1U, }; /* OSC 25M configuration */ const osc_config_t g_osc25MConfig = { .oscMode = kOSC_OscMode, .oscDiv = 1U, }; /* AUDIO PLL1 configuration */ const ccm_analog_frac_pll_config_t g_audioPll1Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv = 5U, /*!< PLL input = 25 / 5 = 5M */ .fractionDiv = 0U, .intDiv = 64U, /*!< Integer and fractional Divider output = 5 * (1 + 64) * 8 = 2600MHZ */ .outDiv = 4U, /*!< Pll out frequency = 2600 / 4 = 650MHZ */ }; /* AUDIO PLL2 configuration */ const ccm_analog_frac_pll_config_t g_audioPll2Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv = 5U, /*!< PLL input = 25 / 5 = 5M */ .fractionDiv = 0U, .intDiv = 64U, /*!< Integer and fractional Divider output = 5 * (1 + 64) * 8 = 2600MHZ */ .outDiv = 4U, /*!< Pll out frequency = 2600 / 4 = 650MHZ */ }; /* VIDEO PLL1 configuration */ const ccm_analog_frac_pll_config_t g_videoPll1Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv = 5U, /*!< PLL input = 25 / 5 = 5M */ .fractionDiv = 0U, .intDiv = 64U, /*!< Integer and fractional Divider output = 5 * (1 + 64) * 8 = 2600MHZ */ .outDiv = 4U, /*!< Pll out frequency = 2600 / 4 = 650MHZ */ }; /* SYSTEM PLL1 configuration */ const ccm_analog_sscg_pll_config_t g_sysPll1Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv1 = 1U, /*!< PLL1 input = 25 / 1 = 25MHZ */ .loopDivider1 = 32U, /*!< PLL1 output = 25 * 32 * 2 = 1600MHZ */ .refDiv2 = 24U, /*!< PLL2 input = 1600 / 24 = 66.66MHZ */ .loopDivider2 = 12U, /*!< PLL2 output = 12 * 66.66 * 2 = 1600MHZ */ .outDiv = 1U, /*!< PLL output = 1600 / 2 / 1 = 800MHZ */ }; /* SYSTEM PLL2 configuration */ const ccm_analog_sscg_pll_config_t g_sysPll2Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv1 = 1U, /*!< PLL1 input = 25 / 1 = 25MHZ */ .loopDivider1 = 32U, /*!< PLL1 output = 25 * 32 * 2 = 1600MHZ */ .refDiv2 = 16U, /*!< PLL2 input = 1600 / 16 = 100MHZ */ .loopDivider2 = 10U, /*!< PLL2 output = 10 * 100 * 2 = 2000MHZ */ .outDiv = 1U, /*!< PLL output = 2000 / 2 / 1 = 1000MHZ */ }; /* SYSTEM PLL3 configuration */ const ccm_analog_sscg_pll_config_t g_sysPll3Config = { .refSel = kANALOG_PllRefOsc25M, /*!< PLL reference OSC25M */ .refDiv1 = 1U, /*!< PLL1 input = 25 / 1 = 25MHZ */ .loopDivider1 = 32U, /*!< PLL1 output = 25 * 32 * 2 = 1600MHZ */ .refDiv2 = 16U, /*!< PLL2 input = 1600 / 16 = 100MHZ */ .loopDivider2 = 10U, /*!< PLL2 output = 10 * 100 * 2 = 2000MHZ */ .outDiv = 1U, /*!< PLL output = 2000 / 2 / 1 = 1000MHZ */ }; /******************************************************************************* * Variables ******************************************************************************/ /******************************************************************************* * Code ******************************************************************************/ void BOARD_BootClockRUN(void) { /* OSC configuration */ CLOCK_InitOSC25M(&g_osc25MConfig); CLOCK_InitOSC27M(&g_osc27MConfig); /* The following steps just show how to configure the PLL clock sources using the clock driver on M4 core side . * Please note that the ROM has already configured the SYSTEM PLL1 to 800Mhz when power up the SOC, meanwhile A core * would also do configuration on the SYSTEM PLL1 to 800Mhz and SYSTEM PLL2 to 1000Mhz by U-Boot.*/ /* switch AHB NOC root to 25M first in order to configure the SYSTEM PLL1. */ CLOCK_SetRootMux(kCLOCK_RootAhb, kCLOCK_AhbRootmuxOsc25m); CLOCK_SetRootMux(kCLOCK_RootNoc, kCLOCK_NocRootmuxOsc25m); /* switch AXI M4 root to 25M first in order to configure the SYSTEM PLL2. */ CLOCK_SetRootMux(kCLOCK_RootAxi, kCLOCK_AxiRootmuxOsc25m); CLOCK_SetRootMux(kCLOCK_RootM4, kCLOCK_M4RootmuxOsc25m); CLOCK_InitSysPll1(&g_sysPll1Config); /* init SYSTEM PLL1 run at 800MHZ */ CLOCK_InitSysPll2(&g_sysPll2Config); /* init SYSTEM PLL2 run at 1000MHZ */ CLOCK_InitSysPll3(&g_sysPll3Config); /* init SYSTEM PLL3 run at 1000MHZ */ CLOCK_InitAudioPll1(&g_audioPll1Config); /* init AUDIO PLL1 run at 650MHZ */ CLOCK_InitAudioPll2(&g_audioPll2Config); /* init AUDIO PLL2 run at 650MHZ */ CLOCK_InitVideoPll1(&g_videoPll1Config); /* init VIDEO PLL1 run at 650MHZ */ CLOCK_SetRootMux(kCLOCK_RootM4, kCLOCK_M4RootmuxSysPll1Div3); /* switch cortex-m4 to SYSTEM PLL1 DIV3 */ CLOCK_SetRootMux(kCLOCK_RootNoc, kCLOCK_NocRootmuxSysPll1); /* change back to SYSTEM PLL1*/ CLOCK_SetRootDivider(kCLOCK_RootAhb, 1U, 1U); CLOCK_SetRootMux(kCLOCK_RootAhb, kCLOCK_AhbRootmuxSysPll1Div6); /* switch AHB to SYSTEM PLL1 DIV6 = 133MHZ */ CLOCK_SetRootDivider(kCLOCK_RootAxi, 3U, 1U); CLOCK_SetRootMux(kCLOCK_RootAxi, kCLOCK_AxiRootmuxSysPll1); /* switch AXI to SYSTEM PLL1 = 266MHZ */ CLOCK_SetRootMux(kCLOCK_RootUart2, kCLOCK_UartRootmuxSysPll1Div10); /* Set UART source to SysPLL1 Div10 80MHZ */ CLOCK_SetRootDivider(kCLOCK_RootUart2, 1U, 1U); /* Set root clock to 80MHZ/ 1= 80MHZ */ CLOCK_EnableClock(kCLOCK_Rdc); /* Enable RDC clock */ /* The purpose to enable the following modules clock is to make sure the M4 core could work normally when A53 core * enters the low power status.*/ // CLOCK_EnableClock(kCLOCK_Sim_m); // CLOCK_EnableClock(kCLOCK_Sim_main); // CLOCK_EnableClock(kCLOCK_Sim_s); // CLOCK_EnableClock(kCLOCK_Sim_wakeup); // CLOCK_EnableClock(kCLOCK_Debug); // CLOCK_EnableClock(kCLOCK_Dram); // CLOCK_EnableClock(kCLOCK_Sec_Debug); /* Disable unused PLL */ CLOCK_DeinitSysPll3(); CLOCK_DeinitVideoPll1(); CLOCK_DeinitAudioPll1(); CLOCK_DeinitAudioPll2(); /* Update core clock */ SystemCoreClockUpdate(); }