1
6
7
8
9
10
11
12
13
14
15
16
17
18
19
25
26
37
38
39
40
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
126
127
128
129
130
131
132
133
134
135
140
141
142
143
144
145
146
147
148
/* ... */
#include "pico/runtime_init.h"
#if !PICO_RUNTIME_NO_INIT_CLOCKS
#include "hardware/clocks.h"
#include "hardware/pll.h"
#include "hardware/ticks.h"
#include "hardware/xosc.h"
#if PICO_RP2040
#include "hardware/regs/rtc.h"
#endif
#if PICO_RP2040
#define RTC_CLOCK_FREQ_HZ (USB_CLK_HZ / 1024)
/* ... */#endif
static void start_all_ticks(void) {
uint32_t cycles = clock_get_hz(clk_ref) / MHZ;
for (int i = 0; i < (int)TICK_COUNT; ++i) {
tick_start((tick_gen_num_t)i, cycles);
}for (int i = 0; i < (int)TICK_COUNT; ++i) { ... }
}{ ... }
void __weak runtime_init_clocks(void) {
if (running_on_fpga()) {
for (uint i = 0; i < CLK_COUNT; i++) {
clock_set_reported_hz(i, 48 * MHZ);
}for (uint i = 0; i < CLK_COUNT; i++) { ... }
clock_set_reported_hz(clk_ref, 12 * MHZ);
#if HAS_RP2040_RTC
clock_set_reported_hz(clk_rtc, RTC_CLOCK_FREQ_HZ);
#endif
}if (running_on_fpga()) { ... } else {
clocks_hw->resus.ctrl = 0;
xosc_init();
hw_clear_bits(&clocks_hw->clk[clk_sys].ctrl, CLOCKS_CLK_SYS_CTRL_SRC_BITS);
while (clocks_hw->clk[clk_sys].selected != 0x1)
tight_loop_contents();
hw_clear_bits(&clocks_hw->clk[clk_ref].ctrl, CLOCKS_CLK_REF_CTRL_SRC_BITS);
while (clocks_hw->clk[clk_ref].selected != 0x1)
tight_loop_contents();
pll_init(pll_sys, PLL_SYS_REFDIV, PLL_SYS_VCO_FREQ_HZ, PLL_SYS_POSTDIV1, PLL_SYS_POSTDIV2);
pll_init(pll_usb, PLL_USB_REFDIV, PLL_USB_VCO_FREQ_HZ, PLL_USB_POSTDIV1, PLL_USB_POSTDIV2);
clock_configure_undivided(clk_ref,
CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC,
0,
XOSC_HZ);
clock_configure_undivided(clk_sys,
CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX,
CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS,
SYS_CLK_HZ);
clock_configure_undivided(clk_usb,
0,
CLOCKS_CLK_USB_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
USB_CLK_HZ);
clock_configure_undivided(clk_adc,
0,
CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
USB_CLK_HZ);
#if HAS_RP2040_RTC
#if (USB_CLK_HZ % RTC_CLOCK_FREQ_HZ == 0)
clock_configure_int_divider(clk_rtc,
0,
CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
USB_CLK_HZ,
USB_CLK_HZ / RTC_CLOCK_FREQ_HZ);
/* ... */
#else
clock_configure(clk_rtc,
0,
CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
USB_CLK_HZ,
RTC_CLOCK_FREQ_HZ);
/* ... */
#endif/* ... */
#endif
clock_configure_undivided(clk_peri,
0,
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS,
SYS_CLK_HZ);
#if HAS_HSTX
clock_configure_undivided(clk_hstx,
0,
CLOCKS_CLK_HSTX_CTRL_AUXSRC_VALUE_CLK_SYS,
SYS_CLK_HZ);/* ... */
#endif
}else { ... }
start_all_ticks();
}{ ... }
/* ... */#endif