Skip to content

Commit 1727871

Browse files
hal/imxrt117x: add function to enable PLL1 and its dividers
PLL1 and its dividers can be enabled in board_config.h JIRA: RTOS-963
1 parent daf9956 commit 1727871

File tree

1 file changed

+61
-4
lines changed

1 file changed

+61
-4
lines changed

hal/armv7m/imxrt/117x/imxrt.c

+61-4
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include "imxrt.h"
1717
#include "../../cpu.h"
1818
#include "../otp.h"
19+
#include "board_config.h"
1920

2021
#include <hal/hal.h>
2122
#include <lib/lib.h>
@@ -830,7 +831,7 @@ int _imxrt_setPfdPllFracClock(u8 pfd, u8 clk_pll, u8 frac)
830831
}
831832

832833

833-
static void _imxrt_deinitSysPll1(void)
834+
__attribute__((unused)) static void _imxrt_deinitSysPll1(void)
834835
{
835836
/* Disable PLL1 and div2, div5 */
836837
*(imxrt_common.anadig_pll + sys_pll1_ctrl) &= ~((1uL << 26u) | (1uL << 25u) | (1uL << 13u));
@@ -852,6 +853,59 @@ static void _imxrt_deinitSysPll1(void)
852853
}
853854

854855

856+
__attribute__((unused)) static void _imxrt_initSysPll1(void)
857+
{
858+
_imxrt_pmuEnablePllLdo();
859+
860+
_imxrt_setPllBypass(clk_pllsys1, 1);
861+
862+
/* Enable SYS_PLL1 clk output */
863+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) |= (1uL << 13u);
864+
865+
/* Configure Fractional PLL: div, num, denom */
866+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, 41u);
867+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_denom, 0x0fffffff);
868+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_num, 0x0aaaaaaa);
869+
/* Disable SS */
870+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ss_clr, (1uL << 15));
871+
872+
/* Enable ldo */
873+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 22u));
874+
_imxrt_delay(100u * 1000u);
875+
876+
/* POWERUP */
877+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 14u) | (1uL << 13u));
878+
879+
/* assert HOLD_RING_OFF */
880+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 13u));
881+
/* Wait until PLL lock time is halfway through */
882+
/* Lock time is 11250 ref cycles */
883+
_imxrt_delay(5625u);
884+
/* de-assert HOLD_RING_OFF */
885+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_clr, (1uL << 13u));
886+
887+
/* Wait till PLL lock time is complete */
888+
while ((*(imxrt_common.anadig_pll + sys_pll1_ctrl) & (1uL << 29u)) != (1uL << 29u)) {
889+
}
890+
891+
/* Enable PLL1 */
892+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 15u));
893+
894+
/* Disable PLL gate */
895+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) &= ~(1uL << 14u);
896+
897+
#ifdef CLOCK_SYS_PLL1DIV2_ENABLE
898+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) |= (1uL << 25);
899+
#endif
900+
901+
#ifdef CLOCK_SYS_PLL1DIV5_ENABLE
902+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) |= (1uL << 26);
903+
#endif
904+
905+
_imxrt_setPllBypass(clk_pllsys1, 0);
906+
}
907+
908+
855909
static void _imxrt_initClockTree(void)
856910
{
857911
unsigned n;
@@ -1011,11 +1065,14 @@ static void _imxrt_initClocks(void)
10111065
/* imxrt_common.cpuclk = 696000000u; */
10121066
#endif
10131067

1068+
#ifdef CLOCK_SYS_PLL1_ENABLE
1069+
/* Initialize 1Gig ethernet PLL */
1070+
_imxrt_initSysPll1();
1071+
#else
1072+
/* Bypass and deinitialize SYS_PLL1 */
10141073
_imxrt_setPllBypass(clk_pllsys1, 1);
1015-
1016-
/* Deinit 1Gig ethernet PLL */
10171074
_imxrt_deinitSysPll1();
1018-
1075+
#endif
10191076
/* TODO: Init PLL2 fixed 528 MHz */
10201077
/* _imxrt_initSysPll2(); */
10211078

0 commit comments

Comments
 (0)