This series introduces initial support for the Raspberry Pi Pico 2 board,
and its RP2350 SoC. Only the dual-core Cortex-M33 (Armv8-M) is supported.
Motivation & OS Booting:
------------------------
This port was created to bring standard, flexible bootloader capabilities to
the
RP2350 platform, in future this can be extended to use complex boot scripts,
environmental variables and structured payload handoffs. Though booting Linux
will
almost be impossible due to hardware limitations but for now as a PoC I was able
to booted Zephyr OS.
This port has been successfully used to execute a downstream Zephyr RTOS image
directly from the
U-Boot shell using the following configuration and process:
1. Zephyr's default UART configuration was switched to target UART1 (GPIO
4/5).
2. To avoid collisions with U-Boot's base mapping (0x10000000), Zephyr was
linked to execute from a flash offset at 0x10040000.
3. The Zephyr binary was deployed to hardware via picotool:
$ picotool load build/zephyr/zephyr.uf2 -v
4. From the U-Boot prompt, the entry point vector was audited and triggered:
RP2350> md.l 0x10040000 2
10040000: 20001018 10040ec1 ... ....
RP2350> go 0x10040ec1
## Starting application at 0x10040EC1 ...
*** Booting Zephyr OS build v4.4.0-11807-g357467a011cd ***
Hello World! rpi_pico2/rp2350a/m33
Work in Progress & Limitations:
-------------------------------
- The arch_cpu_init() hook has been completely dropped from this series. The
previous MPU configuration was implemented using an Armv7-M standard, which
is fundamentally incompatible with Armv8-M's PMSAv8 architecture. Proper
Armv8-M support will be added in a follow-up patch series.
- Critical drivers like a dedicated Driver Model (DM) Clock controller and a
Watchdog driver (essential for handling hardware resets) are currently
actively work-in-progress and will be submitted separately.
Flashing Procedure:
-------------------
For local validation and hardware testing on Pico 2/Pico 2 W boards, use the
following routine to target the execution workspace via picotool:
picotool uf2 convert u-boot.bin u-boot.uf2 --family rp2350-arm-s --offset
0x10000000
picotool load u-boot.uf2 -v -x
Changes v1 -> v2:
- Addressed various community review comments regarding code architecture.
- Simplified rp2350_clocks_init() to sequentially step power configurations
directly to the VCO, avoiding redundant power cycles on peripheral dividers.
- Dropped obsolete Armv7-M arch_cpu_init() / MPU logic placeholders.
- Relocated common memory nodes down from the board .dts to the base
rp2350.dtsi.
- Migrated bi_dram[] management from bd to gd inside board/pico2.c to remain
compliant with treewide upstream frame changes.
- Added a dedicated Driver Model (DM) hardware timer driver (rp2350_timer.c)
and enabled the microsecond tick generator to fix timing command crashes.
Bootlog:
--------
U-Boot 2026.10-rc2-00026-ga5242764380f-dirty (Sep 03 2026 - 01:27:58 +0530)
CPU: Raspberry Pi RP2350
Model: Raspberry Pi Pico 2
DRAM: 520 KiB
Core: 6 devices, 6 uclasses, devicetree: embed
MMC:
Loading Environment from nowhere... OK
In: serial@40078000
Out: serial@40078000
Err: serial@40078000
RP2350>
Bhargav Das (4):
arm: Add RP2350 architecture support
arm: dts: Add RP2350 device tree
board: raspberrypi: Add Pico 2 support
arm: rp2350: Add driver for RP2350 hardware timers