From 5c39bb22a0caff1ace4d360a9e0f2f7066c55dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20Cab=C3=A9?= Date: Wed, 21 Aug 2024 22:05:51 +0100 Subject: [PATCH] boards: Add initial support for the Raspberry Pi Pico 2 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Raspberry Pi Pico 2 is Raspberry Pi's first board fitted with their RP2350A SoC. This adds a minimal board definition, sufficient to build and run `samples/hello_world` and `samples/basic/blinky` on the board. Images can be run on the target using OpenOCD. Raspberry Pi's `picotool` can create a UF2 binary, which ensures that errata RP2350-E10 is avoided e.g. ``` > picotool uf2 convert build\rpi_pico2\hello_world\zephyr\zephyr.elf \ build\rpi_pico2\hello_world\zephyr\zephyr.uf2 \ --family rp2350-arm-s --abs-block` ``` Raspberry Pi Pico 2 is a low-cost, high-performance microcontroller board with flexible digital interfaces. Key features include: - RP2350A microcontroller chip designed by Raspberry Pi in the United Kingdom - Dual Cortex-M33 or Hazard3 processors at up to 150MHz - 520KB of SRAM, and 4MB of on-board flash memory - USB 1.1 with device and host support - Low-power sleep and dormant modes - Drag-and-drop programming using mass storage over USB - 26x multi-function GPIO pins including 3 that can be used for ADC - 2x SPI, 2x I2C, 2x UART, 3x 12-bit 500ksps Analogue to Digital Converter (ADC), 24x controllable PWM channels - 2x Timer with 4 alarms, 1x AON Timer - Temperature sensor - 3x Programmable IO (PIO) blocks, 12 state machines total for custom peripheral support - Flexible, user-programmable high-speed IO - Can emulate interfaces such as SD Card and VGA The Raspberry Pi Pico 2 comes as a castellated module which allows soldering direct to carrier boards. Only enable timer 0 for now. Timer 1 won't work correctly until the rpi_pico HAL has picked up the fix for `hardware_alarm_irq_handler`. See https://github.com/raspberrypi/pico-sdk/pull/1949 . Added some documentation for the board itself (mostly aiming to refer to canonical sources of information rather duplicate). Add entries in the release notes where applicable. boards/raspberrypi/rpi_pico2/doc/img/rpi_pico2.webp is a cropped and compressed version of https://www.raspberrypi.com/documentation/microcontrollers/images/pico-2.png which is released under the CC-BY-SA-4.0 license. See https://github.com/raspberrypi/documentation/blob/develop/LICENSE.md Signed-off-by: Andrew Featherstone Signed-off-by: Benjamin Cabé --- boards/raspberrypi/common/rpi_pico-led.dtsi | 30 ++++ .../common/rpi_pico-pinctrl-common.dtsi | 56 +++++++ boards/raspberrypi/rpi_pico/doc/index.rst | 2 + .../rpi_pico/rpi_pico-pinctrl.dtsi | 51 +------ boards/raspberrypi/rpi_pico/rpi_pico.dts | 25 +-- .../raspberrypi/rpi_pico2/Kconfig.defconfig | 9 ++ .../raspberrypi/rpi_pico2/Kconfig.rpi_pico2 | 5 + boards/raspberrypi/rpi_pico2/board.yml | 6 + .../rpi_pico2/doc/img/rpi_pico2.webp | Bin 0 -> 20010 bytes boards/raspberrypi/rpi_pico2/doc/index.rst | 87 +++++++++++ .../rpi_pico2/rpi_pico2-pinctrl.dtsi | 8 + boards/raspberrypi/rpi_pico2/rpi_pico2.dtsi | 144 ++++++++++++++++++ .../rpi_pico2/rpi_pico2_rp2350a_m33.dts | 22 +++ .../rpi_pico2/rpi_pico2_rp2350a_m33.yaml | 20 +++ .../rpi_pico2/rpi_pico2_rp2350a_m33_defconfig | 12 ++ doc/releases/migration-guide-4.1.rst | 6 +- doc/releases/release-notes-4.1.rst | 4 + 17 files changed, 412 insertions(+), 75 deletions(-) create mode 100644 boards/raspberrypi/common/rpi_pico-led.dtsi create mode 100644 boards/raspberrypi/common/rpi_pico-pinctrl-common.dtsi create mode 100644 boards/raspberrypi/rpi_pico2/Kconfig.defconfig create mode 100644 boards/raspberrypi/rpi_pico2/Kconfig.rpi_pico2 create mode 100644 boards/raspberrypi/rpi_pico2/board.yml create mode 100644 boards/raspberrypi/rpi_pico2/doc/img/rpi_pico2.webp create mode 100644 boards/raspberrypi/rpi_pico2/doc/index.rst create mode 100644 boards/raspberrypi/rpi_pico2/rpi_pico2-pinctrl.dtsi create mode 100644 boards/raspberrypi/rpi_pico2/rpi_pico2.dtsi create mode 100644 boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.dts create mode 100644 boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.yaml create mode 100644 boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33_defconfig diff --git a/boards/raspberrypi/common/rpi_pico-led.dtsi b/boards/raspberrypi/common/rpi_pico-led.dtsi new file mode 100644 index 00000000000..951e36260f2 --- /dev/null +++ b/boards/raspberrypi/common/rpi_pico-led.dtsi @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2021 Yonatan Schachter + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/* Pico and Pico 2 boards (but not Pico W) have a common LED placement. */ +/ { + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; + label = "LED"; + }; + }; + + pwm_leds { + compatible = "pwm-leds"; + status = "disabled"; + pwm_led0: pwm_led_0 { + pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; + label = "PWM_LED"; + }; + }; + + aliases { + led0 = &led0; + pwm-led0 = &pwm_led0; + }; +}; diff --git a/boards/raspberrypi/common/rpi_pico-pinctrl-common.dtsi b/boards/raspberrypi/common/rpi_pico-pinctrl-common.dtsi new file mode 100644 index 00000000000..66ccfd20895 --- /dev/null +++ b/boards/raspberrypi/common/rpi_pico-pinctrl-common.dtsi @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2021, Yonatan Schachter + * SPDX-License-Identifier: Apache-2.0 + */ + +/* The Pico and Pico 2 are pin compatible. */ +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + i2c0_default: i2c0_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + i2c1_default: i2c1_default { + group1 { + pinmux = , ; + input-enable; + input-schmitt-enable; + }; + }; + + spi0_default: spi0_default { + group1 { + pinmux = , , ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + + pwm_ch4b_default: pwm_ch4b_default { + group1 { + pinmux = ; + }; + }; + + adc_default: adc_default { + group1 { + pinmux = , , , ; + input-enable; + }; + }; +}; diff --git a/boards/raspberrypi/rpi_pico/doc/index.rst b/boards/raspberrypi/rpi_pico/doc/index.rst index b3837f8890b..71f5b42003e 100644 --- a/boards/raspberrypi/rpi_pico/doc/index.rst +++ b/boards/raspberrypi/rpi_pico/doc/index.rst @@ -96,6 +96,8 @@ hardware features: - :kconfig:option:`CONFIG_SPI` - :dtcompatible:`raspberrypi,pico-spi-pio` +.. _rpi_pico_pin_mapping: + Pin Mapping =========== diff --git a/boards/raspberrypi/rpi_pico/rpi_pico-pinctrl.dtsi b/boards/raspberrypi/rpi_pico/rpi_pico-pinctrl.dtsi index 747b0d04e40..5556638daa6 100644 --- a/boards/raspberrypi/rpi_pico/rpi_pico-pinctrl.dtsi +++ b/boards/raspberrypi/rpi_pico/rpi_pico-pinctrl.dtsi @@ -5,53 +5,4 @@ #include -&pinctrl { - uart0_default: uart0_default { - group1 { - pinmux = ; - }; - group2 { - pinmux = ; - input-enable; - }; - }; - - i2c0_default: i2c0_default { - group1 { - pinmux = , ; - input-enable; - input-schmitt-enable; - }; - }; - - i2c1_default: i2c1_default { - group1 { - pinmux = , ; - input-enable; - input-schmitt-enable; - }; - }; - - spi0_default: spi0_default { - group1 { - pinmux = , , ; - }; - group2 { - pinmux = ; - input-enable; - }; - }; - - pwm_ch4b_default: pwm_ch4b_default { - group1 { - pinmux = ; - }; - }; - - adc_default: adc_default { - group1 { - pinmux = , , , ; - input-enable; - }; - }; -}; +#include "../common/rpi_pico-pinctrl-common.dtsi" diff --git a/boards/raspberrypi/rpi_pico/rpi_pico.dts b/boards/raspberrypi/rpi_pico/rpi_pico.dts index 97d721024d7..807dc8e7800 100644 --- a/boards/raspberrypi/rpi_pico/rpi_pico.dts +++ b/boards/raspberrypi/rpi_pico/rpi_pico.dts @@ -7,27 +7,4 @@ /dts-v1/; #include "rpi_pico-common.dtsi" - -/ { - leds { - compatible = "gpio-leds"; - led0: led_0 { - gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; - label = "LED"; - }; - }; - - pwm_leds { - compatible = "pwm-leds"; - status = "disabled"; - pwm_led0: pwm_led_0 { - pwms = <&pwm 9 PWM_MSEC(20) PWM_POLARITY_NORMAL>; - label = "PWM_LED"; - }; - }; - - aliases { - led0 = &led0; - pwm-led0 = &pwm_led0; - }; -}; +#include "../common/rpi_pico-led.dtsi" diff --git a/boards/raspberrypi/rpi_pico2/Kconfig.defconfig b/boards/raspberrypi/rpi_pico2/Kconfig.defconfig new file mode 100644 index 00000000000..d122f3e4918 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2024 Andrew Featherstone +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_RPI_PICO2 + +config USB_SELF_POWERED + default n + +endif # BOARD_RPI_PICO2 diff --git a/boards/raspberrypi/rpi_pico2/Kconfig.rpi_pico2 b/boards/raspberrypi/rpi_pico2/Kconfig.rpi_pico2 new file mode 100644 index 00000000000..bcce97758fb --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/Kconfig.rpi_pico2 @@ -0,0 +1,5 @@ +# Copyright (c) 2024 Andrew Featherstone +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_RPI_PICO2 + select SOC_RP2350A_M33 if BOARD_RPI_PICO2_RP2350A_M33 diff --git a/boards/raspberrypi/rpi_pico2/board.yml b/boards/raspberrypi/rpi_pico2/board.yml new file mode 100644 index 00000000000..2ab8ee59989 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/board.yml @@ -0,0 +1,6 @@ +board: + name: rpi_pico2 + full_name: Raspberry Pi Pico 2 + vendor: raspberrypi + socs: + - name: rp2350a diff --git a/boards/raspberrypi/rpi_pico2/doc/img/rpi_pico2.webp b/boards/raspberrypi/rpi_pico2/doc/img/rpi_pico2.webp new file mode 100644 index 0000000000000000000000000000000000000000..6a4895ba7b285ba200ca6737f698375f48d6565c GIT binary patch literal 20010 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 F008#;En5Hp literal 0 HcmV?d00001 diff --git a/boards/raspberrypi/rpi_pico2/doc/index.rst b/boards/raspberrypi/rpi_pico2/doc/index.rst new file mode 100644 index 00000000000..9ce2395cf5a --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/doc/index.rst @@ -0,0 +1,87 @@ +.. zephyr:board:: rpi_pico2 + +Overview +******** + +The Raspberry Pi Pico 2 is the second-generation product in the Raspberry Pi +Pico family. From the `Raspberry Pi website `_ is referred to as Pico 2. + +There are many limitations of the board currently. Including but not limited to: +- The Zephyr build only supports configuring the RP2350A with the Cortex-M33 cores. +- As with the Pico 1, there's no support for running any code on the second core. + +Hardware +******** + +- Dual Cortex-M33 or Hazard3 processors at up to 150MHz +- 520KB of SRAM, and 4MB of on-board flash memory +- USB 1.1 with device and host support +- Low-power sleep and dormant modes +- Drag-and-drop programming using mass storage over USB +- 26 multi-function GPIO pins including 3 that can be used for ADC +- 2 SPI, 2 I2C, 2 UART, 3 12-bit 500ksps Analogue to Digital - Converter (ADC), 24 controllable PWM channels +- 2 Timer with 4 alarms, 1 AON Timer +- Temperature sensor +- 3 Programmable IO (PIO) blocks, 12 state machines total for custom peripheral support + + - Flexible, user-programmable high-speed IO + - Can emulate interfaces such as SD Card and VGA + +Supported Features +================== + +The ``rpi_pico2/rp2350a/m33`` board target supports the following +hardware features: + +.. list-table:: + :header-rows: 1 + + * - Peripheral + - Kconfig option + - Devicetree compatible + * - NVIC + - N/A + - :dtcompatible:`arm,v8m-nvic` + * - ADC + - :kconfig:option:`CONFIG_ADC` + - :dtcompatible:`raspberrypi,pico-adc` + * - Clock controller + - :kconfig:option:`CONFIG_CLOCK_CONTROL` + - :dtcompatible:`raspberrypi,pico-clock-controller` + * - Counter + - :kconfig:option:`CONFIG_COUNTER` + - :dtcompatible:`raspberrypi,pico-timer` + * - GPIO + - :kconfig:option:`CONFIG_GPIO` + - :dtcompatible:`raspberrypi,pico-gpio` + * - HWINFO + - :kconfig:option:`CONFIG_HWINFO` + - N/A + * - I2C + - :kconfig:option:`CONFIG_I2C` + - :dtcompatible:`snps,designware-i2c` + * - PWM + - :kconfig:option:`CONFIG_PWM` + - :dtcompatible:`raspberrypi,pico-pwm` + * - SPI + - :kconfig:option:`CONFIG_SPI` + - :dtcompatible:`raspberrypi,pico-spi` + * - UART + - :kconfig:option:`CONFIG_SERIAL` + - :dtcompatible:`raspberrypi,pico-uart` + +Connections and IOs +=================== + +The default pin mapping is unchanged from the Pico 1 (see :ref:`rpi_pico_pin_mapping`). + +Programming and Debugging +************************* + +As with the Pico 1, the SWD interface can be used to program and debug the +device, e.g. using OpenOCD with the `Raspberry Pi Debug Probe `_ . + +References +********** + +.. target-notes:: diff --git a/boards/raspberrypi/rpi_pico2/rpi_pico2-pinctrl.dtsi b/boards/raspberrypi/rpi_pico2/rpi_pico2-pinctrl.dtsi new file mode 100644 index 00000000000..a7841dc2da6 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/rpi_pico2-pinctrl.dtsi @@ -0,0 +1,8 @@ +/* + * Copyright (c) 2024, Andrew Featherstone + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include "../common/rpi_pico-pinctrl-common.dtsi" diff --git a/boards/raspberrypi/rpi_pico2/rpi_pico2.dtsi b/boards/raspberrypi/rpi_pico2/rpi_pico2.dtsi new file mode 100644 index 00000000000..85cdb97e845 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/rpi_pico2.dtsi @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2024 Andrew Featherstone + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include +#include + +#include "rpi_pico2-pinctrl.dtsi" +#include "../common/rpi_pico-led.dtsi" + +/ { + chosen { + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,code-partition = &code_partition; + }; + + aliases { + watchdog0 = &wdt0; + }; + + pico_header: connector { + compatible = "raspberrypi,pico-header"; + #gpio-cells = <2>; + gpio-map-mask = <0xffffffff 0xffffffc0>; + gpio-map-pass-thru = <0 0x3f>; + gpio-map = <0 0 &gpio0 0 0>, /* GP0 */ + <1 0 &gpio0 1 0>, /* GP1 */ + <2 0 &gpio0 2 0>, /* GP2 */ + <3 0 &gpio0 3 0>, /* GP3 */ + <4 0 &gpio0 4 0>, /* GP4 */ + <5 0 &gpio0 5 0>, /* GP5 */ + <6 0 &gpio0 6 0>, /* GP6 */ + <7 0 &gpio0 7 0>, /* GP7 */ + <8 0 &gpio0 8 0>, /* GP8 */ + <9 0 &gpio0 9 0>, /* GP9 */ + <10 0 &gpio0 10 0>, /* GP10 */ + <11 0 &gpio0 11 0>, /* GP11 */ + <12 0 &gpio0 12 0>, /* GP12 */ + <13 0 &gpio0 13 0>, /* GP13 */ + <14 0 &gpio0 14 0>, /* GP14 */ + <15 0 &gpio0 15 0>, /* GP15 */ + <16 0 &gpio0 16 0>, /* GP16 */ + <17 0 &gpio0 17 0>, /* GP17 */ + <18 0 &gpio0 18 0>, /* GP18 */ + <19 0 &gpio0 19 0>, /* GP19 */ + <20 0 &gpio0 20 0>, /* GP20 */ + <21 0 &gpio0 21 0>, /* GP21 */ + <22 0 &gpio0 22 0>, /* GP22 */ + <26 0 &gpio0 26 0>, /* GP26 */ + <27 0 &gpio0 27 0>, /* GP27 */ + <28 0 &gpio0 28 0>; /* GP28 */ + }; +}; + +&flash0 { + reg = <0x10000000 DT_SIZE_M(4)>; + + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + /* Reserved memory for an image definition block. The block is much + * smaller than 256 bytes, but in practice the linker places the vector + * table at a much larger alignment offset. + */ + image_def: partition@0 { + label = "image_def"; + reg = <0x00000000 0x100>; + read-only; + }; + + /* + * Usable flash. Starts at 0x100, after the image definition block. + * The partition size is 4MB minus the 0x100 bytes taken by the + * image definition. + */ + code_partition: partition@100 { + label = "code-partition"; + reg = <0x100 (DT_SIZE_M(4) - 0x100)>; + read-only; + }; + }; +}; + +&uart0 { + current-speed = <115200>; + status = "okay"; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; +}; + +&gpio0 { + status = "okay"; +}; + +&spi0 { + clock-frequency = ; + pinctrl-0 = <&spi0_default>; + pinctrl-names = "default"; +}; + +&i2c0 { + clock-frequency = ; + pinctrl-0 = <&i2c0_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&i2c1 { + clock-frequency = ; + pinctrl-0 = <&i2c1_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&adc { + pinctrl-0 = <&adc_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&pwm { + pinctrl-0 = <&pwm_ch4b_default>; + pinctrl-names = "default"; + divider-int-0 = <255>; +}; + +&timer0 { + status = "okay"; +}; + +zephyr_udc0: &usbd { + status = "okay"; +}; + +pico_serial: &uart0 {}; diff --git a/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.dts b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.dts new file mode 100644 index 00000000000..f96491f44e2 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.dts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024 Andrew Featherstone + * + * SPDX-License-Identifier: Apache-2.0 + */ + +/dts-v1/; + +/* The build system assumes that there's a cpucluster-specific file. + * + * This file provides composition of the device tree: + * 1. The common features of the SoC + * 2. Core-specific configuration. + * 3. Board-specific configuration. + */ +#include +#include + +/* there's nothing specific to the Cortex-M33 cores vs the (not yet + * implemented) Hazard3 cores. + */ +#include "rpi_pico2.dtsi" diff --git a/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.yaml b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.yaml new file mode 100644 index 00000000000..c65aa865b22 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33.yaml @@ -0,0 +1,20 @@ +identifier: rpi_pico2/rp2350a/m33 +name: Raspberry Pi Pico 2 (Cortex-M33) +type: mcu +arch: arm +flash: 4096 +ram: 520 +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - clock + - counter + - gpio + - hwinfo + - i2c + - pwm + - spi + - uart diff --git a/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33_defconfig b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33_defconfig new file mode 100644 index 00000000000..65bd7793883 --- /dev/null +++ b/boards/raspberrypi/rpi_pico2/rpi_pico2_rp2350a_m33_defconfig @@ -0,0 +1,12 @@ +# This configuration is orthogonal to whether the Cortex-M33 or Hazard3 cores +# are in use, but Zephyr does not support providing a qualifier-agnostic +# _defconfig file. +CONFIG_CLOCK_CONTROL=y +CONFIG_CONSOLE=y +CONFIG_GPIO=y +CONFIG_RESET=y +CONFIG_SERIAL=y +CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=150000000 +CONFIG_UART_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_USE_DT_CODE_PARTITION=y diff --git a/doc/releases/migration-guide-4.1.rst b/doc/releases/migration-guide-4.1.rst index c06cf7928c5..bd4ee35f388 100644 --- a/doc/releases/migration-guide-4.1.rst +++ b/doc/releases/migration-guide-4.1.rst @@ -57,6 +57,11 @@ Devicetree the devicetree property ``poll-interval-ms``. In interrupt mode, the devicetree property ``repeat`` is supported. +Raspberry Pi +============ + +* ``CONFIG_SOC_SERIES_RP2XXX`` is renamed to :kconfig:option:`CONFIG_SOC_SERIES_RP2040`. + STM32 ===== @@ -64,7 +69,6 @@ STM32 as it was introduced earlier. The Kconfig method for configuration is now removed. - Modules ******* diff --git a/doc/releases/release-notes-4.1.rst b/doc/releases/release-notes-4.1.rst index cb3d77e5b85..8c2966c1f60 100644 --- a/doc/releases/release-notes-4.1.rst +++ b/doc/releases/release-notes-4.1.rst @@ -104,10 +104,14 @@ Boards & SoC Support * Added support for these SoC series: + * Added Raspberry Pi RP2350 + * Made these changes in other SoC series: * Added support for these boards: + * :zephyr:board:`Raspberry Pi Pico 2 `: ``rpi_pico2`` + * Made these board changes: * All HWMv1 board name aliases which were added as deprecated in v3.7 are now removed