Skip to content

Commit b03bad6

Browse files
hal/imxrt117x: enable PLL1 and PLL1DIV2
Enable 1GHz SYS_PLL1 clock and its DIV2 divider through Analog IP interface for use in ENET module. JIRA: RTOS-963
1 parent ac96315 commit b03bad6

File tree

1 file changed

+50
-4
lines changed

1 file changed

+50
-4
lines changed

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

+50-4
Original file line numberDiff line numberDiff line change
@@ -841,6 +841,54 @@ static void _imxrt_deinitSysPll1(void)
841841
}
842842

843843

844+
static void _imxrt_initSysPll1(void)
845+
{
846+
_imxrt_pmuEnablePllLdo();
847+
848+
_imxrt_setPllBypass(clk_pllsys1, 1);
849+
850+
/* Enable SYS_PLL1 clk output */
851+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) |= (1uL << 13u);
852+
853+
/* Configure Fractional PLL: div, num, denom */
854+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, 41u);
855+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_denom, 0x0fffffff);
856+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_num, 0x0aaaaaaa);
857+
/* Disable SS */
858+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ss_clr, (1uL << 15));
859+
860+
/* Enable ldo */
861+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 22u));
862+
_imxrt_delay(100u * 1000u);
863+
864+
/* POWERUP */
865+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 14u) | (1uL << 13u));
866+
867+
/* assert HOLD_RING_OFF */
868+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 13u));
869+
/* Wait until PLL lock time is halfway through */
870+
/* Lock time is 11250 ref cycles */
871+
_imxrt_delay(5625u);
872+
/* de-assert HOLD_RING_OFF */
873+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_clr, (1uL << 13u));
874+
875+
/* Wait till PLL lock time is complete */
876+
while ((*(imxrt_common.anadig_pll + sys_pll1_ctrl) & (1uL << 29u)) != (1uL << 29u)) {
877+
}
878+
879+
/* Enable PLL1 */
880+
_imxrt_vddsoc2PllAiWrite(vddsoc2pll_ai_ctrl_1g, frac_pll_ctrl0_set, (1uL << 15u));
881+
882+
/* Disable PLL gate */
883+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) &= ~(1uL << 14u);
884+
885+
/* Enable PLL1_DIV2 output for ENET module */
886+
*(imxrt_common.anadig_pll + sys_pll1_ctrl) |= (1uL << 25);
887+
888+
_imxrt_setPllBypass(clk_pllsys1, 0);
889+
}
890+
891+
844892
static void _imxrt_initClockTree(void)
845893
{
846894
unsigned n;
@@ -1000,10 +1048,8 @@ static void _imxrt_initClocks(void)
10001048
/* imxrt_common.cpuclk = 696000000u; */
10011049
#endif
10021050

1003-
_imxrt_setPllBypass(clk_pllsys1, 1);
1004-
1005-
/* Deinit 1Gig ethernet PLL */
1006-
_imxrt_deinitSysPll1();
1051+
/* Initialize 1Gig ethernet PLL */
1052+
_imxrt_initSysPll1();
10071053

10081054
/* TODO: Init PLL2 fixed 528 MHz */
10091055
/* _imxrt_initSysPll2(); */

0 commit comments

Comments
 (0)