16
16
#include "imxrt.h"
17
17
#include "../../cpu.h"
18
18
#include "../otp.h"
19
+ #include "board_config.h"
19
20
20
21
#include <hal/hal.h>
21
22
#include <lib/lib.h>
@@ -830,7 +831,7 @@ int _imxrt_setPfdPllFracClock(u8 pfd, u8 clk_pll, u8 frac)
830
831
}
831
832
832
833
833
- static void _imxrt_deinitSysPll1 (void )
834
+ __attribute__(( unused )) static void _imxrt_deinitSysPll1 (void )
834
835
{
835
836
/* Disable PLL1 and div2, div5 */
836
837
* (imxrt_common .anadig_pll + sys_pll1_ctrl ) &= ~((1uL << 26u ) | (1uL << 25u ) | (1uL << 13u ));
@@ -852,6 +853,59 @@ static void _imxrt_deinitSysPll1(void)
852
853
}
853
854
854
855
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
+
855
909
static void _imxrt_initClockTree (void )
856
910
{
857
911
unsigned n ;
@@ -1011,11 +1065,14 @@ static void _imxrt_initClocks(void)
1011
1065
/* imxrt_common.cpuclk = 696000000u; */
1012
1066
#endif
1013
1067
1068
+ #ifdef CLOCK_SYS_PLL1_ENABLE
1069
+ /* Initialize 1Gig ethernet PLL */
1070
+ _imxrt_initSysPll1 ();
1071
+ #else
1072
+ /* Bypass and deinitialize SYS_PLL1 */
1014
1073
_imxrt_setPllBypass (clk_pllsys1 , 1 );
1015
-
1016
- /* Deinit 1Gig ethernet PLL */
1017
1074
_imxrt_deinitSysPll1 ();
1018
-
1075
+ #endif
1019
1076
/* TODO: Init PLL2 fixed 528 MHz */
1020
1077
/* _imxrt_initSysPll2(); */
1021
1078
0 commit comments