-
Notifications
You must be signed in to change notification settings - Fork 6.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
soc: rp2350: Add initial support for the Raspberry Pi RP2350
RP2350 is Raspberry Pi's newest SoC. From the datasheet: "RP2350 is a new family of microcontrollers from Raspberry Pi that offers significant enhancements over RP2040. Key features include: • Dual Cortex-M33 or Hazard3 processors at 150 MHz • 520 kB on-chip SRAM, in 10 independent banks • 8 kB of one-time-programmable storage (OTP) • Up to 16 MB of external QSPI flash/PSRAM via dedicated QSPI bus ... " This commit introduces some changes to support the existing RP2040 and the new "RP2350 family". Currently there are 4 published products in the family: RP2350A, RP2350B, RP2354A, and RP2354A. For now, split the configuration into RP20XX and RP23XX. This is foundation work ahead of introducing support for Raspberry Pi's Pico 2 board, which is fitted with a RP2350 and 4MB of flash. Signed-off-by: Andrew Featherstone <andrew.featherstone@gmail.com>
- Loading branch information
Showing
13 changed files
with
513 additions
and
22 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,357 @@ | ||
/* | ||
* Copyright (c) 2024 Andrew Featherstone | ||
* | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include <arm/armv8-m.dtsi> | ||
#include <zephyr/dt-bindings/adc/adc.h> | ||
#include <zephyr/dt-bindings/gpio/gpio.h> | ||
#include <zephyr/dt-bindings/clock/rpi_pico_rp2350_clock.h> | ||
#include <zephyr/dt-bindings/i2c/i2c.h> | ||
#include <zephyr/dt-bindings/regulator/rpi_pico.h> | ||
#include <mem.h> | ||
|
||
#include "rp2350_reset.h" | ||
|
||
/ { | ||
cpus { | ||
#address-cells = <1>; | ||
#size-cells = <0>; | ||
|
||
cpu0: cpu@0 { | ||
compatible = "arm,cortex-m33"; | ||
reg = <0>; | ||
}; | ||
|
||
cpu1: cpu@1 { | ||
compatible = "arm,cortex-m33"; | ||
reg = <1>; | ||
}; | ||
}; | ||
|
||
clocks { | ||
clk_gpout0: clk-gpout0 { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
#address-cells = <0>; | ||
}; | ||
|
||
clk_gpout1: clk-gpout1 { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_gpout2: clk-gpout2 { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_gpout3: clk-gpout3 { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_hstx: clk-hstx { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_ref: clk-ref { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&xosc>; | ||
clock-names = "xosc"; | ||
clock-frequency = <12000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_sys: clk-sys { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_sys>; | ||
clock-names = "pll_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_usb: clk-usb { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_usb>; | ||
clock-names = "pll_usb"; | ||
clock-frequency = <48000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_adc: clk-adc { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&pll_usb>; | ||
clock-names = "pll_usb"; | ||
clock-frequency = <48000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
clk_peri: clk-peri { | ||
compatible = "raspberrypi,pico-clock"; | ||
clocks = <&clk_sys>; | ||
clock-names = "clk_sys"; | ||
clock-frequency = <150000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
pll_sys: pll-sys { | ||
compatible = "raspberrypi,pico-pll"; | ||
clocks = <&xosc>; | ||
clock-names = "xosc"; | ||
clock-div= <1>; | ||
fb-div= <125>; | ||
post-div1 = <5>; | ||
post-div2 = <2>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
pll_usb: pll-usb { | ||
compatible = "raspberrypi,pico-pll"; | ||
clocks = <&xosc>; | ||
clock-names = "xosc"; | ||
clock-div= <1>; | ||
fb-div = <100>; | ||
post-div1 = <5>; | ||
post-div2 = <5>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
rosc: rosc { | ||
compatible = "raspberrypi,pico-rosc"; | ||
clock-frequency = <6500000>; | ||
range = <RPI_PICO_ROSC_RANGE_RESET>; | ||
stage-drive-strength = <0>, <0>, <0>, <0>, <0>, <0>, <0>, <0>; | ||
clock-div = <16>; | ||
phase = <0>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
rosc_ph: rosc-ph { | ||
compatible = "raspberrypi,pico-clock"; | ||
clock-frequency = <6500000>; | ||
clocks = <&rosc>; | ||
clock-names = "rosc"; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
xosc: xosc { | ||
compatible = "raspberrypi,pico-clock"; | ||
clock-frequency = <12000000>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
gpin0: gpin0 { | ||
compatible = "raspberrypi,pico-clock"; | ||
status = "disabled"; | ||
clock-frequency = <0>; | ||
#clock-cells = <0>; | ||
}; | ||
|
||
gpin1: gpin1 { | ||
compatible = "raspberrypi,pico-clock"; | ||
status = "disabled"; | ||
clock-frequency = <0>; | ||
#clock-cells = <0>; | ||
}; | ||
}; | ||
|
||
soc { | ||
compatible = "raspberrypi,rp2350", "simple-bus"; | ||
|
||
sram0: memory@20000000 { | ||
compatible = "mmio-sram"; | ||
reg = <0x20000000 DT_SIZE_K(264)>; | ||
}; | ||
|
||
qmi: flash-controller@400d0000 { | ||
compatible = "raspberrypi,pico-flash-controller"; | ||
reg = <0x400d0000 0xfc>; | ||
|
||
#address-cells = <1>; | ||
#size-cells = <1>; | ||
|
||
flash0: flash@10000000 { | ||
compatible = "soc-nv-flash"; | ||
write-block-size = <1>; | ||
erase-block-size = <DT_SIZE_K(4)>; | ||
}; | ||
status = "disabled"; | ||
}; | ||
|
||
reset: reset-controller@40020000 { | ||
compatible = "raspberrypi,pico-reset"; | ||
reg = <0x40020000 DT_SIZE_K(4)>; | ||
reg-width = <4>; | ||
active-low = <0>; | ||
#reset-cells = <1>; | ||
}; | ||
|
||
clocks: clock-controller@40010000 { | ||
compatible = "raspberrypi,pico-clock-controller"; | ||
reg = <0x40010000 DT_SIZE_K(4) | ||
0x40048000 DT_SIZE_K(4) | ||
0x40050000 DT_SIZE_K(4) | ||
0x40058000 DT_SIZE_K(4) | ||
0x400e8000 DT_SIZE_K(4)>; | ||
reg-names = "clocks", "xosc", "pll_sys", "pll_usb", "rosc"; | ||
#clock-cells = <1>; | ||
status = "okay"; | ||
clocks = <&clk_gpout0>, <&clk_gpout1>, <&clk_gpout2>, <&clk_gpout3>, | ||
<&clk_hstx>, <&clk_ref>, <&clk_sys>, <&clk_peri>, | ||
<&clk_usb>, <&clk_adc>, | ||
<&pll_sys>, <&pll_usb>, <&xosc>, <&rosc>, <&rosc_ph>, | ||
<&gpin0>, <&gpin1>; | ||
clock-names = "clk_gpout0", "clk_gpout1", "clk_gpout2", "clk_gpout3", | ||
"clk_hstx", "clk_ref", "clk_sys", "clk_peri", | ||
"clk_usb", "clk_adc", | ||
"pll_sys", "pll_usb", "xosc", "rosc", "rosc_ph", | ||
"gpin0", "gpin1"; | ||
}; | ||
|
||
gpio0: gpio@40028000 { | ||
compatible = "raspberrypi,pico-gpio"; | ||
reg = <0x40028000 DT_SIZE_K(4)>; | ||
interrupts = <21 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
gpio-controller; | ||
#gpio-cells = <2>; | ||
status = "disabled"; | ||
ngpios = <30>; | ||
}; | ||
|
||
uart0: uart@40070000 { | ||
compatible = "raspberrypi,pico-uart", "arm,pl011"; | ||
reg = <0x40070000 DT_SIZE_K(4)>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_UART0>; | ||
interrupts = <33 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "uart0"; | ||
status = "disabled"; | ||
}; | ||
|
||
uart1: uart@40078000 { | ||
compatible = "raspberrypi,pico-uart", "arm,pl011"; | ||
reg = <0x40078000 DT_SIZE_K(4)>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_UART1>; | ||
interrupts = <34 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "uart1"; | ||
status = "disabled"; | ||
}; | ||
|
||
spi0: spi@4003c000 { | ||
compatible = "raspberrypi,pico-spi", "arm,pl022"; | ||
#address-cells = <1>; | ||
#size-cells = <0>; | ||
reg = <0x4003c000 DT_SIZE_K(4)>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_SPI0>; | ||
interrupts = <31 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "spi0"; | ||
status = "disabled"; | ||
}; | ||
|
||
spi1: spi@40040000 { | ||
compatible = "raspberrypi,pico-spi", "arm,pl022"; | ||
#address-cells = <1>; | ||
#size-cells = <0>; | ||
reg = <0x40040000 DT_SIZE_K(4)>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_SPI1>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_PERI>; | ||
interrupts = <32 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "spi1"; | ||
status = "disabled"; | ||
}; | ||
|
||
usbd: usbd@50100000 { | ||
compatible = "raspberrypi,pico-usbd"; | ||
reg = <0x50100000 0x10000>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_USBCTRL>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_USB>; | ||
interrupts = <14 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "usbctrl"; | ||
num-bidir-endpoints = <16>; | ||
status = "disabled"; | ||
}; | ||
|
||
pwm: pwm@400a8000 { | ||
compatible = "raspberrypi,pico-pwm"; | ||
reg = <0x400a8000 DT_SIZE_K(4)>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_PWM>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_SYS>; | ||
interrupts = <8 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<9 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "PWM_IRQ_WRAP_0", | ||
"PWM_IRQ_WRAP_1"; | ||
status = "disabled"; | ||
#pwm-cells = <3>; | ||
}; | ||
|
||
timer0: timer@400b0000 { | ||
compatible = "raspberrypi,pico-timer"; | ||
reg = <0x400b0000 DT_SIZE_K(4)>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_TIMER0>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_REF>; | ||
interrupts = <0 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<1 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<2 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<3 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "TIMER0_IRQ_0", | ||
"TIMER0_IRQ_1", | ||
"TIMER0_IRQ_2", | ||
"TIMER0_IRQ_3"; | ||
status = "disabled"; | ||
}; | ||
|
||
timer1: timer@400b8000 { | ||
compatible = "raspberrypi,pico-timer"; | ||
reg = <0x400b8000 DT_SIZE_K(4)>; | ||
resets = <&reset RPI_PICO_RESETS_RESET_TIMER1>; | ||
clocks = <&clocks RPI_PICO_CLKID_CLK_REF>; | ||
interrupts = <4 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<5 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<6 RPI_PICO_DEFAULT_IRQ_PRIORITY>, | ||
<7 RPI_PICO_DEFAULT_IRQ_PRIORITY>; | ||
interrupt-names = "TIMER1_IRQ_0", | ||
"TIMER1_IRQ_1", | ||
"TIMER1_IRQ_2", | ||
"TIMER1_IRQ_3"; | ||
status = "disabled"; | ||
}; | ||
|
||
vreg: vreg@40064000 { | ||
compatible = "raspberrypi,core-supply-regulator"; | ||
reg = <0x40064000 1>; | ||
status = "disabled"; | ||
raspberrypi,brown-out-detection; | ||
raspberrypi,brown-out-threshold = <860000>; | ||
}; | ||
|
||
}; | ||
|
||
pinctrl: pin-controller { | ||
compatible = "raspberrypi,pico-pinctrl"; | ||
status = "okay"; | ||
}; | ||
}; | ||
|
||
&nvic { | ||
arm,num-irq-priority-bits = <4>; | ||
}; |
Oops, something went wrong.