Skip to content

Latest commit

 

History

History

raspberry_pi_pico

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Raspberry Pi Pico - RP2040

The Raspberry Pi Pico is a board developed by the Raspberry Pi Foundation and is based on the RP2040 chip.

Getting Started

First, follow the Tock Getting Started guide

Installing elf2uf2-rs

The Nano RP2040 uses UF2 files for flashing. Tock compiles to an ELF file. The elf2uf2-rs utility is needed to transform the Tock ELF file into an UF2 file.

To install elf2uf2, run the commands:

$ cargo install elf2uf2-rs

Flashing the kernel

The Raspberry Pi Pico RP2040 Connect can be programmed using its bootloader, which requires an UF2 file.

Enter BOOTSEL mode

To flash the Pico RP2040, it needs to be put into BOOTSEL mode. This will mount a flash drive that allows one to copy a UF2 file. To enter BOOTSEL mode, press the BOOTSEL button and hold it while you connect the other end of the micro USB cable to your computer.

Then cd into boards/raspberry_pi_pico directory and run:

$ make flash

(or)

$ make flash-debug

Note: The Makefile provides the BOOTSEL_FOLDER variable that points towards the mount point of the Pico RP2040 flash drive. By default, this is located in /media/$(USER)/RP2040. This might be different on several systems, make sure to adjust it.

Flashing app

Enter BOOTSEL mode.

Apps are built out-of-tree. Once an app is built, you can add the path to it in the Makefile (APP variable), then run:

$ APP="<path to app's tbf file>" make flash-app

Debugging

The Raspberry Pi Pico can also be programmed via an SWD connection, which requires the Pico to be connected to a regular Raspberry Pi device that exposes the necessary pins OR using another Raspberry Pi Pico set up in “Picoprobe” mode. The kernel is transferred to the Raspberry Pi Pico using a custom version of OpenOCD.

Flashing Setup

From a regular Raspberry Pi (option 1)

To install OpenOCD on the Raspberry Pi run the following commands on the Pi:

$ sudo apt update
$ sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev git
$ git clone https://github.com/raspberrypi/openocd.git --recursive --branch rp2040 --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-ftdi --enable-sysfsgpio --enable-bcm2835gpio
$ make -j4
$ sudo make install

Enable SSH on the Raspberry Pi by following the instructions on the Raspberry Pi website.

Next, connect the SWD pins of the Pico (the tree lower wires) to GND, GPIO 24, and GPIO 25 of the Raspberry Pi. You can follow the schematic in the official documentation and connect the blue, black, and purple wires.

Also connect the other three wires as shown in the schematic, which will connect the Pico UART to the Raspberry Pi. This will enable the serial communication between the two devices.

From a Linux Host using a Picoprobe (option 2)

To install OpenOCD on Debian/Ubuntu run the following commands:

$ sudo apt update
$ sudo apt install automake autoconf build-essential texinfo libtool libftdi-dev libusb-1.0-0-dev git
$ git clone https://github.com/raspberrypi/openocd.git --recursive --branch rp2040 --depth=1
$ cd openocd
$ ./bootstrap
$ ./configure --enable-picoprobe
$ make -j4
$ sudo make install

Download the Picoprobe UF2 file onto the USB mass storage device presented by the Pico that is going to act as Picoprobe device after plugging it into some USB port: https://datasheets.raspberrypi.com/soft/picoprobe.uf2 (the device should automatically restart after the file has been written).

Next, connect the SWD pins of the Pico target (the tree lower wires, left-to-right) to GP2, GND, and GP3 of the Pico that will act as Picoprobe. You can follow the schematic in the official documentation and connect the blue, black, and purple wires.

Also connect the other four wires as shown in the schematic, which will connect the Pico UART and power to the Picoprobe. This will enable the serial communication between the two devices.

Flashing the tock kernel

Building and Deploying from the same System

cd into boards/raspberry_pi_pico directory and run:

$ make flash OPENOCD_INTERFACE=[swd|picoprobe]

The OPENOCD_INTERFACE parameter selects which mode to flash the target Pico device in: swd flashes directly via SWD over GPIO (default, needs to be run a regular Raspberry Pi), picoprobe flashes indirectly via another Raspberry Pi Pico device.

You can also open a serial console on to view debug messages:

$ sudo apt install picocom
$ picocom /dev/ttyACM0 -b 115200 -l

Building on a Desktop/Laptop then Flashing via regular Raspberry Pi

cd into boards/raspberry_pi_pico directory and run:

$ make

(or)

$ make debug

Connect via ssh to the Raspberry Pi and forward port 3333. Then start OpenOCD on the Pi.

$ ssh pi@<pi_IP> -L 3333:localhost:3333

(wait to connect)

$ openocd -f interface/raspberrypi-swd.cfg -f target/rp2040.cfg

You can also open a serial console on the Raspberry Pi for debug messages.

$ sudo apt install minicom
$ minicom -b 115200 -o -D /dev/serial0

On the local computer use gdb-multiarch on Linux or arm-none-eabi-gdb on MacOS to deploy tock.

$ arm-none-eabi-gdb tock/target/thumbv6m-none-eabi/release/raspberry_pi_pico.elf
(gdb) target remote :3333
(gdb) load
(gdb) continue

Flashing app

Apps are built out-of-tree. Once an app is built, you can add the path to it in the Makefile (APP variable), then run:

$ make program

This will generate a new ELF file that can be deployed on the Raspberry Pi Pico via gdb and OpenOCD as described in the section above.

Book

For further details and examples about how to use Tock with the Raspberry Pi Pico, you might want to check out the Getting Started with Secure Embedded Systems book.