Building Uconsole cm5 radxa image for Arch linux

Hardware:

  • uConsole (ClockworkPi)

  • Host OS PC x86 with Arch linux

  • Radxa CM5 compute module

  • Booting from microSD


Goal

Boot Arch Linux ARM using a self-built kernel (from @Rex ak-rex/ClockworkRadxa-linux) and overlays from @_dev-null dev-null2019/radxa-cm5-uconsole.


Steps I took (Host: Arch Linux x86_64)

sudo pacman -Syu  
sudo pacman -S base-devel git bc flex bison openssl ncurses dtc uboot-tools dwarves aarch64-linux-gnu-gcc dtc

sudo pacman -Syu --needed base-devel git bc flex bison dtc openssl ncurses \
  aarch64-linux-gnu-gcc uboot-tools

export CROSS_COMPILE=aarch64-linux-gnu- 
export ARCH=arm64

mkdir ~/cm5
cd ~/cm5

git clone --depth=1 -b linux-6.1-stan-rkr4.1 https://github.com/ak-rex/ClockworkRadxa-linux.git
cd ClockworkRadxa-linux

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- rockchip_linux_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc) Image modules dtbs

ls -l \
/home/doraemon/cm5/ClockworkRadxa-linux/include/dt-bindings/interrupt-controller/irq.h \
/home/doraemon/cm5/ClockworkRadxa-linux/include/dt-bindings/gpio/gpio.h \
/home/doraemon/cm5/ClockworkRadxa-linux/include/dt-bindings/pinctrl/rockchip.h


Overlays

cd ~/cm5
git clone https://github.com/dev-null2019/radxa-cm5-uconsole.git
cd radxa-cm5-uconsole/devicetree_overlays
ls -1 *.dts

cd /home/doraemon/cm5/radxa-cm5-uconsole/devicetree_overlays
mkdir -p build

sed -n '1,2p' axp20x.dts; sed -n '1,2p' cwu50_panel.dts; sed -n '1,2p' displaystuff.dts

cpp -P -nostdinc \
  -I /home/doraemon/cm5/ClockworkRadxa-linux/include \
  -I /home/doraemon/cm5/ClockworkRadxa-linux/scripts/dtc/include-prefixes \
  -I /home/doraemon/cm5/ClockworkRadxa-linux/arch/arm64/boot/dts \
  -I /home/doraemon/cm5/ClockworkRadxa-linux/arch/arm64/boot/dts/rockchip \
  -I /home/doraemon/cm5/radxa-cm5-uconsole/devicetree_overlays \
  -I /home/doraemon/cm5/radxa-cm5-uconsole/devicetree_overlays/dt-bindings \
  -undef -x assembler-with-cpp \
  axp20x.dts > build/axp20x.pp.dts

dtc -@ -I dts -O dtb -o build/axp20x.dtbo build/axp20x.pp.dts

for f in cwu50_panel.dts displaystuff.dts; do
  base=${f%.dts}
  cpp -P -nostdinc \
    -I /home/doraemon/cm5/ClockworkRadxa-linux/include \
    -I /home/doraemon/cm5/ClockworkRadxa-linux/scripts/dtc/include-prefixes \
    -I /home/doraemon/cm5/ClockworkRadxa-linux/arch/arm64/boot/dts \
    -I /home/doraemon/cm5/ClockworkRadxa-linux/arch/arm64/boot/dts/rockchip \
    -I /home/doraemon/cm5/radxa-cm5-uconsole/devicetree_overlays \
    -I /home/doraemon/cm5/radxa-cm5-uconsole/devicetree_overlays/dt-bindings \
    -undef -x assembler-with-cpp \
    "$f" > "build/${base}.pp.dts"

  dtc -@ -I dts -O dtb -o "build/${base}.dtbo" "build/${base}.pp.dts"
done

ls -lh build/*.dtbo


Arch rootfs + kernel install

sudo fdisk /dev/sdX

sudo mkfs.vfat -F32 /dev/sdX1
sudo mkfs.ext4 /dev/sdX2

sudo mkdir -p /mnt/archroot/boot
sudo mount /dev/sdX2 /mnt/archroot
sudo mount /dev/sdX1 /mnt/archroot/boot

wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt/archroot

sudo tee /mnt/archroot/etc/fstab <<'EOF'
/dev/mmcblk0p1  /boot  vfat  defaults,noatime  0 2
/dev/mmcblk0p2  /      ext4  defaults,noatime  0 1
EOF

cd ~/cm5/ClockworkRadxa-linux
sudo cp arch/arm64/boot/Image /mnt/archroot/boot/Image
sudo mkdir -p /mnt/archroot/boot/dtbs/rockchip
sudo cp arch/arm64/boot/dts/rockchip/rk3588s-radxa-cm5*.dtb /mnt/archroot/boot/dtbs/rockchip/

sudo cp -r ../cm5-modules/lib/modules/* /mnt/archroot/lib/modules/
sudo mkdir -p /mnt/archroot/boot/overlays
sudo cp ~/cm5/radxa-cm5-uconsole/devicetree_overlays/build/*.dtbo /mnt/archroot/boot/overlays/

sudo mkdir -p /mnt/archroot/boot/extlinux
sudo tee /mnt/archroot/boot/extlinux/extlinux.conf <<'EOF'
timeout 5
default ArchLinuxARM

label ArchLinuxARM
  kernel /Image
  fdt /dtbs/rockchip/rk3588s-radxa-cm5-io.dtb
  fdtoverlays /overlays/axp20x.dtbo /overlays/cwu50_panel.dtbo /overlays/displaystuff.dtbo
  append root=/dev/mmcblk0p2 rw rootwait console=ttyS2,1500000n8 console=tty1
EOF

sync
sudo umount /mnt/archroot/boot
sudo umount /mnt/archroot


References

(but the second link uses .deb kernel packages I’m trying to build from source instead)


Issue

After following the above steps, the board does not show anything on screen (no splash, no output).
I don’t have a UART cable.


Questions

  1. Do I also need to flash U-Boot for the CM5 to boot from SD?

    • Can it load U-Boot from SD, or must there be a bootloader on SPI/eMMC?
  2. Is rk3588s-radxa-cm5-io.dtb the correct base DTB for the uConsole mainboard?

  3. Are these the correct overlays and order?
    /overlays/axp20x.dtbo /overlays/cwu50_panel.dtbo /overlays/displaystuff.dtbo


I just want to confirm whether I’m missing a required U-Boot step, or if my DTB/overlay setup is wrong.

Thanks for any pointers!

2 Likes

Another uboot variant I tried with codex, that has extlinux.conf and a boot.txt for fallback and installs uboot to sdcard

Arch Linux on Radxa CM5 (uConsole) — Command Log

This is a concise, step‑by‑step log of what we attempted to boot Arch Linux ARM on a Radxa CM5 inside the Clockwork uConsole. Each section lists the exact commands and brief outcomes.

1) Host Setup (Arch x86_64)

  • Packages
    • sudo pacman -S --needed git base-devel dtc uboot-tools parted e2fsprogs dosfstools rsync wget ripgrep aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils swig python python-setuptools bison flex

2) Kernel (ak‑rex) build

  • Sources
    • git clone https://github.com/ak-rex/ClockworkRadxa-linux.git
    • cd ClockworkRadxa-linux && git checkout ClockworkRadxa-Bookworm-6.1.y
  • Build
    • export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
    • make rockchip_linux_defconfig && make -j$(nproc) Image modules dtbs
    • make modules_install INSTALL_MOD_PATH=../stage (modules staged in ../stage)

3) Overlays (dev‑null2019) build

  • Sources
    • cd .. && git clone https://github.com/dev-null2019/radxa-cm5-uconsole.git
  • Fix dtc “syntax error” by preprocessing with cpp
    • cd radxa-cm5-uconsole/devicetree_overlays
    • mkdir -p ../../overlays-build/out
    • find . -type f \( -name "*.dts" -o -name "*.dtso" \) -not -path "*/build/*" | while read -r f; do base=$(basename "$f"); out="../../overlays-build/out/${base%.*}.pp.dtbo"; cpp -nostdinc -undef -D__DTS__ -x assembler-with-cpp -I . -I ./dt-bindings "$f" | dtc -@ -I dts -O dtb -o "$out" -; done
    • Outputs: overlays-build/out/{axp20x.pp.dtbo,cwu50_panel.pp.dtbo,displaystuff.pp.dtbo}

4) SD card layout and filesystems

  • Initial attempt (1MiB start) caused overlap with U‑Boot — fixed by leaving 16MiB gap
    • export SD=/dev/sde
    • sudo wipefs -a "$SD" && sudo sgdisk --zap-all "$SD"
    • sudo parted -s "$SD" mklabel gpt mkpart boot ext4 16MiB 528MiB mkpart root ext4 528MiB 100%
    • sudo mkfs.ext4 -L BOOT ${SD}1 && sudo mkfs.ext4 -L ROOT ${SD}2
    • sudo mount ${SD}2 /mnt && sudo mkdir -p /mnt/boot && sudo mount ${SD}1 /mnt/boot

5) Install Arch ARM rootfs

  • cd /tmp && wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz
  • sudo bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C /mnt
  • ROOT_UUID=$(sudo blkid -s UUID -o value ${SD}2); BOOT_UUID=$(sudo blkid -s UUID -o value ${SD}1)
  • printf "UUID=%s / ext4 rw,noatime 0 1\nUUID=%s /boot ext4 rw,noatime 0 2\n" "$ROOT_UUID" "$BOOT_UUID" | sudo tee /mnt/etc/fstab

6) Copy kernel, dtbs, modules, overlays

  • Kernel/DTBs/Modules
    • KSRC=$HOME/cm5/ClockworkRadxa-linux
    • sudo cp "$KSRC"/arch/arm64/boot/Image /mnt/boot/Image
    • sudo rsync -a "$KSRC"/arch/arm64/boot/dts/rockchip/ /mnt/boot/dtbs/rockchip/
    • sudo rsync -a "$KSRC"/../stage/lib/modules/ /mnt/lib/modules/
  • Overlays
    • sudo install -d -m 0755 /mnt/boot/overlays
    • sudo cp /home/doraemon/cm5/overlays-build/out/axp20x.pp.dtbo /home/doraemon/cm5/overlays-build/out/cwu50_panel.pp.dtbo /home/doraemon/cm5/overlays-build/out/displaystuff.pp.dtbo /mnt/boot/overlays/

7) Create combined DTB (pre‑apply overlays)

  • Base DTB (matches overlays’ compatible):
    • DTB="$KSRC/arch/arm64/boot/dts/rockchip/rk3588s-radxa-cm5-rpi-cm4-io.dtb"
  • Combine
    • sudo install -d -m 0755 /mnt/boot/dtbs/rockchip/custom
    • sudo fdtoverlay -i "$DTB" -o /mnt/boot/dtbs/rockchip/custom/cm5-uconsole-combined.dtb /mnt/boot/overlays/displaystuff.pp.dtbo /mnt/boot/overlays/cwu50_panel.pp.dtbo /mnt/boot/overlays/axp20x.pp.dtbo

8) extlinux.conf (paths relative to boot partition)

  • sudo install -d -m 0755 /mnt/boot/extlinux
  • `sudo tee /mnt/boot/extlinux/extlinux.conf >/dev/null <<‘EOF’
    DEFAULT arch
    TIMEOUT 3
    MENU TITLE U-Boot

LABEL arch
LINUX /Image
FDT /dtbs/rockchip/custom/cm5-uconsole-combined.dtb
APPEND console=ttyS2,1500000 console=tty0 root=UUID=3485ad2e-694a-4215-b0d5-eca9dfb151a5 rw rootwait
EOF`

9) U‑Boot (radxa rk35xx‑2024.01)

  • Source & config
    • git clone -b rk35xx-2024.01 https://github.com/radxa/u-boot.git && cd u-boot
    • export ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-
    • make evb-rk3588_defconfig
  • Provide blobs for binman
    • git clone --depth=1 https://github.com/radxa/rkbin.git ../rkbin
    • export BL31=$(find ../rkbin/bin/rk35 -maxdepth 1 -name 'rk3588_bl31_*.elf' | head -n1)
    • export ROCKCHIP_TPL=$(find ../rkbin/bin/rk35 -maxdepth 1 -name 'rk3588_ddr_*.bin' | head -n1)
  • Build (avoid Python SWIG issues)
    • make NO_PYTHON=1 -j$(nproc) → produced u-boot-rockchip.bin (TEE optional warning)
  • Write to SD (32KiB offset, after repartition with 16MiB gap)
    • sudo dd if=u-boot-rockchip.bin of=$SD bs=512 seek=64 conv=fsync,notrunc

10) Verification helpers

  • Compare written bootloader
    • SECTORS=$(( ( $(stat -c%s u-boot-rockchip.bin) + 511 ) / 512 ))
    • sudo dd if=$SD bs=512 skip=64 count=$SECTORS status=none of=/tmp/u-boot-readback.bin && cmp /tmp/u-boot-readback.bin u-boot-rockchip.bin
  • Inspect extlinux without mounting
    • sudo debugfs -R "ls -l /extlinux" ${SD}1
    • sudo debugfs -R "cat /extlinux/extlinux.conf" ${SD}1

11) Boot script fallback (boot.txt → boot.scr) (comes before uboot step)

  • Create a boot script to bypass extlinux and boot directly
    • sudo tee /mnt/boot/boot.txt >/dev/null <<'EOF'
      setenv bootargs "console=ttyS2,1500000 console=tty0 earlycon=uart8250,mmio32,0xfeb50000 root=UUID=3485ad2e-694a-4215-b0d5-eca9dfb151a5 rw rootwait loglevel=7 panic=10"
      setenv trydev 0
      if test -e mmc 0:1 /Image; then setenv trydev 0; else setenv trydev 1; fi
      load mmc ${trydev}:1 ${kernel_addr_r} /Image
      load mmc ${trydev}:1 ${fdt_addr_r} /dtbs/rockchip/custom/cm5-uconsole-combined.dtb
      booti ${kernel_addr_r} - ${fdt_addr_r}
      EOF
  • Compile the script to boot.scr with mkimage
    • mkimage -A arm64 -T script -C none -n "boot" -d /mnt/boot/boot.txt /mnt/boot/boot.scr

Status

  • After correcting extlinux paths and installing U‑Boot with a safe partition gap, the device still shows a black panel (likely DSI not enabling). Next checks: test HDMI output, re‑generate combined DTB with/without specific overlays, and rule out eMMC/SPI bootloader precedence.