Skip to content

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

Setup 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

Setup power control.

SD Card

You need to prepare an SD Card with U-Boot configured to:

  1. Display an interrupt prompt (e.g., Hit any key to stop autoboot)
  2. Wait at least 5 seconds, so LAVA can match and interrupt the autoboot
  3. 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.

  1. 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)
  2. Add the device configuration:

    {% 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