Sming RP2040 Architecture
Support building Sming for the Raspberry Pi RP2040 SOC.
Testing so far has been limited to the Rasperry Pi Pico, but there are lots of other boards available.
Configure this using the
PICO_BOARD setting. The default is
You can find the full list here.
Special mention to the arduino-pico project https://github.com/earlephilhower/arduino-pico. Lots of helpful stuff in there!
This architecture should be considered experimental at present.
Tested and working:
CPU frequency adjustment
Timers working: hardware, software and CPU cycle counter
Hardware serial ports (UART driver)
Flash memory routines
os_get_random()implemented using ring oscillator. This is the best the hardware is capable of, but not crypto grade.
Heap is standard newlib implementation,
Software watchdog implemented, timeout is 8 seconds
A disassembly and symbol file are generated for this architecture.
SDK declares flash memory size in the board header files. This is checked at compile time against the value declared in the partition table.
system_get_rst_info()indicates watchdog or manual resets. Exception information not yet implemented.
Partitions and file systems (except SD cards and FAT)
The following items are yet to be implemented:
Best to write a separate
Sming-USBlibrary (based on TinyUSB) to support the RP2040, ESP32-S2 & ESP32-S3 variants. Needs some thought about good integration into the framework. Arduino-Pico overrides
HardwareSerialto support serial devices, we can do something similar.
Nice for messing around with displays.
- Analogue I/O
Has 4 channels + temperature.
Hardware can drive up to 16 outputs and measure input frequency/duty cycle.
Has hardware support
Can wake from deep sleep but requires an external clock (e.g. 32kHz crystal) and appropriate API. (Setting and reading the time is implemented.)
- Low-power modes
Deep sleep / suspend / power-saving
- Dual-core support
RP2040 is a dual-core processor!
Applications must currently be built with
DISABLE_NETWORK=1. RP2040 doesn’t have WiFi but a network stack via ethernet adapter would be useful. USB offers the possibility of CDMA networking for mobile applications.
- PIO (Programmable I/O)
A killer feature for the RP2040. Uses range from simple glue logic to I2S, etc.
- Crash/exception handling & serial debugging
RP2040 supports JTAG debugging but requires extra hardware. Serial debugging is often enough and easier to set up. Requires GDB stub plus implementing crash handler callbacks, etc.
- Multi-boot / OTA updates.
If you run
make mapyou’ll see there is no bootloader! It’s part of the firmware image at present. Adding RP2040 support to rBoot would probably be simplest.
These requirements are in addition to the standard Sming setup.
The easiest way to get started is with the Sming installer - see Getting Started.
Note: Windows is not currently included in the chocolatey respository. The following instructions should help.
The RP2040 contains two ARM Cortex-M0+ cores. Tools for all platforms can be downloaded from the ARM developer website.
Unzip the archive to a suitable location (e.g.
c:\tools\rp2040) and set
At time of writing the Ubuntu repositories contain an older version of this toolchain. It also does not contain GDB, but can be installed separately:
sudo apt install gcc-arm-none-eabi gdb-multiarch
To use gdb-multiarch you’ll need to do this:
make gdb GDB=gdb-multiarch
This is used to build the RP2040 SDK code:
sudo apt install ninja-build
It is available for other platforms at https://ninja-build.org/ and consists of a single executable file. The application should either be in the system path, or set
NINJAto the full path of the executable file.
If you have Sming working with the ESP32 then you’ll already have it installed.
Setup and programming
Serial support requires a 3.3v USB adapter connected to the appropriate pins:
UART0: TX = 0, RX = 1
UART1: TX = 4, RX = 5
To program your device, unplug the USB cable (i.e. remove power from the device)
then hold down the
BOOTSEL button whilst plugging it back in again.
You can then run:
as usual and the device will be programmed.
Once Sming is running on the device, reprogramming is simpler and only requires pressing
BOOTSEL button (no power cycle).
If the firmware has crashed or stalled the watchdog timer should reboot the system after 8 seconds, at which point BOOTSEL should be detected. So just hold the button down until this happens.
If all else fails, go through the initial power-cycle process.
This behaviour can be disabled using the
Unlike the Espressif parts, the RP2040 is not programmed via the serial port, but written to the device when configured as a Mass Storage device (removable flash drive).
Once the file has finished sending the RP2040 reboots itself into normal operating mode (assuming BOOTSEL has been released).
The RP2040 can also be programmed via JTAG debugging but this requires additional hardware and setup.
The RP2040 bootloader does not include support for reading flash memory via mass storage,
so commands such as
make verifyflash won’t work at present.
The RP2040 is a very capable SOC, albeit without WiFi. A massive advantage is that the platform is fully open-source. Even the bootrom is published!
Here’s a summary of the various Github repositories the Raspberry Pi Foundation have made available:
The core SDK for the RP2040 SOC. Sming includes this as a submodule.
This is a tool for inspecting RP2040 binaries, and interacting with RP2040 devices when they are in BOOTSEL mode. It does this by talking to a custom USB device implemented in the RP2040 bootrom.
Getting this to build is a bit fiddly. So far I’ve managed without it, but there is a
picotoolcomponent in the framework which can be used to try building it.
Contents of the RP2040 boot rom. Very handy to be able to see this.
Examples using the pico SDK directly.
An RP2040 board can be used as a low-cost JTAG adapter using this firmware. Takes some setting up to use though. See [Getting Started PDF](https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf) for details.
Some additional libraries which may or may not end up in the SDK.
Further examples using the pico-extras libraries.