Skip to main content
The Exaviz Cruiser is a carrier board for the Raspberry Pi Compute Module 5 (CM5). It exposes PCIe, SATA, M.2, a UART debug header, and a network interface, making the CM5 suitable for embedded NAS, AI inference, and IoT edge workloads.

Board features

PCIe x1

Full-size PCIe x1 slot. Enable with dtparam=pciex1=on in config.txt. Used for the Axelera Metis M.2 AI accelerator or other PCIe peripherals.

SATA

SATA port via ASM1061 bridge. Enumerates as /dev/sdX after boot. Suitable for HDD or SSD storage expansion.

M.2 slot

M.2 Key M slot connected to the PCIe bus. Supports NVMe SSDs and the Axelera Metis AI accelerator module.

UART debug header

Exposes ttyAMA0 at 115200 baud. Keep console=ttyAMA0,115200 in the kernel command line during bring-up.

Network

Onboard Ethernet interface. The dracut network module enables DHCP in the initramfs for headless rescue via Dropbear.

IoT header

General-purpose IoT connector. Exposed as the /dev/cruiser-iot symlink via udev.
After a successful boot, udev creates three symlinks that preflight checks rely on:
SymlinkTargetPurpose
/dev/gps0GPS/GNSS receiver nodePosition/timing hardware
/dev/axelera0Axelera Metis PCIe deviceAI accelerator access
/dev/cruiser-iotIoT connector deviceGeneral IoT peripheral
If any symlink is missing, the corresponding hardware is either not enumerated by the kernel or the udev rule has not been applied. Check dmesg and udevadm monitor for errors.

D-Bus policy for org.exaviz.hardware

The Cruiser’s hardware daemon communicates over D-Bus using the well-known name org.exaviz.hardware. The policy file /etc/dbus-1/system.d/exaviz.hardware.conf controls access:
exaviz.hardware.conf
<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
 "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
<busconfig>
  <policy user="root">
    <allow own="org.exaviz.hardware"/>
  </policy>

  <policy context="default">
    <allow send_destination="org.exaviz.hardware"
           send_interface="org.freedesktop.DBus.Introspectable"/>
    <allow send_destination="org.exaviz.hardware"
           send_interface="org.freedesktop.DBus.Properties"/>
    <allow receive_sender="org.exaviz.hardware"/>
  </policy>
</busconfig>
Only root may own the org.exaviz.hardware name. All other users may introspect properties and receive signals, but cannot own the name or call arbitrary methods.
Install the policy file and reload D-Bus:
install -Dm644 exaviz.hardware.conf /etc/dbus-1/system.d/exaviz.hardware.conf
systemctl reload dbus

Running preflight

preflight.sh confirms that memory, the Axelera PCIe link, and all three udev symlinks are present before starting dependent services.
preflight.sh
#!/bin/sh
# Exaviz/Axelera Hardware Pre-Flight

echo "--- 🧠 Memory & CMA Check ---"
grep -E "Cma|MemTotal" /proc/meminfo

echo "--- 🚀 PCIe Link Check (Axelera) ---"
# Check if the AI chip is running at Gen3
lspci -vvv -d 1e81: | grep -E "LnkCap|LnkSta"

echo "--- 🔗 Udev Symlink Check ---"
for dev in /dev/gps0 /dev/axelera0 /dev/cruiser-iot; do
    [ -L "$dev" ] && echo "✅ $dev -> $(readlink -f $dev)" || echo "❌ $dev MISSING"
done
Run it as root after every boot or hardware change:
chmod +x preflight.sh
sudo ./preflight.sh
A passing run produces output similar to:
--- 🧠 Memory & CMA Check ---
MemTotal:        8126464 kB
CmaTotal:         524288 kB
CmaFree:          512000 kB
--- 🚀 PCIe Link Check (Axelera) ---
    LnkCap: Port #0, Speed 8GT/s, Width x1, ASPM L1, ...
    LnkSta: Speed 8GT/s (ok), Width x1 (ok)
--- 🔗 Udev Symlink Check ---
✅ /dev/gps0 -> /dev/ttyAMA3
✅ /dev/axelera0 -> /dev/accel0
✅ /dev/cruiser-iot -> /dev/ttyUSB0

Systemd units

rpi-hw-rebuild.service

Rebuilds the combined device-tree blob, regenerates the dracut initramfs, and updates GRUB whenever hardware overlays change. It is triggered automatically by rpi-hw-update.path.
rpi-hw-rebuild.service
[Unit]
Description=Sync Hardware Overlays to Bootloader and Initramfs
After=network.target

[Service]
Type=oneshot
# Rebuild the combined DTB for GRUB/UEFI
ExecStart=/usr/bin/fdtoverlay -i /boot/dtbs/base.dtb -o /boot/dtbs/combined.dtb \
    /lib/firmware/overlays/exaviz-cruiser.dtbo \
    /lib/firmware/overlays/axelera-metis.dtbo
# Refresh dracut to include the new blobs
ExecStart=/usr/bin/dracut --force --regenerate-all
# Update GRUB to ensure the FDT path is correct
ExecStart=/usr/bin/grub-mkconfig -o /boot/grub/grub.cfg

[Install]
WantedBy=multi-user.target

rpi-hw-update.path

Watches /lib/firmware/overlays/ for new or changed overlay files and activates rpi-hw-rebuild.service.
rpi-hw-update.path
[Unit]
Description=Watch for new RPi/Axelera hardware blobs

[Path]
PathChanged=/lib/firmware/overlays/
Unit=rpi-hw-rebuild.service

[Install]
WantedBy=multi-user.target
Enable both units so overlay updates are handled automatically:
systemctl enable --now rpi-hw-update.path
Run rpi-hw-rebuild.service manually after placing a new .dtbo file in /lib/firmware/overlays/ to avoid a reboot:
systemctl start rpi-hw-rebuild.service

Compiling device tree overlays

To compile a .dts source file into a .dtbo overlay binary, install the device tree compiler and use the Makefile.in in the repository root:
# Install dtc
sudo pacman -S dtc

# Compile a single overlay
dtc -@ -I dts -O dtb -o exaviz-cruiser.dtbo exaviz-cruiser.dts

# Or use the Makefile (compiles all overlays/*.dts → overlays/*.dtbo)
make -f Makefile.in
sudo make -f Makefile.in install   # installs to /lib/firmware/overlays/

Post-boot checklist

The following notes are embedded in the image at /etc/qemu-archstrap/cm5-exaviz-notes.txt by cm5-setup.sh. They cover the most common tasks after first boot on an Exaviz Cruiser.
Enable PCIe by adding dtparam=pciex1=on to /boot/efi/config.txt. The SATA port is connected via an ASM1061 bridge and enumerates as /dev/sdX automatically once PCIe is active.Snapshot replication to a SATA disk:
btrfs subvolume snapshot -r / /.snapshots/initial
btrfs send /.snapshots/initial | btrfs receive /mnt/sata-backup/
Enable NVMe by uncommenting dtparam=nvme=on in /boot/efi/config.txt. After boot, add the NVMe device to the btrfs pool:
btrfs device add /dev/nvme0n1 /
btrfs balance start -dconvert=raid1 /
This mirrors the eMMC and NVMe into a RAID 1 btrfs pool.
ttyAMA0 at 115200 baud is exposed on the Exaviz Cruiser debug header. Always include console=ttyAMA0,115200 in the kernel command line during hardware bring-up.
The dracut initramfs includes Dropbear for pre-mount rescue access:
ssh -p 222 root@<device-ip>
Useful for LUKS unlock, btrfs repair, and pre-mount diagnostics. Requires authorized_keys to be injected during image build.
rpi-eeprom-update -a   # updates pieeprom only, not RPI_EFI.fd
To update RPI_EFI.fd, download the latest release from worproject/rpi5-uefi and replace the file on the ESP manually.

Build docs developers (and LLMs) love