From 806c0632236ccacde28735cfbabafa0ba9b43c45 Mon Sep 17 00:00:00 2001 From: Ian Douglas Scott Date: Fri, 17 Jan 2025 21:11:46 -0800 Subject: [PATCH] arm/rp2040,rp2350: Allow configuring XOSC startup delay This follows the formula in the "Startup Delay" section of the datasheets, where `BOARD_XOSC_STARTUPDELAY` is the time in milliseconds, which is then multiplied by the clock fequency in kHz, divided by 256 cycles, and rounded up. This differs from `pico-sdk`, which just multiplied the value of the expression it previously used by a `PICO_XOSC_STARTUP_DELAY_MULTIPLIER`. This seems less correct, though it should be essentially the same except rounding. (`BOARD_XOSC_STARTUPDELAY_MULTIPLIER` also wouldn't fit nicely the way the `#define`s are aligned.) This sets `BOARD_XOSC_STARTUPDELAY` to `1` for all boards, so this will produce the same output and not change behavior. Signed-off-by: Ian Douglas Scott --- arch/arm/src/rp2040/rp2040_xosc.c | 4 +++- arch/arm/src/rp23xx/rp23xx_xosc.c | 4 +++- boards/arm/rp2040/adafruit-feather-rp2040/include/board.h | 1 + boards/arm/rp2040/adafruit-kb2040/include/board.h | 1 + boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h | 1 + boards/arm/rp2040/pimoroni-tiny2040/include/board.h | 1 + boards/arm/rp2040/raspberrypi-pico-w/include/board.h | 1 + boards/arm/rp2040/raspberrypi-pico/include/board.h | 1 + boards/arm/rp2040/seeed-xiao-rp2040/include/board.h | 1 + boards/arm/rp2040/w5500-evb-pico/include/board.h | 1 + boards/arm/rp2040/waveshare-rp2040-lcd-1.28/include/board.h | 1 + boards/arm/rp2040/waveshare-rp2040-zero/include/board.h | 1 + boards/arm/rp23xx/pimoroni-pico-2-plus/include/board.h | 1 + boards/arm/rp23xx/raspberrypi-pico-2/include/board.h | 1 + 14 files changed, 18 insertions(+), 2 deletions(-) diff --git a/arch/arm/src/rp2040/rp2040_xosc.c b/arch/arm/src/rp2040/rp2040_xosc.c index 6f8e24e531c60..2cabaf83ba60b 100644 --- a/arch/arm/src/rp2040/rp2040_xosc.c +++ b/arch/arm/src/rp2040/rp2040_xosc.c @@ -80,7 +80,9 @@ void rp2040_xosc_init(void) /* Set xosc startup delay */ - uint32_t startup_delay = ((BOARD_XOSC_FREQ / 1000) + 128) / 256; + uint32_t startup_delay = ((BOARD_XOSC_FREQ / 1000) * + BOARD_XOSC_STARTUPDELAY + 255) / 256; + ASSERT(startup_delay < 1 << 13); putreg32(startup_delay, RP2040_XOSC_STARTUP); /* Set the enable bit now that we have set freq range and startup delay */ diff --git a/arch/arm/src/rp23xx/rp23xx_xosc.c b/arch/arm/src/rp23xx/rp23xx_xosc.c index 7bd7b3a8f00bf..adeba6bd09fd7 100644 --- a/arch/arm/src/rp23xx/rp23xx_xosc.c +++ b/arch/arm/src/rp23xx/rp23xx_xosc.c @@ -78,7 +78,9 @@ void rp23xx_xosc_init(void) /* Set xosc startup delay */ - uint32_t startup_delay = ((BOARD_XOSC_FREQ / 1000) + 128) / 256; + uint32_t startup_delay = ((BOARD_XOSC_FREQ / 1000) * + BOARD_XOSC_STARTUPDELAY + 255) / 256; + ASSERT(startup_delay < 1 << 13); putreg32(startup_delay, RP23XX_XOSC_STARTUP); /* Set the enable bit now that we have set freq range and startup delay */ diff --git a/boards/arm/rp2040/adafruit-feather-rp2040/include/board.h b/boards/arm/rp2040/adafruit-feather-rp2040/include/board.h index e6680e9e0fe2a..19c7e72ce02ac 100644 --- a/boards/arm/rp2040/adafruit-feather-rp2040/include/board.h +++ b/boards/arm/rp2040/adafruit-feather-rp2040/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/adafruit-kb2040/include/board.h b/boards/arm/rp2040/adafruit-kb2040/include/board.h index 6d7d1279baf1b..965ab389c231d 100644 --- a/boards/arm/rp2040/adafruit-kb2040/include/board.h +++ b/boards/arm/rp2040/adafruit-kb2040/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h index 952b024a93ac5..ef22c36bda84b 100644 --- a/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h +++ b/boards/arm/rp2040/adafruit-qt-py-rp2040/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/pimoroni-tiny2040/include/board.h b/boards/arm/rp2040/pimoroni-tiny2040/include/board.h index 115cd1fbd8a29..4903ec3058596 100644 --- a/boards/arm/rp2040/pimoroni-tiny2040/include/board.h +++ b/boards/arm/rp2040/pimoroni-tiny2040/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/raspberrypi-pico-w/include/board.h b/boards/arm/rp2040/raspberrypi-pico-w/include/board.h index 3a24cc3ebac42..8209624d0e6bd 100644 --- a/boards/arm/rp2040/raspberrypi-pico-w/include/board.h +++ b/boards/arm/rp2040/raspberrypi-pico-w/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/raspberrypi-pico/include/board.h b/boards/arm/rp2040/raspberrypi-pico/include/board.h index 68e77013848c7..89970505eb00a 100644 --- a/boards/arm/rp2040/raspberrypi-pico/include/board.h +++ b/boards/arm/rp2040/raspberrypi-pico/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h b/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h index 4a888387461d5..03981d4d3e71f 100644 --- a/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h +++ b/boards/arm/rp2040/seeed-xiao-rp2040/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/w5500-evb-pico/include/board.h b/boards/arm/rp2040/w5500-evb-pico/include/board.h index 5da8cd15ed309..4f1ecc318b2b2 100644 --- a/boards/arm/rp2040/w5500-evb-pico/include/board.h +++ b/boards/arm/rp2040/w5500-evb-pico/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/waveshare-rp2040-lcd-1.28/include/board.h b/boards/arm/rp2040/waveshare-rp2040-lcd-1.28/include/board.h index 21d038640c896..ad693517a078d 100644 --- a/boards/arm/rp2040/waveshare-rp2040-lcd-1.28/include/board.h +++ b/boards/arm/rp2040/waveshare-rp2040-lcd-1.28/include/board.h @@ -48,6 +48,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp2040/waveshare-rp2040-zero/include/board.h b/boards/arm/rp2040/waveshare-rp2040-zero/include/board.h index 4435c37233061..ddb58675e02f2 100644 --- a/boards/arm/rp2040/waveshare-rp2040-zero/include/board.h +++ b/boards/arm/rp2040/waveshare-rp2040-zero/include/board.h @@ -46,6 +46,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (125 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp23xx/pimoroni-pico-2-plus/include/board.h b/boards/arm/rp23xx/pimoroni-pico-2-plus/include/board.h index 6327185a15f70..687fc6f602b0e 100644 --- a/boards/arm/rp23xx/pimoroni-pico-2-plus/include/board.h +++ b/boards/arm/rp23xx/pimoroni-pico-2-plus/include/board.h @@ -44,6 +44,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (150 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ) diff --git a/boards/arm/rp23xx/raspberrypi-pico-2/include/board.h b/boards/arm/rp23xx/raspberrypi-pico-2/include/board.h index 0b5ca2b0b3ecf..5a5dba2d7eaa6 100644 --- a/boards/arm/rp23xx/raspberrypi-pico-2/include/board.h +++ b/boards/arm/rp23xx/raspberrypi-pico-2/include/board.h @@ -45,6 +45,7 @@ #define MHZ 1000000 #define BOARD_XOSC_FREQ (12 * MHZ) +#define BOARD_XOSC_STARTUPDELAY 1 #define BOARD_PLL_SYS_FREQ (150 * MHZ) #define BOARD_PLL_USB_FREQ (48 * MHZ)