Skip to content

Commit d83a4a0

Browse files
committed
Futher review comments and move to specify system freqs in kHz (not MHz)
1 parent 227da5b commit d83a4a0

File tree

8 files changed

+82
-69
lines changed

8 files changed

+82
-69
lines changed

src/host/pico_platform/include/hardware/platform_defs.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
#define NUM_SPIN_LOCKS 32u
1919

20-
#define XOSC_MHZ 12
20+
#define XOSC_KHZ 12000u
2121

2222
#define NUM_SPIN_LOCKS 32u
2323

src/rp2040/hardware_regs/include/hardware/platform_defs.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,19 +37,23 @@
3737

3838
#define PIO_INSTRUCTION_COUNT _u(32)
3939

40-
// For USB operation this *has* to be 48 MHz
41-
#define USB_CLK_MHZ _u(48)
42-
43-
// PICO_CONFIG: SYS_CLK_MHZ, The system operating frequency in MHz, type=int, default=125, advanced=true, group=hardware_base
44-
#ifndef SYS_CLK_MHZ
45-
#define SYS_CLK_MHZ _u(125)
40+
// PICO_CONFIG: XOSC_KHZ, The crystal oscillator frequency in kHz, type=int, default=12000, advanced=true, group=hardware_base
41+
// NOTE: The system and USB clocks are generated from the frequency using two PLLs.
42+
// If you override this define, or SYS_CLK_KHZ below, you will *also* need to add your own adjusted PLL set-up defines to
43+
// overide the defaults which live in src/rp2_common/hardware_clocks/include/hardware/clocks.h
44+
// Please see the comments there about calculating the new PLL setting values.
45+
#ifndef XOSC_KHZ
46+
#define XOSC_KHZ _u(12000)
4647
#endif
4748

48-
// PICO_CONFIG: XOSC_MHZ, The crystal oscillator frequency in MHz, type=int, default=12, advanced=true, group=hardware_base
49-
#ifndef XOSC_MHZ
50-
#define XOSC_MHZ _u(12)
49+
// PICO_CONFIG: SYS_CLK_KHZ, The system operating frequency in kHz, type=int, default=125000, advanced=true, group=hardware_base
50+
#ifndef SYS_CLK_KHZ
51+
#define SYS_CLK_KHZ _u(125000)
5152
#endif
5253

54+
// For USB operation this *has* to be 48MHz
55+
#define USB_CLK_KHZ _u(48000)
56+
5357
#define FIRST_USER_IRQ (NUM_IRQS - NUM_USER_IRQS)
5458
#define VTABLE_FIRST_IRQ 16
5559

src/rp2_common/hardware_clocks/clocks.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
// division ratio will be used in the clocks block). A divisor of 1024 generates
1919
// an RTC clock tick of 46875Hz. This frequency is relatively close to the
2020
// customary 32 or 32.768kHz 'slow clock' crystals and provides good timing resolution.
21-
#define RTC_CLOCK_FREQ_HZ (USB_CLK_MHZ * MHZ / 1024)
21+
#define RTC_CLOCK_FREQ_HZ (USB_CLK_KHZ * KHZ / 1024)
2222

2323
check_hw_layout(clocks_hw_t, clk[clk_adc].selected, CLOCKS_CLK_ADC_SELECTED_OFFSET);
2424
check_hw_layout(clocks_hw_t, fc0.result, CLOCKS_FC0_RESULT_OFFSET);
@@ -125,8 +125,8 @@ bool clock_configure(enum clock_index clk_index, uint32_t src, uint32_t auxsrc,
125125
/// \end::clock_configure[]
126126

127127
void clocks_init(void) {
128-
// Start tick in watchdog
129-
watchdog_start_tick(XOSC_MHZ);
128+
// Start tick in watchdog, the argument is in 'cycles per microsecond' i.e. MHz
129+
watchdog_start_tick(XOSC_KHZ / KHZ);
130130

131131
// Everything is 48MHz on FPGA apart from RTC. Otherwise set to 0 and will be set in clock configure
132132
if (running_on_fpga()) {
@@ -152,55 +152,55 @@ void clocks_init(void) {
152152
tight_loop_contents();
153153

154154
/// \tag::pll_init[]
155-
pll_init(pll_sys, PLL_COMMON_REFDIV, PLL_SYS_VCO_FREQ_MHZ * MHZ, PLL_SYS_POSTDIV1, PLL_SYS_POSTDIV2);
156-
pll_init(pll_usb, PLL_COMMON_REFDIV, PLL_USB_VCO_FREQ_MHZ * MHZ, PLL_USB_POSTDIV1, PLL_USB_POSTDIV2);
155+
pll_init(pll_sys, PLL_COMMON_REFDIV, PLL_SYS_VCO_FREQ_KHZ * KHZ, PLL_SYS_POSTDIV1, PLL_SYS_POSTDIV2);
156+
pll_init(pll_usb, PLL_COMMON_REFDIV, PLL_USB_VCO_FREQ_KHZ * KHZ, PLL_USB_POSTDIV1, PLL_USB_POSTDIV2);
157157
/// \end::pll_init[]
158158

159159
// Configure clocks
160160
// CLK_REF = XOSC (usually) 12MHz / 1 = 12MHz
161161
clock_configure(clk_ref,
162162
CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC,
163163
0, // No aux mux
164-
XOSC_MHZ * MHZ,
165-
XOSC_MHZ * MHZ);
164+
XOSC_KHZ * KHZ,
165+
XOSC_KHZ * KHZ);
166166

167167
/// \tag::configure_clk_sys[]
168168
// CLK SYS = PLL SYS (usually) 125MHz / 1 = 125MHz
169169
clock_configure(clk_sys,
170170
CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX,
171171
CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_SYS,
172-
SYS_CLK_MHZ * MHZ,
173-
SYS_CLK_MHZ * MHZ);
172+
SYS_CLK_KHZ * KHZ,
173+
SYS_CLK_KHZ * KHZ);
174174
/// \end::configure_clk_sys[]
175175

176176
// CLK USB = PLL USB 48MHz / 1 = 48MHz
177177
clock_configure(clk_usb,
178178
0, // No GLMUX
179179
CLOCKS_CLK_USB_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
180-
USB_CLK_MHZ * MHZ,
181-
USB_CLK_MHZ * MHZ);
180+
USB_CLK_KHZ * KHZ,
181+
USB_CLK_KHZ * KHZ);
182182

183183
// CLK ADC = PLL USB 48MHZ / 1 = 48MHz
184184
clock_configure(clk_adc,
185185
0, // No GLMUX
186186
CLOCKS_CLK_ADC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
187-
USB_CLK_MHZ * MHZ,
188-
USB_CLK_MHZ * MHZ);
187+
USB_CLK_KHZ * KHZ,
188+
USB_CLK_KHZ * KHZ);
189189

190190
// CLK RTC = PLL USB 48MHz / 1024 = 46875Hz
191191
clock_configure(clk_rtc,
192192
0, // No GLMUX
193193
CLOCKS_CLK_RTC_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
194-
USB_CLK_MHZ * MHZ,
194+
USB_CLK_KHZ * KHZ,
195195
RTC_CLOCK_FREQ_HZ);
196196

197197
// CLK PERI = clk_sys. Used as reference clock for Peripherals. No dividers so just select and enable
198198
// Normally choose clk_sys or clk_usb
199199
clock_configure(clk_peri,
200200
0,
201201
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS,
202-
SYS_CLK_MHZ * MHZ,
203-
SYS_CLK_MHZ * MHZ);
202+
SYS_CLK_KHZ * KHZ,
203+
SYS_CLK_KHZ * KHZ);
204204
}
205205

206206
/// \tag::clock_get_hz[]

src/rp2_common/hardware_clocks/include/hardware/clocks.h

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -89,36 +89,45 @@ extern "C" {
8989
#define KHZ 1000
9090
#define MHZ 1000000
9191

92-
#if (XOSC_MHZ == 12)
92+
/// \tag::pll_settings[]
93+
// There are two PLLs in RP2040:
94+
// The 'SYS PLL' generates the 125MHz system clock.
95+
// The 'USB PLL' generates the 48MHz USB clock.
96+
// The defines below are correct for the above two frequencies and a 12MHz crystal
97+
// frequency, defined as `XOSC_KHZ`.
98+
//
99+
// If you override `XOSC_KHZ`, the settings below will need to be checked and possibly
100+
// revised. If you override `SYS_CLK_KHZ`, the settings below will need revised!
101+
// Use `vcocalc.py` to check and calculate new values if you change any of these frequencies.
102+
/// \end::pll_settings[]
103+
93104
#ifndef PLL_COMMON_REFDIV
94105
// Software requires that the same 'reference divider' setting is used for both PLLs (although each has its own register).
95-
// In general, this is not an issue and 1 is the best setting - change with caution!
96106
#define PLL_COMMON_REFDIV 1
97107
#endif
98108

99-
// Pll settings for 48 MHz USB clock are based on being able to get an exact
100-
// 1200 MHz VCO, they _may_ need revising with a different reference frequency.
101-
#define PLL_USB_VCO_FREQ_MHZ 1200
109+
// NOTE: PLL settings for a USB clock of 48MHz are based on being able to get an
110+
// exact 1200MHz VCO, they may need revising with a different reference frequency.
111+
#ifndef PLL_USB_VCO_FREQ_KHZ
112+
#define PLL_USB_VCO_FREQ_KHZ (1200 * KHZ)
113+
#endif
114+
#ifndef PLL_USB_POSTDIV1
102115
#define PLL_USB_POSTDIV1 5
116+
#endif
117+
#ifndef PLL_USB_POSTDIV2
103118
#define PLL_USB_POSTDIV2 5
104-
#else
105-
#error Use vcocalc.py to calculate correct values for the revised reference clock frequency and define here.
106-
#endif // XOSC_MHZ == 12
119+
#endif
107120

108-
// Pll settings for standard system clock
109-
#if (SYS_CLK_MHZ == 125)
110-
/// \tag::pll_settings[]
111-
// Configure PLLs
112-
// VCO POSTDIV 1 & 2
113-
// PLL SYS: 1500MHz / 6 / 2 = 125MHz
114-
// PLL USB: 1200MHz / 5 / 5 = 48MHz
115-
/// \end::pll_settings[]
116-
#define PLL_SYS_VCO_FREQ_MHZ 1500
121+
// PLL settings for standard system clock with SYS_CLK_KHZ == 125,000
122+
#ifndef PLL_SYS_VCO_FREQ_KHZ
123+
#define PLL_SYS_VCO_FREQ_KHZ (1500 * KHZ)
124+
#endif
125+
#ifndef PLL_SYS_POSTDIV1
117126
#define PLL_SYS_POSTDIV1 6
127+
#endif
128+
#ifndef PLL_SYS_POSTDIV2
118129
#define PLL_SYS_POSTDIV2 2
119-
#else
120-
#error Use vcocalc.py to calculate correct values for the revised system clock frequency and define here.
121-
#endif // SYS_CLK_MHZ == 125
130+
#endif
122131

123132
// PICO_CONFIG: PARAM_ASSERTIONS_ENABLED_CLOCKS, Enable/disable assertions in the clocks module, type=bool, default=0, group=hardware_clocks
124133
#ifndef PARAM_ASSERTIONS_ENABLED_CLOCKS

src/rp2_common/hardware_pll/include/hardware/pll.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ typedef pll_hw_t *PLL;
3131
#define pll_sys pll_sys_hw
3232
#define pll_usb pll_usb_hw
3333

34-
#ifndef PICO_PLL_VCO_MIN_FREQ_MHZ
35-
#define PICO_PLL_VCO_MIN_FREQ_MHZ 750
34+
#ifndef PICO_PLL_VCO_MIN_FREQ_KHZ
35+
#define PICO_PLL_VCO_MIN_FREQ_KHZ (750 * KHZ)
3636
#endif
3737

38-
#ifndef PICO_PLL_VCO_MAX_FREQ_MHZ
39-
#define PICO_PLL_VCO_MAX_FREQ_MHZ 1600
38+
#ifndef PICO_PLL_VCO_MAX_FREQ_KHZ
39+
#define PICO_PLL_VCO_MAX_FREQ_KHZ (1600 * KHZ)
4040
#endif
4141

4242
/*! \brief Initialise specified PLL.

src/rp2_common/hardware_pll/pll.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44
* SPDX-License-Identifier: BSD-3-Clause
55
*/
66

7-
// For MHZ definitions etc
7+
// For frequency and PLL definitions etc.
88
#include "hardware/clocks.h"
99
#include "hardware/pll.h"
1010
#include "hardware/resets.h"
1111

1212
/// \tag::pll_init_calculations[]
1313
void pll_init(PLL pll, uint refdiv, uint vco_freq, uint post_div1, uint post_div2) {
14-
uint32_t ref_freq = XOSC_MHZ * MHZ / refdiv;
14+
uint32_t ref_freq = XOSC_KHZ * KHZ / refdiv;
1515

1616
// Check vco freq is in an acceptable range
17-
assert(vco_freq >= (PICO_PLL_VCO_MIN_FREQ_MHZ * MHZ) && vco_freq <= (PICO_PLL_VCO_MAX_FREQ_MHZ * MHZ));
17+
assert(vco_freq >= (PICO_PLL_VCO_MIN_FREQ_KHZ * KHZ) && vco_freq <= (PICO_PLL_VCO_MAX_FREQ_KHZ * KHZ));
1818

1919
// What are we multiplying the reference clock by to get the vco freq
2020
// (The regs are called div, because you divide the vco output and compare it to the refclk)

src/rp2_common/hardware_xosc/xosc.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,18 @@
66

77
#include "pico.h"
88

9-
// For MHZ definitions etc
9+
// For frequency related definitions etc
1010
#include "hardware/clocks.h"
1111

1212
#include "hardware/platform_defs.h"
1313
#include "hardware/regs/xosc.h"
1414
#include "hardware/xosc.h"
1515

16-
#if XOSC_MHZ < 1 || XOSC_MHZ > 50
17-
#error XOSC_MHZ must be in the range 1-50
16+
#if XOSC_KHZ < (1 * KHZ) || XOSC_KHZ > (15 * KHZ)
17+
#error XOSC_KHZ must be in the range 1,000-15,000KHz i.e. 1-15MHz
1818
#endif
1919

20-
#define STARTUP_DELAY (((((XOSC_MHZ * MHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER)
20+
#define STARTUP_DELAY (((((XOSC_KHZ * KHZ) / 1000) + 128) / 256) * PICO_XOSC_STARTUP_DELAY_MULTIPLIER)
2121

2222
// The DELAY field in xosc_hw->startup is 14 bits wide.
2323
#if STARTUP_DELAY >= (1 << 13)

src/rp2_common/pico_stdlib/stdlib.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ void set_sys_clock_48mhz() {
2121
clock_configure(clk_sys,
2222
CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX,
2323
CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
24-
USB_CLK_MHZ * MHZ,
25-
USB_CLK_MHZ * MHZ);
24+
USB_CLK_KHZ * KHZ,
25+
USB_CLK_KHZ * KHZ);
2626

2727
// Turn off PLL sys for good measure
2828
pll_deinit(pll_sys);
@@ -31,8 +31,8 @@ void set_sys_clock_48mhz() {
3131
clock_configure(clk_peri,
3232
0,
3333
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLK_SYS,
34-
USB_CLK_MHZ * MHZ,
35-
USB_CLK_MHZ * MHZ);
34+
USB_CLK_KHZ * KHZ,
35+
USB_CLK_KHZ * KHZ);
3636
}
3737
}
3838

@@ -41,8 +41,8 @@ void set_sys_clock_pll(uint32_t vco_freq, uint post_div1, uint post_div2) {
4141
clock_configure(clk_sys,
4242
CLOCKS_CLK_SYS_CTRL_SRC_VALUE_CLKSRC_CLK_SYS_AUX,
4343
CLOCKS_CLK_SYS_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
44-
USB_CLK_MHZ * MHZ,
45-
USB_CLK_MHZ * MHZ);
44+
USB_CLK_KHZ * KHZ,
45+
USB_CLK_KHZ * KHZ);
4646

4747
pll_init(pll_sys, PLL_COMMON_REFDIV, vco_freq, post_div1, post_div2);
4848
uint32_t freq = vco_freq / (post_div1 * post_div2);
@@ -52,8 +52,8 @@ void set_sys_clock_pll(uint32_t vco_freq, uint post_div1, uint post_div2) {
5252
clock_configure(clk_ref,
5353
CLOCKS_CLK_REF_CTRL_SRC_VALUE_XOSC_CLKSRC,
5454
0, // No aux mux
55-
XOSC_MHZ * MHZ,
56-
XOSC_MHZ * MHZ);
55+
XOSC_KHZ * KHZ,
56+
XOSC_KHZ * KHZ);
5757

5858
// CLK SYS = PLL SYS (usually) 125MHz / 1 = 125MHz
5959
clock_configure(clk_sys,
@@ -64,16 +64,16 @@ void set_sys_clock_pll(uint32_t vco_freq, uint post_div1, uint post_div2) {
6464
clock_configure(clk_peri,
6565
0, // Only AUX mux on ADC
6666
CLOCKS_CLK_PERI_CTRL_AUXSRC_VALUE_CLKSRC_PLL_USB,
67-
USB_CLK_MHZ * MHZ,
68-
USB_CLK_MHZ * MHZ);
67+
USB_CLK_KHZ * KHZ,
68+
USB_CLK_KHZ * KHZ);
6969
}
7070
}
7171

7272
bool check_sys_clock_khz(uint32_t freq_khz, uint *vco_out, uint *postdiv1_out, uint *postdiv2_out) {
73-
uint reference_freq_khz = XOSC_MHZ * KHZ / PLL_COMMON_REFDIV;
73+
uint reference_freq_khz = XOSC_KHZ / PLL_COMMON_REFDIV;
7474
for (uint fbdiv = 320; fbdiv >= 16; fbdiv--) {
7575
uint vco = fbdiv * reference_freq_khz;
76-
if (vco < PICO_PLL_VCO_MIN_FREQ_MHZ * KHZ || vco > PICO_PLL_VCO_MAX_FREQ_MHZ * KHZ) continue;
76+
if (vco < PICO_PLL_VCO_MIN_FREQ_KHZ || vco > PICO_PLL_VCO_MAX_FREQ_KHZ) continue;
7777
for (uint postdiv1 = 7; postdiv1 >= 1; postdiv1--) {
7878
for (uint postdiv2 = postdiv1; postdiv2 >= 1; postdiv2--) {
7979
uint out = vco / (postdiv1 * postdiv2);

0 commit comments

Comments
 (0)