NixOS on ARM: Rock 5 B

5 Likes

I can’t comment on the EDK2 port for RK3588 platforms but I really recommend using U-Boot instead. With the RK3588 platform, we are at a point where we can dd U-Boot on an SD card (only takes ~8MB of space), boot a NixOS ISO (24.05 and later) and install NixOS on an NVMe drive like one does on an Intel/AMD computer.

Only caveat being that HDMI out works only on Linux v6.13 and later so if you prefer not to use a serial console, you need an ISO with Linux v6.13 and later.

May I ask why you recommend u-boot over uefi?

I’m using uefi on a FriendlyElec NanoPi R6C and a FriendlyElec CM3588 NAS and find systemd-boot more convenient than extlinux.

1 Like

The Collabora developers who are behind the effort to upstream support for RK3588 are contributing their changes to U-Boot, not EDK2. Also because U-Boot is the preferred choice of bootloader on non-server ARM boards and therefore receives some good-enough support from vendors sometimes.

Last time I installed NixOS on the Rock5B I also tried going with EDK2. However it does not ship the right devuce trees for the mainline kernel. The maintainers also said they are not planning to do so, officially only supporting the BSP kernel. As I also could not figure out how to install a custom kernel I just gave up.

I would great though to have a tutorial for installing with mainline uboot + mainline Linux. The wiki has a page on in, but it seems a bit outdated, as it mainly points to some custom forks and flakes.

1 Like

There’s good news on the kernel side: Mainline 6.13 has the right device tree, so there’s no need for custom kernel any more. That’s why we recommend to set boot.kernelPackages = pkgs.linuxPackages_latest; in the post.

4 Likes

I don’t know if it is OK to resurrect year-old thread but it fits here.

I have Rock 5B with EDK2 build from this repository. Since kernel 6.18 I would say almost everything works (did not try NPU or HDMI input).

Only thing I am unable to use is internal audio jack. It is being reported by wpctl but no sound is being produced


Audio
 ├─ Devices:
 │      46. VnitƙnĂ­ zvukovĂœ systĂ©m          [alsa]
 │      47. Audio Adapter (Unitek Y-247A)       [alsa]
 │      48. VnitƙnĂ­ zvukovĂœ systĂ©m          [alsa]
 │      49. VnitƙnĂ­ zvukovĂœ systĂ©m          [alsa]
 │  
 ├─ Sinks:
 │      58. Audio Adapter (Unitek Y-247A) AnalogovĂ© stereo [vol: 1.00]
 │  *   66. VnitƙnĂ­ zvukovĂœ systĂ©m Headphones [vol: 0.20]
 │  
 ├─ Sources:
 │  *   59. Audio Adapter (Unitek Y-247A) Mono  [vol: 1.00]
 │      68. VnitƙnĂ­ zvukovĂœ systĂ©m Headset Microphone on IN2 [vol: 1.00]
 │  
 ├─ Filters:
 │  
 └─ Streams:

For now I am using Unitek USB audio adapter which is not ideal - it is bulky and occupying one of 4 available USBs.

Did anyone manage to make the audio working properly? I tried to play with alsa-utils but found nothing suggesting what’s wrong (but I am unskilled in this area so there is chance I just don’t understand enough what’s going on).

Edit:
Sound card is es8316 and I can see it being defined in linux kernel.

Hi there!
I managed to get U-Boot and Linux to start on my rock5b, however during Linux boot the UART logs suddenly stops sometime during a line print and the board is stuck without rebooting.
At first I thought this was due to my PD power-supply as I know that the Rock5B fusb302 is not working great with some power-supply but after instrumenting the code I can see that U-Boot fusb302 driver selects 20V@3.25A which is plenty for the Rock5B. Any idea?
I’m using boot.kernelPackages = pkgs.linuxPackages_latest; and uboot = pkgs.ubootRock5ModelB; here is my flake and config that builds me an sdcard image to flash
Any idea?

Here is my Linux logs, I find it strange that it always stops after some lines regarding usb connector as the power commes from the usb-c port. Also I get the Booting Linux line twice on CPU 0x0 which seems odd:

[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[ 0.000000] Linux version 7.0.10 (nixbld@localhost) (gcc (GCC) 15.2.0, GNU ld (GNU Binutils) 2.46) #1-NixOS SMP PREEMPT Sat May 23 11:09:44 UTC 2026
[ 0.000000] KASLR enabled
[ 0.000000] Machine model: Radxa ROCK 5B
[ 0.000000] efi: UEFI not found.
[ 0.000000] Reserved memory: created DMA memory pool at 0x00000000e0d40000, size 160 MiB
[ 0.000000] OF: reserved mem: initialized node hdmi-receiver-cma, compatible id shared-dma-pool
[ 0.000000] OF: reserved mem: 0x00000000e0d40000..0x00000000ead3ffff (163840 KiB) nomap non-reusable hdmi-receiver-cma
[ 0.000000] earlycon: uart0 at MMIO32 0x00000000feb50000 (options ‘1500000n8’)
[ 0.000000] printk: legacy bootconsole [uart0] enabled
[ 0.000000] OF: reserved mem: 0x000000000010f000..0x000000000010f0ff (0 KiB) nomap non-reusable shmem@10f000
[ 0.000000] NUMA: Faking a node at [mem 0x0000000000200000-0x00000002ffffffff]
[ 0.000000] NODE_DATA(0) allocated [mem 0x2fed5cbc0-0x2fed6033f]
[ 0.000000] cma: Reserved 32 MiB at 0x00000000ee000000
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: PSCIv1.1 detected in firmware.
[ 0.000000] psci: Using standard PSCI v0.2 function IDs
[ 0.000000] psci: MIGRATE_INFO_TYPE not supported.
[ 0.000000] psci: SMC Calling Convention v1.5
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000200000-0x00000000ffffffff]
[ 0.000000] DMA32 empty
[ 0.000000] Normal [mem 0x0000000100000000-0x00000002ffffffff]
[ 0.000000] Device empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000200000-0x00000000e0d3ffff]
[ 0.000000] node 0: [mem 0x00000000e0d40000-0x00000000ead3ffff]
[ 0.000000] node 0: [mem 0x00000000ead40000-0x00000000efffffff]
[ 0.000000] node 0: [mem 0x0000000100000000-0x00000001ffffffff]
[ 0.000000] node 0: [mem 0x00000002f0000000-0x00000002ffffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000200000-0x00000002ffffffff]
[ 0.000000] On node 0, zone DMA: 512 pages in unavailable ranges
[ 0.000000] percpu: Embedded 77 pages/cpu s188824 r8192 d118376 u315392
[ 0.000000] Detected VIPT I-cache on CPU0
[ 0.000000] CPU features: detected: GICv3 CPU interface
[ 0.000000] CPU features: detected: Virtualization Host Extensions
[ 0.000000] CPU features: kernel page table isolation forced ON by KASLR
[ 0.000000] CPU features: detected: Kernel page table isolation (KPTI)
[ 0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[ 0.000000] alternatives: applying boot alternatives
[ 0.000000] Kernel command line: init=/nix/store/v85kf956r8lrql4sjy65pgpdi5l2jrf8-nixos-system-rock5b-sd-card-26.05.20260531.b51242d/init rootwait earlycon consoleblank=0 console=ttyS2,1500000 console=tty1 root=UUID=14e19a7b-0ae0-484d-9d54-43bd6fdc20c7 panic=1 boot.panic_on_fail vga=0x317 nomodeset root=fstab loglevel=7 lsm=landlock,yama,bpf
[ 0.000000] Booted with the nomodeset parameter. Only the system framebuffer will be available
[ 0.000000] Unknown kernel command line parameters “vga=0x317”, will be passed to user space.
[ 0.000000] printk: log buffer data + meta data: 131072 + 557056 = 688128 bytes
[ 0.000000] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.000000] software IO TLB: area num 8.
[ 0.000000] software IO TLB: mapped [mem 0x00000000dcd40000-0x00000000e0d40000] (64MB)
[ 0.000000] Fallback order for Node 0: 0
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 2096640
[ 0.000000] Policy zone: Normal
[ 0.000000] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[ 0.000000] allocated 16777216 bytes of page_ext
[ 0.000000] ftrace: allocating 75448 entries in 296 pages
[ 0.000000] ftrace: allocated 296 pages with 3 groups
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=384 to nr_cpu_ids=8.
[ 0.000000] Trampoline variant of Tasks RCU enabled.
[ 0.000000] Rude variant of Tasks RCU enabled.
[ 0.000000] Tracing variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
[ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[ 0.000000] RCU Tasks Rude: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] GIC: enabling workaround for GICv3: non-coherent attribute
[ 0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[ 0.000000] GICv3: 480 SPIs implemented
[ 0.000000] GICv3: 0 Extended SPIs implemented
[ 0.000000] GICv3: MBI range [424:479]
[ 0.000000] GICv3: Using MBI frame 0x00000000fe610000
[ 0.000000] Root IRQ handler: gic_handle_irq
[ 0.000000] GICv3: GICv3 features: 16 PPIs
[ 0.000000] GICv3: GICD_CTLR.DS=0, SCR_EL3.FIQ=0
[ 0.000000] GICv3: CPU0: found redistributor 0 region 0:0x00000000fe680000
[ 0.000000] ITS [mem 0xfe640000-0xfe65ffff]
[ 0.000000] GIC: enabling workaround for ITS: Rockchip erratum RK3588001
[ 0.000000] GIC: enabling workaround for ITS: non-coherent attribute
[ 0.000000] ITS@0x00000000fe640000: allocated 8192 Devices @101830000 (indirect, esz 8, psz 64K, shr 0)
[ 0.000000] ITS@0x00000000fe640000: allocated 32768 Interrupt Colle@101840000tions @101840000 (flat, esz 2, psz 64K, shr 0)
[ 0.000000] ITS: using cache flushing for cmd queue
[ 0.000000] ITS [mem 0xfe660000-0xfe67ffff]
[ 0.000000] GIC: enabling workaround for ITS: Rockchip erratum RK3588001
[ 0.000000] GIC: enabling workaround for ITS: non-coherent attribute
[ 0.000000] ITS@0x00000000fe660000: allocated 8192 D@101860000vices @101860000 (indirect, esz 8, psz 64K, shr 0)
[ 0.000000] ITS@0x00000000fe660000: allocated 32768 Interrupt Colle@101870000tions @101870000 (flat, esz 2, psz 64K, shr 0)
[ 0.000000] ITS: using cache flushing for cmd queue
[ 0.000000] GICv3: using LPI property@0x0000000101880000table @0x0000000101880000
[ 0.000000] GIC: using cache flushing for LPI property table
[ 0.000000] GICv3: CPU0: using allocated LPI pending@0x0000000101890000table @0x0000000101890000
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu@0[0] /cpus/cpu@100[1] /cpus/cpu@200[2] /cpus/cpu@300[3] }
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu@400[4] /cpus/cpu@500[5] /cpus/cpu@600[6] /cpus/cpu@700[7] }
[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000000] arch_timer: cp15 timer running at 24.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.011093] kfence: initialized - using 2097152 bytes for 255 objects at 0x(ptrval)-0x(ptrval)
[ 0.012931] Console: colour dummy device 80x25
[ 0.013369] printk: legacy console [tty1] enabled
[ 0.013827] printk: legacy bootconsole [uart0] disabled
[ 0.000000] Booting Linux on physical CPU 0x0000000000 [0x412fd050]
[ 0.000000] Linux version 7.0.10 (nixbld@localhost) (gcc (GCC) 15.2.0, GNU ld (GNU Binutils) 2.46) #1-NixOS SMP PREEMPT Sat May 23 11:09:44 UTC 2026
[ 0.000000] KASLR enabled
[ 0.000000] Machine model: Radxa ROCK 5B
[ 0.000000] efi: UEFI not found.
[ 0.000000] Reserved memory: created DMA memory pool at 0x00000000e0d40000, size 160 MiB
[ 0.000000] OF: reserved mem: initialized node hdmi-receiver-cma, compatible id shared-dma-pool
[ 0.000000] OF: reserved mem: 0x00000000e0d40000..0x00000000ead3ffff (163840 KiB) nomap non-reusable hdmi-receiver-cma
[ 0.000000] earlycon: uart0 at MMIO32 0x00000000feb50000 (options ‘1500000n8’)
[ 0.000000] printk: legacy bootconsole [uart0] enabled
[ 0.000000] OF: reserved mem: 0x000000000010f000..0x000000000010f0ff (0 KiB) nomap non-reusable shmem@10f000
[ 0.000000] NUMA: Faking a node at [mem 0x0000000000200000-0x00000002ffffffff]
[ 0.000000] NODE_DATA(0) allocated [mem 0x2fed5cbc0-0x2fed6033f]
[ 0.000000] cma: Reserved 32 MiB at 0x00000000ee000000
[ 0.000000] psci: probing for conduit method from DT.
[ 0.000000] psci: PSCIv1.1 detected in firmware.
[ 0.000000] psci: Using standard PSCI v0.2 function IDs
[ 0.000000] psci: MIGRATE_INFO_TYPE not supported.
[ 0.000000] psci: SMC Calling Convention v1.5
[ 0.000000] Zone ranges:
[ 0.000000] DMA [mem 0x0000000000200000-0x00000000ffffffff]
[ 0.000000] DMA32 empty
[ 0.000000] Normal [mem 0x0000000100000000-0x00000002ffffffff]
[ 0.000000] Device empty
[ 0.000000] Movable zone start for each node
[ 0.000000] Early memory node ranges
[ 0.000000] node 0: [mem 0x0000000000200000-0x00000000e0d3ffff]
[ 0.000000] node 0: [mem 0x00000000e0d40000-0x00000000ead3ffff]
[ 0.000000] node 0: [mem 0x00000000ead40000-0x00000000efffffff]
[ 0.000000] node 0: [mem 0x0000000100000000-0x00000001ffffffff]
[ 0.000000] node 0: [mem 0x00000002f0000000-0x00000002ffffffff]
[ 0.000000] Initmem setup node 0 [mem 0x0000000000200000-0x00000002ffffffff]
[ 0.000000] On node 0, zone DMA: 512 pages in unavailable ranges
[ 0.000000] percpu: Embedded 77 pages/cpu s188824 r8192 d118376 u315392
[ 0.000000] Detected VIPT I-cache on CPU0
[ 0.000000] CPU features: detected: GICv3 CPU interface
[ 0.000000] CPU features: detected: Virtualization Host Extensions
[ 0.000000] CPU features: kernel page table isolation forced ON by KASLR
[ 0.000000] CPU features: detected: Kernel page table isolation (KPTI)
[ 0.000000] CPU features: detected: ARM errata 1165522, 1319367, or 1530923
[ 0.000000] alternatives: applying boot alternatives
[ 0.000000] Kernel command line: init=/nix/store/v85kf956r8lrql4sjy65pgpdi5l2jrf8-nixos-system-rock5b-sd-card-26.05.20260531.b51242d/init rootwait earlycon consoleblank=0 console=ttyS2,1500000 console=tty1 root=UUID=14e19a7b-0ae0-484d-9d54-43bd6fdc20c7 panic=1 boot.panic_on_fail vga=0x317 nomodeset root=fstab loglevel=7 lsm=landlock,yama,bpf
[ 0.000000] Booted with the nomodeset parameter. Only the system framebuffer will be available
[ 0.000000] Unknown kernel command line parameters “vga=0x317”, will be passed to user space.
[ 0.000000] printk: log buffer data + meta data: 131072 + 557056 = 688128 bytes
[ 0.000000] Dentry cache hash table entries: 1048576 (order: 11, 8388608 bytes, linear)
[ 0.000000] Inode-cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[ 0.000000] software IO TLB: area num 8.
[ 0.000000] software IO TLB: mapped [mem 0x00000000dcd40000-0x00000000e0d40000] (64MB)
[ 0.000000] Fallback order for Node 0: 0
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 2096640
[ 0.000000] Policy zone: Normal
[ 0.000000] mem auto-init: stack:all(zero), heap alloc:on, heap free:off
[ 0.000000] SLUB: HWalign=64, Order=0-3, MinObjects=0, CPUs=8, Nodes=1
[ 0.000000] allocated 16777216 bytes of page_ext
[ 0.000000] ftrace: allocating 75448 entries in 296 pages
[ 0.000000] ftrace: allocated 296 pages with 3 groups
[ 0.000000] rcu: Hierarchical RCU implementation.
[ 0.000000] rcu: RCU event tracing is enabled.
[ 0.000000] rcu: RCU restricting CPUs from NR_CPUS=384 to nr_cpu_ids=8.
[ 0.000000] Trampoline variant of Tasks RCU enabled.
[ 0.000000] Rude variant of Tasks RCU enabled.
[ 0.000000] Tracing variant of Tasks RCU enabled.
[ 0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[ 0.000000] rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=8
[ 0.000000] RCU Tasks: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[ 0.000000] RCU Tasks Rude: Setting shift to 3 and lim to 1 rcu_task_cb_adjust=1 rcu_task_cpu_ids=8.
[ 0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[ 0.000000] GIC: enabling workaround for GICv3: non-coherent attribute
[ 0.000000] GICv3: GIC: Using split EOI/Deactivate mode
[ 0.000000] GICv3: 480 SPIs implemented
[ 0.000000] GICv3: 0 Extended SPIs implemented
[ 0.000000] GICv3: MBI range [424:479]
[ 0.000000] GICv3: Using MBI frame 0x00000000fe610000
[ 0.000000] Root IRQ handler: gic_handle_irq
[ 0.000000] GICv3: GICv3 features: 16 PPIs
[ 0.000000] GICv3: GICD_CTLR.DS=0, SCR_EL3.FIQ=0
[ 0.000000] GICv3: CPU0: found redistributor 0 region 0:0x00000000fe680000
[ 0.000000] ITS [mem 0xfe640000-0xfe65ffff]
[ 0.000000] GIC: enabling workaround for ITS: Rockchip erratum RK3588001
[ 0.000000] GIC: enabling workaround for ITS: non-coherent attribute
[ 0.000000] ITS@0x00000000fe640000: allocated@1018300008192 Devices @101830000 (indirect, esz 8, psz 64K, shr 0)
[ 0.000000] ITS@0x00000000fe640000: allocated 32768 Interrup@101840000 Collections @101840000 (flat, esz 2, psz 64K, shr 0)
[ 0.000000] ITS: using cache flushing for cmd queue
[ 0.000000] ITS [mem 0xfe660000-0xfe67ffff]
[ 0.000000] GIC: enabling workaround for ITS: Rockchip erratum RK3588001
[ 0.000000] GIC: enabling workaround for ITS: non-coherent attribute
[ 0.000000] ITS@0x00000000fe660000: allocated@1018600008192 Devices @101860000 (indirect, esz 8, psz 64K, shr 0)
[ 0.000000] ITS@0x00000000fe660000: allocated 32768 Interrup@101870000 Collections @101870000 (flat, esz 2, psz 64K, shr 0)
[ 0.000000] ITS: using cache flushing for cmd queue
[ 0.000000] GICv3: using LPI p@0x0000000101880000operty table @0x0000000101880000
[ 0.000000] GIC: using cache flushing for LPI property table
[ 0.000000] GICv3: CPU0: using allocated LPI @0x0000000101890000ending table @0x0000000101890000
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-0[0] { /cpus/cpu@0[0] /cpus/cpu@100[1] /cpus/cpu@200[2] /cpus/cpu@300[3] }
[ 0.000000] GICv3: GIC: PPI partition interrupt-partition-1[1] { /cpus/cpu@400[4] /cpus/cpu@500[5] /cpus/cpu@600[6] /cpus/cpu@700[7] }
[ 0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.
[ 0.000000] arch_timer: cp15 timer running at 24.00MHz (phys).
[ 0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x588fe9dc0, max_idle_ns: 440795202592 ns
[ 0.000000] sched_clock: 56 bits at 24MHz, resolution 41ns, wraps every 4398046511097ns
[ 0.011093] kfence: initialized - using 2097152 bytes for 255 objects at 0x(ptrval)-0x(ptrval)
[ 0.012931] Console: colour dummy device 80x25
[ 0.013369] printk: legacy console [tty1] enabled
[ 0.013827] printk: legacy bootconsole [uart0] disabled
[ 0.015352] Calibrating delay loop (skipped), value calculated using timer frequency.. 48.00 BogoMIPS (lpj=96000)
[ 0.015388] pid_max: default: 32768 minimum: 301
[ 0.022700] landlock: Up and running.
[ 0.022721] Yama: becoming mindful.
[ 0.023326] LSM support for eBPF active
[ 0.025553] Mount-cache hash table entries: 16384 (order: 5, 131072 bytes, linear)
[ 0.025612] Mountpoint-cache hash table entries: 16384 (order: 5, 131072 bytes, linear)
[ 0.027668] VFS: Finished mounting rootfs on nullfs
[ 0.039025] rcu cycle(s) with /pcie@fe150000/legacy-interrupt-controller
[ 0.177567] /pcie@fe170000: Fixed dependency cycle(s) with /pcie@fe170000/legacy-interrupt-controller
[ 0.179039] /hdmi@fde80000: Fixed dependency cycle(s) with /hdmi0-con
[ 0.179085] /hdmi0-con: Fixed dependency cycle(s) with /hdmi@fde80000
[ 0.179342] /hdmi@fdea0000: Fixed dependency cycle(s) with /hdmi1-con
[ 0.179386] /hdmi1-con: Fixed dependency cycle(s) with /hdmi@fdea0000
[ 0.189917] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages
[ 0.189931] HugeTLB: 0 KiB vmemmap can be freed for a 1.00 GiB page
[ 0.189939] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages
[ 0.189946] HugeTLB: 0 KiB vmemmap can be freed for a 32.0 MiB page
[ 0.189953] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages
[ 0.189959] HugeTLB: 0 KiB vmemmap can be freed for a 2.00 MiB page
[ 0.189967] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages
[ 0.189973] HugeTLB: 0 KiB vmemmap can be freed for a 64.0 KiB page
[ 0.198594] fbcon: Taking over console
[ 0.198614] ACPI: Interpreter disabled.
[ 0.203500] iommu: Default domain type: Translated
[ 0.203511] iommu: DMA domain TLB invalidation policy: strict mode
[ 0.205037] SCSI subsystem initialized
[ 0.205581] usbcore: registered new interface driver usbfs
[ 0.205621] usbcore: registered new interface driver hub
[ 0.205644] usbcore: registered new device driver usb
[ 0.207195] pps_core: LinuxPPS API ver. 1 registered
[ 0.207204] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti giometti@linux.it
[ 0.207219] PTP clock support registered
[ 0.207395] EDAC MC: Ver: 3.0.0
[ 0.208113] scmi_core: SCMI protocol bus registered
[ 0.209425] FPGA manager framework
[ 0.210642] vgaarb: loaded
[ 0.211131] clocksource: Switched to clocksource arch_sys_counter
[ 0.213038] VFS: Disk quotas dquot_6.6.0
[ 0.213207] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[ 0.213790] netfs: FS-Cache loaded
[ 0.214060] pnp: PnP ACPI: disabled
[ 0.222820] NET: Registered PF_INET protocol family
[ 0.223036] IP idents hash table entries: 131072 (order: 8, 1048576 bytes, linear)
[ 0.280064] tcp_listen_portaddr_hash hash table entries: 4096 (order: 4, 65536 bytes, linear)
[ 0.280179] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[ 0.280267] TCP established hash table entries: 65536 (order: 7, 524288 bytes, linear)
[ 0.281027] TCP bind hash table entries: 65536 (order: 9, 2097152 bytes, linear)
[ 0.282916] TCP: Hash tables configured (established 65536 bind 65536)
[ 0.283235] MPTCP token hash table entries: 8192 (order: 6, 196608 bytes, linear)
[ 0.283439] UDP hash table entries: 4096 (order: 6, 262144 bytes, linear)
[ 0.283790] UDP-Lite hash table entries: 4096 (order: 6, 262144 bytes, linear)
[ 0.284345] NET: Registered PF_UNIX/PF_LOCAL protocol family
[ 0.284379] NET: Registered PF_XDP protocol family
[ 0.284397] PCI: CLS 0 bytes, default 64
[ 0.284589] Trying to unpack rootfs image as initramfs

[ 0.293962] kvm [1]: nv: 570 coarse grained trap handlers
[ 0.294098] kvm [1]: nv: 664 fine grained trap handlers
[ 0.294344] kvm [1]: IPA Size Limit: 40 bits
[ 0.294381] kvm [1]: GICv3: no GICV resource entry
[ 0.294388] kvm [1]: disabling GICv2 emulation
[ 0.294421] kvm [1]: GIC system register CPU interface enabled
[ 0.294442] kvm [1]: vgic interrupt IRQ9
[ 0.294475] kvm [1]: VHE mode initialized successfully
[ 0.297133] Initialise system trusted keyrings
[ 0.297377] workingset: timestamp_bits=42 max_order=21 bucket_order=0
[ 0.305392] squashfs: version 4.0 (2009/01/31) Phillip Lougher
[ 0.306072] 9p: Installing v9fs 9p2000 file system support
[ 0.345009] Key type asymmetric registered
[ 0.345023] Asymmet
[ 1.182066] e1000: Intel(R) PRO/1000 Network Driver
[ 1.182498] e1000: Copyright (c) 1999-2006 Intel Corporation.
[ 1.183025] e1000e: Intel(R) PRO/1000 Network Driver
[ 1.183477] e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
[ 1.184017] igb: Intel(R) Gigabit Ethernet Network Driver
[ 1.184493] igb: Copyright (c) 2007-2014 Intel Corporation.
[ 1.185002] igbvf: Intel(R) Gigabit Virtual Function Network Driver
[ 1.185552] igbvf: Copyright (c) 2009 - 2012 Intel Corporation.
[ 1.186526] sky2: driver version 1.30
[ 1.195096] usbcore: registered new interface driver usb-storage
[ 1.195775] usbcore: registered new interface driver usbserial_generic
[ 1.196362] usbserial: USB Serial support registered for generic
[ 1.196641] ehci-platform fc800000.usb: EHCI Host Controller
[ 1.196647] ohci-platform fc840000.usb: Generic Platform OHCI controller
[ 1.196662] ohci-platform fc840000.usb: new USB bus registered, assigned bus number 1
[ 1.196750] ohci-platform fc840000.usb: irq 44, io mem 0xfc840000
[ 1.199220] hv_vmbus: registering driver hyperv_keyboard
[ 1.199326] ehci-platform fc800000.usb: new USB bus registered, assigned bus number 2
[ 1.200862] ehci-platform fc800000.usb: irq 43, io mem 0xfc800000
[ 1.201481] i2c_dev: i2c /dev entries driver
[ 1.205199] rockchip-pm-domain fd8d8000.power-management:power-controller: Failed to create device link (0x180) with supplier 1-0042 for /power-management@fd8d8000/power-controller/power-domain@8
[ 1.206176] fan53555-regulator 0-0042: FAN53555 Option[10] Rev[1] Detected!
[ 1.207407] fan53555-regulator 0-0043: FAN53555 Option[10] Rev[1] Detected!
[ 1.207518] /i2c@feac0000/usb-typec@22/connector: Fixed dependency cycle(s) with /phy@fed80000
[ 1.208652] fan53555-regulator 1-0042: FAN53555 Option[10] Rev[1] Detected!
[ 1.208814] /i2c@feac0000/usb-typec@22/connector: Fixed dependency cycle(s) with /usb@fc000000

Hi!

Maybe you’ve tried this, or maybe you need to have an sd-image, but on my Rock5B I just wrote the installer to a USB thumb stick and installed it (in my case to an nvme drive) like I would on x86. Have you tried the installer?

I got curious about sd-images so made an example that works for me:

{
  inputs.nixpkgs.url = "github:nixos/nixpkgs/nixos-26.05";

  outputs =
    { self, nixpkgs, ... }:
    {
      nixosConfigurations.sd-image = nixpkgs.lib.nixosSystem {
        modules = [
          (
            { lib, modulesPath, ... }:
            {
              imports = [
                "${modulesPath}/installer/sd-card/sd-image-aarch64.nix"
              ];

              boot.kernelParams = lib.mkForce [
                "console=ttyS2,1500000n8"
                "root=fstab"
              ];

              networking.hostName = "sd-image";
              nixpkgs.hostPlatform = "aarch64-linux";

              users.users.test = {
                isNormalUser = true;
                password = "1234";
              };
            }
          )
        ];
      };

      packages.aarch64-linux.sd-image = self.nixosConfigurations.sd-image.config.system.build.sdImage;
    };
}

I built and wrote the image to an sd card like so:

$ nix build .#sd-image
$ zstdcat result/sd-image/nixos-image-*.img.zst \
  | run0 dd of=<sdcard-device> bs=4M oflag=direct,sync status=progress

I guess that if the above image config (or the minimal aarch64 installer) doesn’t work for you it’s either:

  • a problem with Radxa’s u-boot (which you can replace with the mainline one in a similar way to the linked post above using rkdeveloptool)

  • like you first considered the power supply isn’t up to it, although in my experience the board would completely reset and even then only under load (like building my rust toolchain).