Raspberry Pi (U-Boot)¶
This guide covers setting up Raspberry Pi devices (RPi3, RPi4, RPi5) that use U-Boot as their bootloader in LAVA.
LAVA has extensive support for devices that use U-Boot as their bootloader,
allowing you to deploy kernel, ramdisk, device tree blob (DTB), and other
files via tftp deploy action, and boot them using u-boot boot method.
Hardware setup¶
Before adding a Raspberry Pi to LAVA, you need to set up the required hardware. This includes configuring the serial console, network connectivity, power control, and preparing an SD card with U-Boot installed.
Serial console¶
For Raspberry Pi, connect the USB to serial adapter to the GPIO pins:
| RPi GPIO Pin | Signal | USB-Serial Adapter |
|---|---|---|
| Pin 6 | GND | GND |
| Pin 8 | TXD | RXD |
| Pin 10 | RXD | TXD |
Network connectivity¶
The Raspberry Pi must be able to access the LAVA worker’s TFTP and NFS services in order to download boot files and mount the root filesystem over NFS. Therefore, the Raspberry Pi should be connected to the same network as the LAVA worker.
Power control¶
SD Card¶
You need to prepare an SD Card with U-Boot configured to:
- Display an interrupt prompt (e.g.,
Hit any key to stop autoboot) - Wait at least 5 seconds, so LAVA can match and interrupt the autoboot
- Support TFTP boot commands
You can follow this guide to flash your SD Card.
See also¶
Creating device type¶
Create the device type using one of the following names that match the existing device type templates:
| Raspberry Pi Model | Device Type Name | Architecture |
|---|---|---|
| RPi 3 Model B (32-bit) | bcm2837-rpi-3-b-32 |
ARM32 |
| RPi 3 Model B (64-bit) | bcm2837-rpi-3-b |
ARM64 |
| RPi 4 Model B | bcm2711-rpi-4-b |
ARM64 |
| RPi 5 Model B | bcm2712-rpi-5-b |
ARM64 |
Creating device¶
Each Raspberry Pi device requires a device dictionary that specifies device-specific settings such as serial connection and power control commands. The device dictionary should extend the device type template and add the device-specific configurations.
- Add the device using the following settings:
- Device Type: See device type name in the
above table (e.g.,
bcm2711-rpi-4-b) - Hostname: A unique name (e.g.,
rpi4-01)
- Device Type: See device type name in the
above table (e.g.,
-
{% extends "<device_type>.jinja2" %} {% set connection_command = "telnet localhost <port>" %} {% set hard_reset_command = "<power_reset_command>" %} {% set power_off_command = "<power_off_command>" %} {% set power_on_command = "<power_on_command>" %}Note
Replace all the placeholders marked with
<>with their corresponding actual values.
Sample job definitions¶
Booting from NFS¶
job_name: u-boot nfs
device_type: bcm2837-rpi-3-b-32
priority: medium
visibility: public
timeouts:
job:
minutes: 30
actions:
- deploy:
to: tftp
timeout:
minutes: 15
dtb:
url: http://example.com/nfs/bcm2837-rpi-3-b-plus.dtb
kernel:
url: http://example.com/nfs/zImage
type: zimage
modules:
url: http://example.com/nfs/modules.tar.xz
compression: xz
ramdisk:
url: http://example.com/nfs/initrd.cpio.gz
compression: gz
nfsrootfs:
url: http://example.com/nfs/full.rootfs.tar.xz
format: tar
overlays:
kselftest:
url: http://example.com/nfs/kselftest.tar.xz
compression: xz
format: tar
path: /opt/kselftest
- boot:
method: u-boot
commands: nfs
prompts:
- '/ #'
timeout:
minutes: 5
- test:
timeout:
minutes: 5
definitions:
- from: inline
repository:
metadata:
format: Lava-Test Test Definition 1.0
name: health checks
run:
steps:
- lava-test-case kernel-info --shell uname -a
- lava-test-case network-info --shell ip a
name: health-checks
path: inline/health-checks.yaml
Booting from ramdisk¶
device_type: bcm2837-rpi-3-b-32
job_name: u-boot boot ramdisk
priority: medium
visibility: public
timeouts:
job:
minutes: 15
actions:
- deploy:
dtb:
url: http://example.com/ramdisk/bcm2837-rpi-3-b.dtb
kernel:
type: zimage
url: http://example.com/ramdisk/zImage
ramdisk:
compression: gz
url: http://example.com/ramdisk/rootfs.cpio.gz
timeout:
minutes: 3
to: tftp
- boot:
method: u-boot
commands: ramdisk
prompts:
- '/ #'
timeout:
minutes: 5
- test:
timeout:
minutes: 5
definitions:
- from: inline
repository:
metadata:
format: Lava-Test Test Definition 1.0
name: health checks
run:
steps:
- lava-test-case kernel-info --shell uname -a
- lava-test-case network-info --shell ip a
name: health-checks
path: inline/health-checks.yaml