<?xml version="1.0"?>
<rss version="2.0"><channel><title>Armbian topics</title><link>https://testforum.armbian.com/rss/2-armbian-topics.xml/</link><description>New topics</description><language>en</language><item><title>[CNX-Software] - Wireless-Tag WT32P4C5-43S &#x2013; A fully integrated 4.3-inch ESP32-P4 and ESP32-C5 touch display devkit</title><link><![CDATA[https://testforum.armbian.com/topic/62434-cnx-software-wireless-tag-wt32p4c5-43s-a-fully-integrated-43-inch-esp32-p4-and-esp32-c5-touch-display-devkit/?do=findComment&comment=243589]]></link><description>Wireless-Tag WT32P4C5-43S (ZX4D30CE405-V1.3)  is a fully integrated 4.3-inch touch display development board that combines an ESP32-P4 MCU with an ESP32-C5 wireless module supporting dual-band WiFi 6 (2.4/5 GHz), Bluetooth LE, and 802.15.4 connectivity. Unlike previous ESP32-P4 + ESP32-C5 solutions, this one comes with a built-in touchscreen, so you don&#x2019;t need to connect a separate display. Designed for industrial automation, smart control panels, and edge AI vision terminals, the board also integrates a 15-pin MIPI CSI camera interface, a microSD card slot, two USB Type-C ports (USB 2.0 High-Speed and Debug/JTAG), and a 14-pin GPIO expansion header. Wireless-Tag WT32P4C5-43S (ZX4D30CE405-V1.3) specifications: Core module &#x2013; Wireless Tag WT0132P4-A1-N16R32 SoC &#x2013; Espressif Systems ESP32-P4 CPU Dual-core 32-bit RISC-V HP (High-performance) CPU @ up to 400 MHz with AI instructions extension and single-precision FPU Single-RISC-V LP (Low-power) MCU core @ up to 40 MHz with 8KB of zero-wait TCM RAM Memory 768 KB HP [...] 
The post Wireless-Tag WT32P4C5-43S &#x2013; A fully integrated 4.3-inch ESP32-P4 and ESP32-C5 touch display devkit appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Sun, 11 Oct 2026 11:36:22 +0000</pubDate></item><item><title>[CNX-Software] - M5Stack ToughC5 weatherproof ESP32-C5 IoT controller offers dual-band Wi-Fi 6, BLE 5, and Zigbee/Thread</title><link><![CDATA[https://testforum.armbian.com/topic/62435-cnx-software-m5stack-toughc5-weatherproof-esp32-c5-iot-controller-offers-dual-band-wi-fi-6-ble-5-and-zigbeethread/?do=findComment&comment=243590]]></link><description>M5Stack has just introduced the ToughC5, a rugged, weatherproof outdoor IoT controller built around the ESP32-C5. The device features a bright 2.0-inch capacitive touch IPS display and RS485 connectivity. The ToughC5 is an upgrade to the ESP32-base3d M5Stack TOUGH introduced in 2021, with the upgraded model featuring a more modern ESP32-C5 MCU with dual-band (2.4/5 GHz) Wi-Fi 6, Bluetooth 5 LE, and an IEEE 802.15.4 radio for Zigbee and Thread. Other changes include faster Octal PSRAM, an upgraded RTC chip with a dedicated coin cell backup battery, a passive buzzer replacing the previous 1W speaker, and a custom power management system (M5PM1 + M5IOE1) replacing the AXP192 PMU. These features make it suitable for industrial field control, outdoor edge data collection, and smart building applications. M5Stack ToughC5 specifications: Wireless SoC &#x2013; Espressif Systems ESP32-C5HR8 CPU Single-core 32-bit RISC-V processor @ up to 240 MHz Low-power RISC-V core @ 40 MHz [...] 
The post M5Stack ToughC5 weatherproof ESP32-C5 IoT controller offers dual-band Wi-Fi 6, BLE 5, and Zigbee/Thread appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Sat, 10 Oct 2026 07:00:45 +0000</pubDate></item><item><title>[CNX-Software] - Open-source ESP32-C3 DNS ad blocker supports up to over 500,000 domains without PSRAM</title><link><![CDATA[https://testforum.armbian.com/topic/62436-cnx-software-open-source-esp32-c3-dns-ad-blocker-supports-up-to-over-500000-domains-without-psram/?do=findComment&comment=243591]]></link><description>Developed by Zed (M-Abozaid), the esp32-c3-adblock is an open-source, Pi-hole-style DNS ad blocker that runs on a $2 ESP32-C3 microcontroller board/module without requiring PSRAM. It blocks ads and tracking domains across devices on a home or small office network by filtering DNS requests. Instead of storing domain strings in RAM, the project stores them as sorted 40-bit FNV-1a hashes in flash memory and uses binary search to check DNS requests. When a UDP DNS query comes in, the C++ firmware extracts the domain, hashes it (including parent suffixes), and performs a binary search against the flash hash table. If the domain is on the blocklist, the ESP32-C3 returns 0.0.0.0 to block the request. Otherwise, it forwards the query to an upstream DNS server and returns the response to the client. This method fits over 140,000 domains into ~0.7 MB of flash memory while using only ~50 KB of RAM. A [...] 
The post Open-source ESP32-C3 DNS ad blocker supports up to over 500,000 domains without PSRAM appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Fri, 09 Oct 2026 12:00:44 +0000</pubDate></item><item><title>USB keyboard does not work after installing Armbian_community_26.11.0-trunk.62_Orangepiplus_trixie_current_6.18.54_minimal.img.xz on the Orange Pi PC Plus</title><link><![CDATA[https://testforum.armbian.com/topic/62431-usb-keyboard-does-not-work-after-installing-armbian_community_26110-trunk62_orangepiplus_trixie_current_61854_minimalimgxz-on-the-orange-pi-pc-plus/?do=findComment&comment=243584]]></link><description>After installing Armbian_community_26.11.0-trunk.62_Orangepiplus_trixie_current_6.18.54_minimal.img.xz on the Orange Pi PC Plus, the USB keyboard does not work.</description><pubDate>Fri, 09 Oct 2026 09:40:53 +0000</pubDate></item><item><title>iso loopback mount broken with linux-image-bleedingedge-rockchip64 7.3.0-rc4</title><link><![CDATA[https://testforum.armbian.com/topic/62429-iso-loopback-mount-broken-with-linux-image-bleedingedge-rockchip64-730-rc4/?do=findComment&comment=243579]]></link><description>I have a recently commissioned Radxa Rock-5B that I use as my PXE host. It has a number of iso images that are loopback mounted on directories like /var/www/html/mirrors/Fedora-44. I recently attempted an install of Fedora 44 on a VM and it crashed, complaining that it was unable to download a package from /var/www/html/mirrors/Fedora-44/Packages/p/parted-3.6-14.fc44.x86_64.rpm. I checked the directory on the Rock-5B and it was indeed missing but it was also giving me a lot of  output that looked like 
 


	 
 


	-r--r--r-- 1 root root   264876 Feb  2  2026 policycoreutils-3.10-1.fc44.x86_64.rpm 
	?????????? ? ?    ?           ?            ? policycoreutils-newrole-3.10-1.fc44.x86_64.rpm 
	all files from here are the same ???
 


	 
 


	I checked the sha256sum of the Fedora 44 iso against the one published on the website and it matches. I renamed the file and downloaded a fresh copy, just in case, same size, same sha256sum, same errors. I rebooted the Rock-5B to see if it was a transient problem but it was still broken on reboot. I copied the iso file to a different system running an older kernel and mounted it there and the content was correct and there were no errors and more importantly the parted-3.6 rpm file it complained about was present. I removed linux-image-bleedingedge-rockchip64 and rebooted into Linux rock-5b 6.18.53-current-rockchip64 and the problem was gone. 
 


	 
 


	It seems something about loopback mounting iso images is broken in 7.3.0-rc4. I have not tried a more recent bleedingedge version yet.</description><pubDate>Fri, 09 Oct 2026 06:11:30 +0000</pubDate></item><item><title>Olimex A20-OLinuXino-LIME2 and T2-OLinuXino-LIME2 wrong resolution on HDMI</title><link><![CDATA[https://testforum.armbian.com/topic/62428-olimex-a20-olinuxino-lime2-and-t2-olinuxino-lime2-wrong-resolution-on-hdmi/?do=findComment&comment=243578]]></link><description><![CDATA[Sometimes if your monitor is off and olimex start first and after that just monitor is on you will get "default" resolution :
 

~&gt; cat /sys/class/graphics/fb0/virtual_size
1024,768


	I've created a script that fix that with recompiling initramfs, adding necessary /lib/firmware/edid/1920x1080.bin file directly into it.
 


	Feel free to use, suggestions are welcome. 
	 
	P.S. 
	Please add tags A20-OLinuXino-LIME2 and T2-OLinuXino-LIME2
 

fix_hdmi_resolution.sh]]></description><pubDate>Fri, 09 Oct 2026 05:01:42 +0000</pubDate></item><item><title>[CNX-Software] - Sipeed SLogic32U3 &#x2013; A high-speed 10 Gbps USB 3.2 logic analyzer (Crowdfunding)</title><link><![CDATA[https://testforum.armbian.com/topic/62437-cnx-software-sipeed-slogic32u3-a-high-speed-10-gbps-usb-32-logic-analyzer-crowdfunding/?do=findComment&comment=243592]]></link><description>Sipeed has just launched what they claim is the world&#x2019;s first 10 Gbps USB 3.2 logic analyzer. The SLogic32U3 is the successor to the SLogic16U3 3.2 Gbps logic analyzer launched in 2025. The SLogic32U3 USB-C logic analyzer supports up to 32 channels via four mini HDMI connectors, 350 MHz signal bandwidth, up to 1400 MS/s per channel with four channels, or 200 MS/s per channel with 32 channels, and is offered with an optional ADC module. SLogic32U3 specifications: FPGA &#x2013; Not mentioned (potentially from GOWIN) Input channels &#x2013; 32 digital channels via 4x mini HDMI ports, each with 8 channels Sample rates 1400MS/s @ 4 channels 800MS/s @ 8 channels 400MS/s @ 16 channels 200MS/s @ 32 channels Digital signal bandwidth &#x2013; 350 MHz Stream FIFO buffer &#x2013; 2 Gbit DDR3 Capture mode &#x2013; Stream (real-time readback); depth limited by PC memory/disk Signal input voltage &#x2013; 0&#x2013;10 V Adjustable threshold [...] 
The post Sipeed SLogic32U3 &#x2013; A high-speed 10 Gbps USB 3.2 logic analyzer (Crowdfunding) appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Thu, 08 Oct 2026 17:01:38 +0000</pubDate></item><item><title>OS is not detected by ABL on AYN Odin 2 Portal</title><link><![CDATA[https://testforum.armbian.com/topic/62426-os-is-not-detected-by-abl-on-ayn-odin-2-portal/?do=findComment&comment=243571]]></link><description>When flashing the Armbian image for the Odin 2 Portal to the SD card and attempting to boot (on ROCKNIX ABL v1.2), the ABL can detect the SD card but does not detect the OS at all. This is on the latest version of the OS, with the GNOME/ubuntu image flashed via the official Armbian Imager. When will this be fixed?
 


	(image not uploaded as it kept throwing errors)</description><pubDate>Thu, 08 Oct 2026 16:15:25 +0000</pubDate></item><item><title>[CNX-Software] - Q8botOne &#x2013; A palm-sized open-source quadruped robot with ESP32-C3, DYNAMIXEL smart actuators (Crowdfunding)</title><link><![CDATA[https://testforum.armbian.com/topic/62438-cnx-software-q8botone-a-palm-sized-open-source-quadruped-robot-with-esp32-c3-dynamixel-smart-actuators-crowdfunding/?do=findComment&comment=243593]]></link><description>ZeroWire Robotics Q8botOne is an open-source, palm-sized quadruped robot built around an ESP32-C3 MCU and ROBOTIS DYNAMIXEL smart actuators. Designed with a unique wire-free architecture, the robot integrates all components onto a central printed circuit board also used as the structural chassis. The robot is roughly the size of a smartphone and can jog, jump, and carry up to twice its 250-gram weight. The main PCB uses a dedicated 6V/16A step-down converter for motor power and includes a battery management system for two 14500 Li-ion cells. For control, the kit includes a separate ESP32-C3 controller PCB with an Adafruit Mini I2C Gamepad. Q8botOne specifications: Wireless module &#x2013; Espressif Systems ESP32-C3-MINI-1-N4 module with: ESP32-C3 (ESP32-C3FN4) SoC CPU &#x2013; 32-bit RISC-V single-core processor up to 160 MHz Memory &#x2013; 400 KB SRAM (16 KB for cache), 8 KB SRAM in RTC Storage &#x2013; 4 MB embedded flash, 384 KB ROM Connectivity &#x2013; [...] 
The post Q8botOne &#x2013; A palm-sized open-source quadruped robot with ESP32-C3, DYNAMIXEL smart actuators (Crowdfunding) appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Thu, 08 Oct 2026 09:00:08 +0000</pubDate></item><item><title>image build fails on grub-efi install</title><link><![CDATA[https://testforum.armbian.com/topic/62424-image-build-fails-on-grub-efi-install/?do=findComment&comment=243564]]></link><description>While doing some testing of multiple things I decided to build 2 images, fresh/new for my nanopineo's also trying to have the resulting image as close as possible to what I have running on the nanopineo's for years since 2022 or so. That was originally Armbian Buster and I have been tweaking the installations to match other computer installations. Main thing is split the root partitions into a rootfs (Btrfs) and a bootfs (Ext4). More recently, I did more changes, such that I can run the whole image as KVM and/or systemd-nspawn container. 
 


	 
 


	The 1st image was adding extension 'u-boot-menu'; build ended in success, but have not tested it on HW. I saw in extlinux.conf that there was no 'FDT' line (with  sun8i-h3-nanopi-neo.dtb), which I did ad myself in own extlinux testting/semi-automatic .conf generation, but as BOARD=nanopineo, the U-Boot can know a default to be loaded, or nothing at all as the DT in the U-Boot is likely good enough or almost the same as th eone from kernel, but maybe I test/challenge that later.
 


	 
 


	The 2nd image build was just 'u-boot-menu' replaced by 'grub-with-dtb':
 

cd /local/s0/armbuild/
sudo btrfs subvolume create nanopineo
sudo chown 1000:1000 nanopineo
cd nanopineo
git clone https://github.com/armbian/build
cd build
./compile.sh \
BOARD=nanopineo \
RELEASE=trixie \
BRANCH=edge \
BUILD_DESKTOP=no \
BUILD_MINIMAL=yes \
NETWORKING_STACK=systemd-networkd \
FIXED_IMAGE_SIZE=2G \
IMAGE_PARTITION_TABLE=gpt \
BOOTPART_REQUIRED=yes \
BOOTSIZE=256 \
BOOTFS_TYPE=fat \
ROOTFS_TYPE=btrfs \
BTRFS_COMPRESSION=zstd \
COMPRESS_OUTPUTIMAGE=sha \
EXTRAWIFI=no \
KERNEL_CONFIGURE=no \
KERNEL_BTF=no \
KERNEL_GIT=shallow \
ENABLE_EXTENSIONS=watchdog,net-systemd-networkd,uboot-btrfs,grub-with-dtb



	It then fails with:
 


	[&#x1F528;]   E: Unable to locate package grub-efi-armhf-bin 
	[&#x1F528;]   E: Unable to locate package grub-efi-armhf 
	 
 


	The issue here is that the Debian package must be: grub-efi-arm
 


	Also I now remember an issue from years ago when I made a non-EFI system UEFI bootable, must have been RPi thing or so, but also did it several times for x86. AFAIR if only grub-efi-arm and grub-efi-arm-bin, you get into trouble later on, can be years later when dist-upgrading in-place. So I just do 'apt install grub-efi' which then works fine as is pulls in also some dependencies. Not 'efibootmgr', that is just recommended, and I add that manually as most systems allow storing boot URL's in SPI-flash or so, certainly the KVM ones where machine is using EDK2 UEFI, which I use extensively.
 


	 
 


	So it seems to me that this is an architecture naming or aliasing issue, like we have amd64 vs. x86-64 vs. x86_64 and arm64 vs. aarch64
 


	If just 'grub-efi' that also works for riscv I guess, so avoiding this naming/aliasing issue and also better future proof. It might be that dependencies are not supported in image building, I don't know enough about that to judge. I have also not looked in detail at size impact, but it is relative I would say. There is plenty of other issues that claim more space or can reduce way more. There were more issues, but I solved those via trial-error, no show-stoppers.
 


	 
 


	Although topic tag NanoPi-NEO, this is more like an Armbian Build issue, but for me it is about my 5 NanoPi-NEO's that are still great (and still overkill for their 4x Cortex-A7), but they are still Debian 32-bit ARMv7, not like unsupported RPi0/1 single-core ARMv6 (arm11* or older). A reason for wanting EFI bootloader is that upgrading/testing can by done in a KVM running on RPi4 (fast USB3-SSD) or ROCK3A (fast PCI-Ev3x2 NVMe) while using (differential) btrfs send|receive, which is way faster than on SD-cards en real HW. The other option is via U-Boot (QEMU -enable-kvm option), is supported for 64-bit in Armbian by BOARD=qemu-uboot-arm64, not for 32-bit.</description><pubDate>Thu, 08 Oct 2026 08:58:31 +0000</pubDate></item><item><title>Edge kernel 7.3.0-rc6</title><link><![CDATA[https://testforum.armbian.com/topic/62419-edge-kernel-730-rc6/?do=findComment&comment=243549]]></link><description>Edge kernel 7.3.0-rc6
 


	Makes board unstable
 


	 
 


	[ 1173.843180] rockchip-dw-pcie 3c0800000.pcie: PCIe Gen.3 x2 link up 
	[ 1173.971258] pcieport 0002:20:00.0: Root Port has been reset 
	[ 1173.971328] nvme nvme0: restart after slot reset 
	[ 1173.982877] nvme nvme0: D3 entry latency set to 8 seconds 
	[ 1173.994210] nvme nvme0: 4/0/0 default/read/poll queues 
	[ 1173.994642] pcieport 0002:20:00.0: AER: device recovery successful 
	[ 1173.994719] pcieport 0002:20:00.0: Recovering Root Port due to Link Down 
	[ 1173.994761] nvme nvme0: frozen state error detected, reset controller 
	[ 1174.028524] phy phy-fe8c0000.phy.7: lane number 0, val 1 
	[ 1174.343104] rockchip-dw-pcie 3c0800000.pcie: PCIe Gen.3 x2 link up 
	[ 1174.471131] pcieport 0002:20:00.0: Root Port has been reset 
	[ 1174.471191] nvme nvme0: restart after slot reset 
	[ 1174.486326] nvme nvme0: D3 entry latency set to 8 seconds 
	[ 1174.496045] nvme nvme0: 4/0/0 default/read/poll queues 
	[ 1174.496250] pcieport 0002:20:00.0: AER: device recovery successful 
	[ 1174.496284] pcieport 0002:20:00.0: Recovering Root Port due to Link Down 
	[ 1174.496303] nvme nvme0: frozen state error detected, reset controller
 


	 
 


	Please test rc in bleeding-edge before making it available on edge
 


	Thanks !</description><pubDate>Thu, 08 Oct 2026 02:01:04 +0000</pubDate></item><item><title>[CNX-Software] - Efinix Sapphire RV64 SoC &#x2013; Configurable RISC-V soft-cores with DDR3, LPDDR4x, and HyperRAM for Efinix FPGAs</title><link><![CDATA[https://testforum.armbian.com/topic/62439-cnx-software-efinix-sapphire-rv64-soc-configurable-risc-v-soft-cores-with-ddr3-lpddr4x-and-hyperram-for-efinix-fpgas/?do=findComment&comment=243594]]></link><description>Efinix has introduced the Sapphire RV64 SoC, a configurable 64-bit RISC-V soft-core processor designed for its Titanium and Trion FPGAs. It is based on the VexiiRiscv core and can be configured with one to four RISC-V cores running at up to 400 MHz. The Sapphire RV64 has a seven-stage pipeline, configurable L1 caches, optional 64&#x2013;512 KB L2 cache, and 4&#x2013;512 KB of on-chip RAM. It supports DDR3, LPDDR4x, and HyperRAM with up to 512-bit AXI interfaces and external memory from 4 MB to 8 GB. Other features include an optional FPU, branch predictor, prefetchers, SV39 MMU, up to 32 GPIOs, five I&#xB2;C, three SPI, three UARTs, timers, watchdog, and up to eight user interrupts. Efinix Sapphire RV64 SoC specifications: CPU 1 to 4x VexiiRiscv 64-bit cores with a 7-stage pipeline (fetch, align-decompress, decode, issue, execute, memory, and writeback) Configurable system clock frequency from 20 MHz to 400 MHz Supports RV64IMACFD_Zba_Zbc_Zbs extensions [...] 
The post Efinix Sapphire RV64 SoC &#x2013; Configurable RISC-V soft-cores with DDR3, LPDDR4x, and HyperRAM for Efinix FPGAs appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Thu, 08 Oct 2026 00:00:32 +0000</pubDate></item><item><title>[CNX-Software] - DSPi firmware turns Raspberry Pi RP2040/RP2350 into a USB sound card with an onboard DSP engine</title><link><![CDATA[https://testforum.armbian.com/topic/62440-cnx-software-dspi-firmware-turns-raspberry-pi-rp2040rp2350-into-a-usb-sound-card-with-an-onboard-dsp-engine/?do=findComment&comment=243595]]></link><description>DSPi is a full-featured audio DSP firmware for the Raspberry Pi Pico, Pico 2, and other Raspberry Pi RP2040/RP2350 boards, which turns them into a USB sound card with an integrated DSP. It allows users to make use of essential tools like room correction, active crossovers, parametric EQ, time alignment, and more, and essentially works as a regular sound card on your computer. DSPi firmware&#x2019;s capabilities: Dual-Core DSP &#x2013; EQ processing is split across both cores on both RP2040 and RP2350. USB Audio Interface &#x2013; Supports 16-bit and 24-bit PCM input at 44.1, 48, and 96 kHz, working on macOS, Windows, Linux, and iOS. S/PDIF Input &#x2013; 24-bit PCM stereo audio at 44.1 or 48kHz. 24-bit S/PDIF or I2S Outputs &#x2013; Up to 4x independent stereo output slots (8x channels on RP2350, 4x channels on RP2040). Subwoofer Output &#x2013; Dedicated mono PDM output channel with a high-performance 2nd-order delta-sigma modulator, [...] 
The post DSPi firmware turns Raspberry Pi RP2040/RP2350 into a USB sound card with an onboard DSP engine appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Wed, 07 Oct 2026 09:00:08 +0000</pubDate></item><item><title>[CNX-Software] - NuMaker-IoT-MA35D0-A2 (Chili Pro) ultra-compact evaluation board features MA35D0K Cortex-A35/M4 MPU</title><link><![CDATA[https://testforum.armbian.com/topic/62441-cnx-software-numaker-iot-ma35d0-a2-chili-pro-ultra-compact-evaluation-board-features-ma35d0k-cortex-a35m4-mpu/?do=findComment&comment=243596]]></link><description>Nuvoton has added MA35D05KH67C, MA35D05KI67C, and MA35D05KJ67C, three new LQFP128 MPUs, to the NuMicro MA35D0 series, along with the NuMaker-IoT-MA35D0-A2 (Chili Pro) evaluation board. Designed for industrial AI, smart gateways, and renewable energy systems, this heterogeneous MPU has two 64-bit Arm Cortex-A35 cores at up to 650 MHz, plus a dedicated 180 MHz Arm Cortex-M4 for real-time work. Nuvoton&#x2019;s press release calls Chili Pro the &#x201C;industry&#x2019;s smallest Linux platform,&#x201D; but the board is 45 &#xD7; 45 mm, which is bigger than other boards we wrote about previously, like the VoCore2 (25.4 &#xD7; 25.4 &#xD7; 2.8 mm), the Milk-V Duo 256M (51 &#xD7; 21 mm), NanoPi NEO (40 &#xD7; 40 mm), and even the Raspberry Pi Zero 2 W (65 &#xD7; 30 mm). Still, considering that it fits full-sized RJ45 and USB ports along with the other interfaces, it is a pretty compact and capable board. Nuvoton NuMaker-IoT-MA35D0-A2 evaluation board specifications: [...] 
The post NuMaker-IoT-MA35D0-A2 (Chili Pro) ultra-compact evaluation board features MA35D0K Cortex-A35/M4 MPU appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Wed, 07 Oct 2026 00:00:19 +0000</pubDate></item><item><title>OK Now I am going to ask the question I never see. The RK3588 Big Advertisement is 8k video</title><link><![CDATA[https://testforum.armbian.com/topic/62407-ok-now-i-am-going-to-ask-the-question-i-never-see-the-rk3588-big-advertisement-is-8k-video/?do=findComment&comment=243530]]></link><description><![CDATA[&lt;prompt&gt; "Talk to me about it." 
	 
 


	&lt;claude&gt; Good question, because the honest answer has layers, and most of the "8K" in the ads lives in only one of them.
 


	What's real: the decoder. The RK3588's video engine (RKVDEC2) really does decode 8K: HEVC and VP9 at 8K@60, H.264 and AV1 at 8K@30, in silicon. That's not marketing. It's the same block Deep Ink talks to for our 4K HDR work, and 8K is just more macroblocks through the same pipe. So "8K video decoding" is a true statement about the chip.
 


	Where it thins out: the display. The VOP2 display controller's big port (VP0) tops out at 8K@30 or 4K@120, and here's the nugget: those are the same number. 7680×4320×30 = 995 million pixels per second; 3840×2160×120 = 995 million. The 4K@120 we fought for this month (the dclk patch, the FRL link-up on rkr7.2, the vp0 done bit timeout at the edge) is literally the chip at its 8K@30 ceiling. There is no 8K@60 output from this silicon, whatever the HDMI 2.1 badge implies. 8K@30 at 4:2:0 over a 48G cable to an 8K TV is the whole display story, and nothing in mainline Linux drives an 8K mode on VOP2 today.
 


	Where it falls apart: everything between decode and glass. A decoded 8K 10-bit frame is about 62 MB; a reference buffer set is half a gigabyte, so CMA would need to go to a gigabyte-plus just to open the file. Then someone has to get 33 million pixels per frame onto the screen. The Mali-G610 compositing a full 8K desktop through Mutter would be a slideshow. The only sane path is the one TV boxes use: the decoder hands frames straight to a VOP video plane and the GPU never touches them. That's a Kodi/direct-scanout architecture, not a GNOME desktop. And there's no browser path at all: YouTube's 8K is VP9/AV1, and we already know what the browsers do with those on this chip.
 


	Who it's really for. Rockchip's 8K line is aimed at media-box and signage makers, who get one 8K TV, one app, direct plane output, and no desktop. For a desktop distro it's a spec-sheet number, not a feature.
 


	What's honest to say for Plaid: "decodes 8K; displays 4K at up to 120 Hz." Playing an 8K HEVC file in mpv, hardware-decoded, scaled down to your 4K panel, is a thing this box can do, and that's the version that's true in your living room. "8K desktop" is a mirage, and that's the brand line.
 


	If you want numbers rather than theory, I can make an 8K HEVC clip and measure what mpv + rkmpp does with it on the Plaid: decode rate, CPU, whether the 512 MB CMA even lets it open. That would give the website a measured sentence instead of a claim.
 


	 
	&lt;prompt&gt; "Ok, that's where it becomes a development board... We can do it... now you make it work" 
	 
	 
	&lt;claude&gt; Here's what "8K" turned out to mean, measured rather than argued. 
	 
 


	The decoder is real. With frames left on the GPU, the VPU chewed through 8K30 HEVC at 55.8 fps, one decoder interrupt per frame, nearly double real time. Rockchip's "8K@60 decode" is silicon, not a brochure. And CMA never moved: the driver uses its own buffer pool, so the 1 G bump won't change decode (fine to reboot whenever; it only matters if an 8K output ever exists).
 


	The screen is the problem, and it's the Mali blob's desktop, not the chip. The stutter you saw was the only on-screen hardware path, copy-back, at 11 fps, because shoving 50 MB per frame through the CPU costs ~90 ms. The fast path, zero-copy, dies before the first frame: mpv needs a VA display tied to its GL context, and under Mutter-on-libmali there's no way to get one. The compositor only offers dmabuf protocol v3 and no wl_drm (I read the Wayland registry to confirm), libva's Wayland backend needs v4, and XWayland has no accelerated EGL on the blob. Behind that door is the GR88 wall Firefox hit. Also a trap: mpv 0.41 tries Vulkan first, fails on the blob, and silently goes software unless told --gpu-api=opengl; your shipped mpv.conf effectively runs copy-back for everything.
 


	The honest website line: "decodes 8K; displays 4K at up to 120 Hz." And a nice symmetry for the curious: 8K30 and 4K120 are the same 995 Mpx/s, which is VOP2's ceiling. No 8K60 output exists on this chip, HDMI 2.1 badge or not.
 


	Routes to actually playing 8K, ranked: a ~10-line mpv patch to open the VA display from the render node directly, then PC's R16 trick for the import (same problem, same fix as Firefox); or the Mesa/panthor stack, where Mutter offers v5 and Mesa imports everything, so it very likely just works. One more point for mainline.
 


	 
 


	 
	 
	Built Finagled Measured Rendered Verdict 
	Claude Fable 5 
	 
	I was watching Weezer and it came up 
	 
	defcom5-rockchip]]></description><pubDate>Tue, 06 Oct 2026 22:28:15 +0000</pubDate></item><item><title>[Collabora] - USB-C DisplayPort Alt Mode on Rockchip RK3588 and RK3576, starting with the Flipper One</title><link><![CDATA[https://testforum.armbian.com/topic/62406-collabora-usb-c-displayport-alt-mode-on-rockchip-rk3588-and-rk3576-starting-with-the-flipper-one/?do=findComment&comment=243529]]></link><description>A look at the USB-PD, PHY, hotplug, and DRM changes involved in making USB-C DisplayPort Alternate Mode work on RK3588/RK3576, and where they stand on the way to mainline Linux.
  View the full article</description><pubDate>Tue, 06 Oct 2026 20:32:03 +0000</pubDate></item><item><title><![CDATA[Found why Firefox will not hardware decode NV12 8 bit vp09 & 8 bit HEVC on Rockchip]]></title><link><![CDATA[https://testforum.armbian.com/topic/62404-found-why-firefox-will-not-hardware-decode-nv12-8-bit-vp09-8-bit-hevc-on-rockchip/?do=findComment&comment=243523]]></link><description><![CDATA[Now the picture is complete, and it's better news than the September note suggested. Three things in Firefox's own code: 
	 
 


	1. There's a fallback chain already, and it's three deep. CreateTexture tries zero-copy import first; if that fails it has CreateTextureViaCopyYUV for NV12 and CreateTextureViaCopyP010 for 10-bit.
 


	2. Those fallbacks already use the external-texture machinery — the exact mechanism a whole-frame import needs:
 


	 
	aGLContext-&gt;fBindTexture(LOCAL_GL_TEXTURE_EXTERNAL, srcTex); 
	aGLContext-&gt;fEGLImageTargetTexture2D(LOCAL_GL_TEXTURE_EXTERNAL, mEGLImage[aPlane]); 
	 
	So Firefox can bind a dma-buf as an external texture. It just does it per plane, as a copy, and only when the buffer is linear. 
	 
 


	3. Firefox already tracks the whole-frame NV12 format. DMABufFormats.cpp calls EnsureBasicFormat(GBM_FORMAT_NV12), stores its modifiers, and GetDRMFormat() hands that object back — and the YUV path then passes it in while still importing two planes as R8 + GR88.
 


	Why we never reach any of it. The chain starts at CreateYUVPlane, which has to build an EGLImage for plane 1 using GR88. On the Mali blob that format doesn't exist, so the image is never created, and the loop bails before CreateTexture and all three fallbacks. The failure is one step earlier than the recovery code. 
	 
 


	So, to your question: not commented out, and not missing either. Every ingredient is present — the whole-frame format with its modifiers, the external-texture import, and a precedent for swapping formats when one isn't supported. What's absent is the wiring for the case where both two-channel 8-bit formats are missing but the whole-frame format is there.
 


	That makes a much better upstream report than "please support our driver." It's: your existing fallback tries exactly one alternative; here is a shipping Arm GPU where both alternatives are absent and the whole-frame format you already track is present. With the 41-format list as evidence and a reproducible platform behind it.
 


	Want me to write that up as a Bugzilla report? I'd check first whether it's already filed, and the honest framing is a driver-conformance gap with a suggested fallback, not a demand. 
	Researched the code with Claude Fable 5 
	So with any luck Firefox will add the needed ingredients.]]></description><pubDate>Tue, 06 Oct 2026 16:15:36 +0000</pubDate></item><item><title>[News from Armbian] - Github Highlights</title><link><![CDATA[https://testforum.armbian.com/topic/62403-news-from-armbian-github-highlights/?do=findComment&comment=243521]]></link><description><![CDATA[This week's work centers on expanded board and SoC support, build and repository infrastructure modernization, and refinements to user-facing tooling and documentation. On the hardware side, mainline support arrived for the Radxa Rock 2A/2F and the Toradex Verdin iMX8M Mini, while the KickPi K2B V2.2 DDR3 gained a full board definition including a new Maxio MAE0621 PHY driver. The Allwinner sun60iw2 platform saw substantial advancement on the Orange Pi 4 Pro with GPU, desktop, and hardware video decode enablement, alongside kernel configuration refinements. The Amlogic C400-plus received U-Boot repacking and Mali-T820 stabilization, the Rockchip armhf edge kernel was bumped to 7.3, and smaller fixes landed for the BPI-M4-Zero, Allwinner D1 RISC-V, MangoPi MQ, and Anbernic handhelds. The build framework received a significant repository management overhaul, adopting the production singlemode repo.sh into main and publishing with Acquire-By-Hash for integrity. OCI storage became configurable with a read-only OCI_PROXY, propagated through CI chunk workflows and runner cleanup. NXP and Trusted Firmware sources were migrated to Armbian-hosted GitHub mirrors, user patches can now override same-named core patches, and USERPATCHES_PATH was restored to working order. For end users, armbianmonitor received a full refactor, armbian-firstlogin gained unattended-preset safety and broader username validation, and the APT lock handling was hardened against stale cache locks. The configng project introduced a read-only registry-cache for ghcr.io, fixed static IP cancellation handling, and corrected tuning-profile swappiness regressions. Documentation expanded to cover OCI storage, unattended first login, and application installation workflows. #Armbian #EmbeddedLinux #SBC #Rockchip #Allwinner #UBoot ChangesActions: Fix noble dkms, add to test matrix. by @vidplace7 in armbian/MorseMicro-DKMS#18Actions: Use numbered distro release in deb version. by @vidplace7 in armbian/MorseMicro-DKMS#19aml-c400-plus: repack blob; u-boot: env-in-mmc; +fancy-ish (&lt;1MiB bl33). by @rpardini in armbian/build#10907aml-c400-plus: u-boot: fix u-boot.ext (bare bl33 for chainloading/toothpick). by @rpardini in armbian/build#10918anbernic-rg-ds: MBR image, fix battery charging, rumble at power-on. by @crackerjacques in armbian/build#10900anbernic-rg-vita-pro: MBR image, rumble at power-on. by @crackerjacques in armbian/build#10901apt: wait on lock + clear stale cache lock (fix "held by process 0"). by @igorpecovnik in armbian/build#10893armbian-firstlogin: allow underscore and hyphen in usernames. by @xsalaices in armbian/build#10844armbian-firstlogin: don't block an unattended preset run on questions. by @igorpecovnik in armbian/build#10840armbian-kernel: enable SMB/CIFS client and ksmbd on all kernels. by @igorpecovnik in armbian/build#10885Armbianmonitor refactor. by @EvilOlaf in armbian/build#9327autoconfig: document unattended first login and static IP scope. by @igorpecovnik in armbian/documentation#1419ayn-odin3: Migrate kernel to Linux 7.2. by @kasimling in armbian/build#10690bcm2711: always use official raspberrypi/firmware for start4.elf (and co). by @rpardini in armbian/build#10855bcm2711: don't enable a second serial getty on the Raspberry Pi UART. by @igorpecovnik in armbian/build#10848board-images: add KickPi K2B V2.2 board image. by @Novice-PG in armbian/armbian.github.io#478board-vendor-logos: add 9tripod logo. by @igorpecovnik in armbian/armbian.github.io#477board: add Toradex Verdin iMX8M Mini (board+vendor). by @lucshl in armbian/armbian.github.io#475board: bananapicm4io: blacklist out-of-tree 88x2cs wifi driver. by @igorpecovnik in armbian/build#10872board: mixtile-blade3: use rk3588-mixtile-blade3.dtb on the vendor branch. by @evtest-hash in armbian/build#10774boards: add Toradex Verdin iMX8M Mini support. by @lucshl in armbian/build#10867boards: aml-c400-plus: stabilize Mali-T820 by pinning runtime-PM on probe and reset. by @jomadeto in armbian/build#10797BPI-M4-Zero: Adjust LPDDR4 timings and AXP313 regulators. by @pyavitz in armbian/build#10873BPI-M4-Zero: Optimize mmc1 DT properties for fast SDIO initialization. by @pyavitz in armbian/build#10880BPI-M4-Zero: U-Boot: Drop HACK: sunxi: gpu enable. by @pyavitz in armbian/build#10881bring USERPATCHES_PATH back into working state and fix inconsistencies. by @EvilOlaf in armbian/build#10776bsp: refresh the release checksum after version changes. by @khaliforce in armbian/build#10909build-framework: document OCI storage and OCI_PROXY. by @igorpecovnik in armbian/documentation#1445bump rockchip armhf edge kernel to 7.3. by @paolosabatino in armbian/build#10864cache services: publish on the host and local containers only by default. by @igorpecovnik in armbian/configng#1043chunk workflows: export the runner's oci_cache as OCI_PROXY. by @igorpecovnik in armbian/ci#83ci: expand kernel defconfigs before the security check. by @igorpecovnik in armbian/build#10897contribute/datacenter: add infra repo screenshot to gallery. by @igorpecovnik in armbian/documentation#1507contribute/datacenter: add rack photo gallery. by @igorpecovnik in armbian/documentation#1503contribute/datacenter: correct console server port count. by @igorpecovnik in armbian/documentation#1508create AGENTS.md. by @EvilOlaf in armbian/build#10843d1: backport the RISC-V clocksource rating fix. by @khaliforce in armbian/build#10886d1: enable RTL8723DS Wi-Fi and fix regulatory database support. by @khaliforce in armbian/build#10887data: fail closed when a mirror is unreachable, not silently short. by @igorpecovnik in armbian/armbian.github.io#447docker_publish_local: use the default when BIND_ADDRESS has no address. by @igorpecovnik in armbian/configng#1045docs: link app pages to the install steps. by @igorpecovnik in armbian/configng#1049extension: add interactive shell. by @EvilOlaf in armbian/build#10879extensions: arm64-compat-vdso: fix the riscv64 host handling. by @iav in armbian/build#10869feat: Add Seeed Studio reComputer RK3576 Module devkit dts. by @Lesords in armbian/linux-rockchip#570fix customize-image and config-example . by @EvilOlaf in armbian/build#10878generate-servers-jsons: include VMs tagged "github runner". by @igorpecovnik in armbian/armbian.github.io#476getting-started: document armbian-debug; fix armbian-upgrade wording. by @igorpecovnik in armbian/documentation#1428git: don't hard-abort when the global safe.directory write fails. by @xsalaices in armbian/build#10845git: fetch trustedfirmware.org shared submodules from GitHub mirrors. by @igorpecovnik in armbian/build#10877gl-mt2500: use lowercase vendor slug gl.inet. by @igorpecovnik in armbian/build#10895helios4: u-boot: drop obsolete patches. by @iav in armbian/build#10883imx8m, imx93, imx8ulp: fetch NXP firmware from armbian/nxp-firmware. by @igorpecovnik in armbian/build#10868kernel-debs: headers: depend on python3-minimal. by @iav in armbian/build#10846kickpi-k2b-v2: add KickPi K2B V2.2 DDR3 board (DDR3 u-boot defconfig, DTS, WiFi watchdog). by @Novice-PG in armbian/build#10902main-config: cause error when lib.config is present. by @EvilOlaf in armbian/build#10876mainline: bump to 7.3-rc6. by @EvilOlaf in armbian/build#10914mangopi-mq: fix board configuration and clock handling. by @khaliforce in armbian/build#10908mangopi-mq: replace bundled boot firmware with source builds. by @khaliforce in armbian/build#10888meson-gxm-c400-plus: enable front panel display. by @jomadeto in armbian/build#10903meson64-6.12: rebase the old aiu HDMI codec patch onto 6.12.111+. by @iav in armbian/build#10898meson64-7.2: fix due to upstream changes broken patch. by @EvilOlaf in armbian/build#10890mkdocs: cache-bust extra_css with a version query. by @igorpecovnik in armbian/documentation#1506module_redis: opt-in cache mode (REDIS_MAXMEMORY). by @igorpecovnik in armbian/configng#1038module_tuning_profile: apply was undoing its own swappiness. by @igorpecovnik in armbian/configng#1039mvebu64: fetch TF-A from its GitHub mirror. by @igorpecovnik in armbian/build#10866network: abort static IP setup on dialog cancel instead of crashing netplan. by @xsalaices in armbian/configng#1040oci: configurable OCI storage and read-only OCI_PROXY. by @igorpecovnik in armbian/build#10860Odroidxu4 wifi adjustment. by @EvilOlaf in armbian/build#10875orangePi CM5 USB3 enhancement + exprimental mode. by @ECO1AI in armbian/build#10904pack-debian: publish the repository with Acquire-By-Hash. by @igorpecovnik in armbian/scripts#94patching: let a userpatch override the same-named core patch. by @iav in armbian/build#10884pkg_remove: use purge instead of autopurge to stop cascade removal. by @xsalaices in armbian/configng#1037Radxa Rock 2A/2F mainline. by @lukaszsobala in armbian/build#10852redirector: torrent check needs proof before reporting in sync. by @igorpecovnik in armbian/armbian.github.io#474redirector: verify mirror sync by file-probe, not directory mirroring. by @igorpecovnik in armbian/armbian.github.io#471repo management: adopt the production (singlemode) repo.sh into main. by @igorpecovnik in armbian/build#10304repo: publish with Acquire-By-Hash. by @igorpecovnik in armbian/build#10911repository update: publish stable only every STABLE_REPOSITORY_UPDATE days. by @igorpecovnik in armbian/armbian.github.io#472repository update: use repo.sh from build main. by @igorpecovnik in armbian/armbian.github.io#473rockchip64-7.2: media: rkvdec: Add VP9 support for VDPU381 variant (v1). by @rpardini in armbian/build#10874rockchip64: 7.3: helios64: Wake-on-LAN through the PHY. by @iav in armbian/build#10865rockchip64: copy the RK3562 patch set from 7.2 to 7.3. by @retro98boy in armbian/build#10863rockchip: rk3506: fix RockUSB full-speed enumeration data abort. by @stevenjoezhang in armbian/build#10833runner-clean: export the runner's oci_cache as OCI_PROXY. by @igorpecovnik in armbian/actions#43runner-cleanup: keep build-cache service images. by @igorpecovnik in armbian/configng#1048runner-cleanup: never wipe _work of a runner with a live job. by @igorpecovnik in armbian/configng#1050software: add registry-cache, a read-only cache of ghcr.io. by @igorpecovnik in armbian/configng#1044software: explain how to install an app. by @igorpecovnik in armbian/documentation#1504software: stop offering Watchtower install, keep Disable. by @xsalaices in armbian/configng#1041sophgo-sg200x-aic8800: fetch the driver only when the kernel builds. by @igorpecovnik in armbian/build#10847sophgo-sg200x-aic8800: keep the 7.3 RoC cookie in the RoC element. by @lukaszsobala in armbian/build#10854sun60iw2: fix GPU userspace install ELOOP on headless builds. by @ijiki16 in armbian/build#10882sun60iw2: GPU, desktop and hardware video decode for Orange Pi 4 Pro. by @ijiki16 in armbian/build#10835sun60iw2: keep the Dirty Frag mitigation over the Armbian default. by @igorpecovnik in armbian/build#10912sun60iw2: kernel config: modulize drivers, add wireguard, mitigate dirty frag. by @EvilOlaf in armbian/build#10871sunxi-7.2: drop patch upstreamed with v7.2.9. by @EvilOlaf in armbian/build#10889sunxi: add Maxio MAE0621 PHY driver (KickPi K2B V2.2 DDR3 ethernet fix). by @Novice-PG in armbian/build#10894sunxi: recore: add device trees for Recore A5-A8. by @eliasbakken in armbian/build#10850sunxi: recore: update U-Boot and put BL31 in DRAM. by @eliasbakken in armbian/build#10853tests: skip stable switch on forky, disable redis and portainer tests. by @igorpecovnik in armbian/configng#1051u-boot: report SPL/TPL size against CONFIG_*_MAX_SIZE. by @igorpecovnik in armbian/build#10858uefi-x86-6.18: rebase i915 4-lane quirk patch for 6.18.55. by @igorpecovnik in armbian/build#10891View the full article]]></description><pubDate>Tue, 06 Oct 2026 12:59:29 +0000</pubDate></item><item><title>[Armbian newsletter] - Github Highlights</title><link><![CDATA[https://testforum.armbian.com/topic/62402-armbian-newsletter-github-highlights/?do=findComment&comment=243520]]></link><description><![CDATA[This week's work centers on expanded board and SoC support, build and repository infrastructure modernization, and refinements to user-facing tooling and documentation. On the hardware side, mainline support arrived for the Radxa Rock 2A/2F and the Toradex Verdin iMX8M Mini, while the KickPi K2B V2.2 DDR3 gained a full board definition including a new Maxio MAE0621 PHY driver. The Allwinner sun60iw2 platform saw substantial advancement on the Orange Pi 4 Pro with GPU, desktop, and hardware video decode enablement, alongside kernel configuration refinements. The Amlogic C400-plus received U-Boot repacking and Mali-T820 stabilization, the Rockchip armhf edge kernel was bumped to 7.3, and smaller fixes landed for the BPI-M4-Zero, Allwinner D1 RISC-V, MangoPi MQ, and Anbernic handhelds. The build framework received a significant repository management overhaul, adopting the production singlemode repo.sh into main and publishing with Acquire-By-Hash for integrity. OCI storage became configurable with a read-only OCI_PROXY, propagated through CI chunk workflows and runner cleanup. NXP and Trusted Firmware sources were migrated to Armbian-hosted GitHub mirrors, user patches can now override same-named core patches, and USERPATCHES_PATH was restored to working order. For end users, armbianmonitor received a full refactor, armbian-firstlogin gained unattended-preset safety and broader username validation, and the APT lock handling was hardened against stale cache locks. The configng project introduced a read-only registry-cache for ghcr.io, fixed static IP cancellation handling, and corrected tuning-profile swappiness regressions. Documentation expanded to cover OCI storage, unattended first login, and application installation workflows. #Armbian #EmbeddedLinux #SBC #Rockchip #Allwinner #UBoot ChangesActions: Fix noble dkms, add to test matrix. by @vidplace7 in armbian/MorseMicro-DKMS#18Actions: Use numbered distro release in deb version. by @vidplace7 in armbian/MorseMicro-DKMS#19aml-c400-plus: repack blob; u-boot: env-in-mmc; +fancy-ish (&lt;1MiB bl33). by @rpardini in armbian/build#10907aml-c400-plus: u-boot: fix u-boot.ext (bare bl33 for chainloading/toothpick). by @rpardini in armbian/build#10918anbernic-rg-ds: MBR image, fix battery charging, rumble at power-on. by @crackerjacques in armbian/build#10900anbernic-rg-vita-pro: MBR image, rumble at power-on. by @crackerjacques in armbian/build#10901apt: wait on lock + clear stale cache lock (fix "held by process 0"). by @igorpecovnik in armbian/build#10893armbian-firstlogin: allow underscore and hyphen in usernames. by @xsalaices in armbian/build#10844armbian-firstlogin: don't block an unattended preset run on questions. by @igorpecovnik in armbian/build#10840armbian-kernel: enable SMB/CIFS client and ksmbd on all kernels. by @igorpecovnik in armbian/build#10885Armbianmonitor refactor. by @EvilOlaf in armbian/build#9327autoconfig: document unattended first login and static IP scope. by @igorpecovnik in armbian/documentation#1419ayn-odin3: Migrate kernel to Linux 7.2. by @kasimling in armbian/build#10690bcm2711: always use official raspberrypi/firmware for start4.elf (and co). by @rpardini in armbian/build#10855bcm2711: don't enable a second serial getty on the Raspberry Pi UART. by @igorpecovnik in armbian/build#10848board-images: add KickPi K2B V2.2 board image. by @Novice-PG in armbian/armbian.github.io#478board-vendor-logos: add 9tripod logo. by @igorpecovnik in armbian/armbian.github.io#477board: add Toradex Verdin iMX8M Mini (board+vendor). by @lucshl in armbian/armbian.github.io#475board: bananapicm4io: blacklist out-of-tree 88x2cs wifi driver. by @igorpecovnik in armbian/build#10872board: mixtile-blade3: use rk3588-mixtile-blade3.dtb on the vendor branch. by @evtest-hash in armbian/build#10774boards: add Toradex Verdin iMX8M Mini support. by @lucshl in armbian/build#10867boards: aml-c400-plus: stabilize Mali-T820 by pinning runtime-PM on probe and reset. by @jomadeto in armbian/build#10797BPI-M4-Zero: Adjust LPDDR4 timings and AXP313 regulators. by @pyavitz in armbian/build#10873BPI-M4-Zero: Optimize mmc1 DT properties for fast SDIO initialization. by @pyavitz in armbian/build#10880BPI-M4-Zero: U-Boot: Drop HACK: sunxi: gpu enable. by @pyavitz in armbian/build#10881bring USERPATCHES_PATH back into working state and fix inconsistencies. by @EvilOlaf in armbian/build#10776bsp: refresh the release checksum after version changes. by @khaliforce in armbian/build#10909build-framework: document OCI storage and OCI_PROXY. by @igorpecovnik in armbian/documentation#1445bump rockchip armhf edge kernel to 7.3. by @paolosabatino in armbian/build#10864cache services: publish on the host and local containers only by default. by @igorpecovnik in armbian/configng#1043chunk workflows: export the runner's oci_cache as OCI_PROXY. by @igorpecovnik in armbian/ci#83ci: expand kernel defconfigs before the security check. by @igorpecovnik in armbian/build#10897contribute/datacenter: add infra repo screenshot to gallery. by @igorpecovnik in armbian/documentation#1507contribute/datacenter: add rack photo gallery. by @igorpecovnik in armbian/documentation#1503contribute/datacenter: correct console server port count. by @igorpecovnik in armbian/documentation#1508create AGENTS.md. by @EvilOlaf in armbian/build#10843d1: backport the RISC-V clocksource rating fix. by @khaliforce in armbian/build#10886d1: enable RTL8723DS Wi-Fi and fix regulatory database support. by @khaliforce in armbian/build#10887data: fail closed when a mirror is unreachable, not silently short. by @igorpecovnik in armbian/armbian.github.io#447docker_publish_local: use the default when BIND_ADDRESS has no address. by @igorpecovnik in armbian/configng#1045docs: link app pages to the install steps. by @igorpecovnik in armbian/configng#1049extension: add interactive shell. by @EvilOlaf in armbian/build#10879extensions: arm64-compat-vdso: fix the riscv64 host handling. by @iav in armbian/build#10869feat: Add Seeed Studio reComputer RK3576 Module devkit dts. by @Lesords in armbian/linux-rockchip#570fix customize-image and config-example . by @EvilOlaf in armbian/build#10878generate-servers-jsons: include VMs tagged "github runner". by @igorpecovnik in armbian/armbian.github.io#476getting-started: document armbian-debug; fix armbian-upgrade wording. by @igorpecovnik in armbian/documentation#1428git: don't hard-abort when the global safe.directory write fails. by @xsalaices in armbian/build#10845git: fetch trustedfirmware.org shared submodules from GitHub mirrors. by @igorpecovnik in armbian/build#10877gl-mt2500: use lowercase vendor slug gl.inet. by @igorpecovnik in armbian/build#10895helios4: u-boot: drop obsolete patches. by @iav in armbian/build#10883imx8m, imx93, imx8ulp: fetch NXP firmware from armbian/nxp-firmware. by @igorpecovnik in armbian/build#10868kernel-debs: headers: depend on python3-minimal. by @iav in armbian/build#10846kickpi-k2b-v2: add KickPi K2B V2.2 DDR3 board (DDR3 u-boot defconfig, DTS, WiFi watchdog). by @Novice-PG in armbian/build#10902main-config: cause error when lib.config is present. by @EvilOlaf in armbian/build#10876mainline: bump to 7.3-rc6. by @EvilOlaf in armbian/build#10914mangopi-mq: fix board configuration and clock handling. by @khaliforce in armbian/build#10908mangopi-mq: replace bundled boot firmware with source builds. by @khaliforce in armbian/build#10888meson-gxm-c400-plus: enable front panel display. by @jomadeto in armbian/build#10903meson64-6.12: rebase the old aiu HDMI codec patch onto 6.12.111+. by @iav in armbian/build#10898meson64-7.2: fix due to upstream changes broken patch. by @EvilOlaf in armbian/build#10890mkdocs: cache-bust extra_css with a version query. by @igorpecovnik in armbian/documentation#1506module_redis: opt-in cache mode (REDIS_MAXMEMORY). by @igorpecovnik in armbian/configng#1038module_tuning_profile: apply was undoing its own swappiness. by @igorpecovnik in armbian/configng#1039mvebu64: fetch TF-A from its GitHub mirror. by @igorpecovnik in armbian/build#10866network: abort static IP setup on dialog cancel instead of crashing netplan. by @xsalaices in armbian/configng#1040oci: configurable OCI storage and read-only OCI_PROXY. by @igorpecovnik in armbian/build#10860Odroidxu4 wifi adjustment. by @EvilOlaf in armbian/build#10875orangePi CM5 USB3 enhancement + exprimental mode. by @ECO1AI in armbian/build#10904pack-debian: publish the repository with Acquire-By-Hash. by @igorpecovnik in armbian/scripts#94patching: let a userpatch override the same-named core patch. by @iav in armbian/build#10884pkg_remove: use purge instead of autopurge to stop cascade removal. by @xsalaices in armbian/configng#1037Radxa Rock 2A/2F mainline. by @lukaszsobala in armbian/build#10852redirector: torrent check needs proof before reporting in sync. by @igorpecovnik in armbian/armbian.github.io#474redirector: verify mirror sync by file-probe, not directory mirroring. by @igorpecovnik in armbian/armbian.github.io#471repo management: adopt the production (singlemode) repo.sh into main. by @igorpecovnik in armbian/build#10304repo: publish with Acquire-By-Hash. by @igorpecovnik in armbian/build#10911repository update: publish stable only every STABLE_REPOSITORY_UPDATE days. by @igorpecovnik in armbian/armbian.github.io#472repository update: use repo.sh from build main. by @igorpecovnik in armbian/armbian.github.io#473rockchip64-7.2: media: rkvdec: Add VP9 support for VDPU381 variant (v1). by @rpardini in armbian/build#10874rockchip64: 7.3: helios64: Wake-on-LAN through the PHY. by @iav in armbian/build#10865rockchip64: copy the RK3562 patch set from 7.2 to 7.3. by @retro98boy in armbian/build#10863rockchip: rk3506: fix RockUSB full-speed enumeration data abort. by @stevenjoezhang in armbian/build#10833runner-clean: export the runner's oci_cache as OCI_PROXY. by @igorpecovnik in armbian/actions#43runner-cleanup: keep build-cache service images. by @igorpecovnik in armbian/configng#1048runner-cleanup: never wipe _work of a runner with a live job. by @igorpecovnik in armbian/configng#1050software: add registry-cache, a read-only cache of ghcr.io. by @igorpecovnik in armbian/configng#1044software: explain how to install an app. by @igorpecovnik in armbian/documentation#1504software: stop offering Watchtower install, keep Disable. by @xsalaices in armbian/configng#1041sophgo-sg200x-aic8800: fetch the driver only when the kernel builds. by @igorpecovnik in armbian/build#10847sophgo-sg200x-aic8800: keep the 7.3 RoC cookie in the RoC element. by @lukaszsobala in armbian/build#10854sun60iw2: fix GPU userspace install ELOOP on headless builds. by @ijiki16 in armbian/build#10882sun60iw2: GPU, desktop and hardware video decode for Orange Pi 4 Pro. by @ijiki16 in armbian/build#10835sun60iw2: keep the Dirty Frag mitigation over the Armbian default. by @igorpecovnik in armbian/build#10912sun60iw2: kernel config: modulize drivers, add wireguard, mitigate dirty frag. by @EvilOlaf in armbian/build#10871sunxi-7.2: drop patch upstreamed with v7.2.9. by @EvilOlaf in armbian/build#10889sunxi: add Maxio MAE0621 PHY driver (KickPi K2B V2.2 DDR3 ethernet fix). by @Novice-PG in armbian/build#10894sunxi: recore: add device trees for Recore A5-A8. by @eliasbakken in armbian/build#10850sunxi: recore: update U-Boot and put BL31 in DRAM. by @eliasbakken in armbian/build#10853tests: skip stable switch on forky, disable redis and portainer tests. by @igorpecovnik in armbian/configng#1051u-boot: report SPL/TPL size against CONFIG_*_MAX_SIZE. by @igorpecovnik in armbian/build#10858uefi-x86-6.18: rebase i915 4-lane quirk patch for 6.18.55. by @igorpecovnik in armbian/build#10891View the full article]]></description><pubDate>Tue, 06 Oct 2026 12:59:29 +0000</pubDate></item><item><title>[CNX-Software] - XIMEA MU003TG-SY-UC &#x2013; A miniature, modular 0.3MP USB 3.0 ToF Sensor based on Sony IMX556</title><link><![CDATA[https://testforum.armbian.com/topic/62442-cnx-software-ximea-mu003tg-sy-uc-a-miniature-modular-03mp-usb-30-tof-sensor-based-on-sony-imx556/?do=findComment&comment=243597]]></link><description>The XIMEA MU003TG-SY-UC is a miniature industrial Time-of-Flight (ToF) camera with a 0.3MP Sony IMX556 CMOS sensor, global shutter, 640 &#xD7; 480 resolution, and a 60 FPS frame rate. Its compact 26.4 &#xD7; 26.4 &#xD7; 28.67 mm enclosure and 31-gram weight make it suitable for space-limited embedded vision systems, robotics, UAVs, kiosks, 3D scanning, face recognition, and other machine-vision applications. The module uses a USB 3.2 Gen 1 interface through a 14-pin I-PEX Cabline SS connector for data, power, and control. A separate 10-pin Cabline V connector provides synchronization with external VCSEL illumination. The camera does not include an illumination source or optical band-pass filter, so these components must be provided separately for depth sensing. XIMEA MU003TG-SY-UC specifications: Sensor &#x2013; Sony IMX556 CMOS Time-of-Flight sensor, global shutter, no on-sensor filter Resolution &#x2013; 0.3 megapixels (640 &#xD7; 480); active area 6.4 &#xD7; 4.8 mm Pixel Size &#x2013; 10 &#xB5;m x 10 [...] 
The post XIMEA MU003TG-SY-UC &#x2013; A miniature, modular 0.3MP USB 3.0 ToF Sensor based on Sony IMX556 appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Tue, 06 Oct 2026 09:00:22 +0000</pubDate></item><item><title>[CNX-Software] - Save $70 on GEEKOM A5 Pro 2026 Edition mini PC during Prime Day Sale (Sponsored)</title><link><![CDATA[https://testforum.armbian.com/topic/62443-cnx-software-save-70-on-geekom-a5-pro-2026-edition-mini-pc-during-prime-day-sale-sponsored/?do=findComment&comment=243598]]></link><description>The GEEKOM A5 Pro 2026 Edition is a pocket-sized 0.47L mini PC available at a $70 discount for the company&#x2019;s Prime Day Sale until October 7. Powered by the 6-core Ryzen 5 7530U (up to 4.5GHz), it handles browsing, documents, video calls, and AI-agent tasks such as drafting, summarizing, and planning with ease. Dual HDMI 2.0 and dual USB-C ports support up to four displays (or one 8K display), enabling efficient multi-window workflows. Meanwhile, dual SO-DIMM slots (up to 64GB) and dual M.2 slots (up to 5TB total) provide plenty of room for future upgrades. With 2.5GbE, Wi-Fi 6E, six USB ports, an SD card reader, and VESA mounting support, along with an aluminum body that has passed 339 reliability tests, the A5 Pro is a quiet, clutter-free desktop companion for offices and home workspaces running Windows 11 Pro or Linux. Backed by GEEKOM&#x2019;s 3-year warranty, the A5 Pro is [...] 
The post Save $70 on GEEKOM A5 Pro 2026 Edition mini PC during Prime Day Sale (Sponsored) appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Tue, 06 Oct 2026 01:00:26 +0000</pubDate></item><item><title>wlan configuration - SSID containing a backslash does not work</title><link><![CDATA[https://testforum.armbian.com/topic/62394-wlan-configuration-ssid-containing-a-backslash-does-not-work/?do=findComment&comment=243501]]></link><description>For many Years I was using a wlan SSID containing a backslash with no problems. 
	While trying the current Armbian_community_26.11.0-trunk.62_Bananapim2plus_trixie_current_6.18.54_minimal.img.xz the network wlan0 would not connect.
 


	Connecting to the guest wlan of the same router worked.
 


	I could trace it to the backslash in the SSID which "netplan try" complained about.
 


	Escaping that with a additional backslash made "netplan try" accept it, but the connection did not work, the interface wlan0 remained in status "state DOWN".
 


	Changing the SSID (removing that single backslash) made it working.
 


	I did not find something that prohibits the backslash used in the name of the SSID, so I'm unsure.</description><pubDate>Mon, 05 Oct 2026 18:43:11 +0000</pubDate></item><item><title>[CNX-Software] - DEBIX M8391-01 industrial SBC features MediaTek Genio 720 SoC with 9 TOPS NPU, dual-display support</title><link><![CDATA[https://testforum.armbian.com/topic/62444-cnx-software-debix-m8391-01-industrial-sbc-features-mediatek-genio-720-soc-with-9-tops-npu-dual-display-support/?do=findComment&comment=243599]]></link><description>The DEBIX M8391-01 is a compact industrial SBC built around the MediaTek MT8391 (Genio 720) processor, designed for edge AI, computer vision, robotics, and intelligent IoT applications. The SoC&#x2019;s 9-TOPS NPU enables local AI inference without relying on cloud processing. The board features up to 16GB LPDDR4 memory and up to 64GB eMMC storage, with M.2 PCIe 2.0 NVMe SSD and MicroSD card expansion. It also offers a 4-lane MIPI CSI camera input, MIPI DSI up to 2.5K and eDP 1.4 display interfaces, Gigabit Ethernet with PoE, Wi-Fi 6, Bluetooth 5.4, five USB ports, and a 40-pin expansion header. With an industrial operating temperature range (-40&#xB0;C to 85&#xB0;C), this credit card-sized, Raspberry Pi-inspired SBC can be used for edge AI vision, robotics, industrial IoT, and other embedded systems. DEBIX M8391-01 specifications: MediaTeck Genio 720 (MT8391) CPU Commercial-grade (default) &#x2013; 2x Arm Cortex-A78 cores @ up to 2.6 GHz, 6x Arm [...] 
The post DEBIX M8391-01 industrial SBC features MediaTek Genio 720 SoC with 9 TOPS NPU, dual-display support appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Mon, 05 Oct 2026 09:00:49 +0000</pubDate></item><item><title>Engineering paper: RapidOCR on Orange Pi Zero 3W A733/VIP9000 NPU</title><link><![CDATA[https://testforum.armbian.com/topic/62388-engineering-paper-rapidocr-on-orange-pi-zero-3w-a733vip9000-npu/?do=findComment&comment=243491]]></link><description>Hi everyone,
 


	I&#x2019;m sharing an engineering paper about getting a PP-OCRv6-based RapidOCR pipeline running on the Orange Pi Zero 3W&#x2019;s Allwinner A733 / Vivante VIP9000 NPU, integrated into Visual AI.
 


	Full paper: https://github.com/sog777/orange-pi-zero-3w-rapidocr-npu
 


	The tests used the Orange Pi Debian 12 Bookworm image and its vendor NPU stack, not Armbian. This is an engineering case study, not an Armbian support request or a claim that the same binaries work on an Armbian image.
 


	The paper covers the ONNX &#x2192; ACUITY &#x2192; NBG &#x2192; VIPLite conversion path, static model shapes, targeted convolution and LayerNorm graph rewrites, quantization, simulator-versus-hardware checks, and physical-board validation.
 


	The selected system remains hybrid: text detection and eligible recognition attempts run on the NPU, while canonical ONNX Runtime CPU recognition checks every crop and supplies the final text and confidence scores. Wide lines, orientation classification, preprocessing, and post-processing also use CPU execution.
 


	A repeated reference recognizer test passed 100 runs, with a median call of 13.36 ms. A CPU-verified 18-line page took approximately 1.64&#x2013;1.66 seconds, including 18 NPU recognition attempts and 18 CPU checks. These are different benchmark scopes; reference agreement does not establish perfect transcription, and no matched CPU-only speed advantage has been established.
 


	The paper also describes higher-resolution tiled detection and rejected full-NPU experiments. One candidate reduced aggregate CPU consumption by approximately 77.65%, but increased processing time by approximately 79.34% and regressed accuracy, so it was not promoted.
 


	I&#x2019;m posting this for SBC developers interested in the practical limits of accelerator conversion and validation. This is a paper-only publication, without commands, a source-code release, or model downloads. Feedback on the methodology is welcome.</description><pubDate>Mon, 05 Oct 2026 01:15:52 +0000</pubDate></item><item><title>[CNX-Software] - Geekworm UPS Scap 5V5A &#x2013; A supercapacitor UPS HAT for Raspberry Pi 5</title><link><![CDATA[https://testforum.armbian.com/topic/62445-cnx-software-geekworm-ups-scap-5v5a-a-supercapacitor-ups-hat-for-raspberry-pi-5/?do=findComment&comment=243600]]></link><description>Geekworm, in collaboration with Mcuzone, has launched the UPS Scap 5V5A, a new supercapacitor UPS HAT for the Raspberry Pi 5 designed to keep the Raspberry Pi running long enough (a few seconds to a few minutes) to save data and shut down safely, rather than provide hours of backup power. Available in 100F, 60F, and 22F versions, the HAT has a built-in PD chip that negotiates a true 5V/5A output. This gives the Raspberry Pi 5 enough power to run properly without triggering the low-voltage warnings that can happen with some power supplies. The module connects to the Raspberry Pi 5 through pogo pins to detect power loss and supports I2C for checking voltage and current in real time. It also features dual independent power inputs, so you can power it with either a wide-voltage DC barrel jack or a standard USB-C PD charger. Geekworm UPS Scap 5V5A supercapacitor [...] 
The post Geekworm UPS Scap 5V5A &#x2013; A supercapacitor UPS HAT for Raspberry Pi 5 appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Mon, 05 Oct 2026 00:00:22 +0000</pubDate></item><item><title>[CNX-Software] - ESP-SDR firmware turns ESP32 into a 2.4/5 GHz Software-Defined Radio (SDR)</title><link><![CDATA[https://testforum.armbian.com/topic/62446-cnx-software-esp-sdr-firmware-turns-esp32-into-a-245-ghz-software-defined-radio-sdr/?do=findComment&comment=243601]]></link><description>We have seen ESP32s used for everything from simple IoT devices to AI, audio, and vision projects. But while looking for a new project, I found out about ESP-SDR firmware, which turns the ESP32 into a native Software-Defined Radio (SDR) without additional hardware. This open-source firmware bypasses the ESP32&#x2019;s fixed-function Wi-Fi and Bluetooth modems and taps directly into the internal ADC signal chain to capture raw I/Q baseband samples. It then sends these samples to a computer over USB or UART, where they can be processed and viewed as a radio spectrum or waterfall display, turning supported ESP32 chips into low-cost software-defined radio receivers without requiring additional SDR hardware. Key features and supported hardware: Supported chips &#x2013; ESP32, ESP32-C3, ESP32-C5 (dual-band 2.4/5 GHz), ESP32-C6, ESP32-C61, ESP32-S2, ESP32-S3, and the preview ESP32-S31 Tuning range &#x2013; Nominally 2.4 GHz ISM (2.2&#x2013;2.7 GHz on some chips) and 5 GHz (4.8&#x2013;6.0 GHz on ESP32-C5); The [...] 
The post ESP-SDR firmware turns ESP32 into a 2.4/5 GHz Software-Defined Radio (SDR) appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Sun, 04 Oct 2026 03:00:42 +0000</pubDate></item><item><title>Jellyfin's bundled MPP silently drops ~30 % of a long 10-bit VP9 transcode on RK3588</title><link><![CDATA[https://testforum.armbian.com/topic/62373-jellyfins-bundled-mpp-silently-drops-~30-of-a-long-10-bit-vp9-transcode-on-rk3588/?do=findComment&comment=243455]]></link><description>Well Well, Who's The Asshole Now? Yeah I Need a Job... I'm not too bad.
 


	 
 


	Written for: the same readers as the finding, maintainers and users; the chart is built to be attached to it or to stand alone in a forum post.
 


	Ours versus theirs, same board, same 100-minute 4K 10-bit title, same afternoon, same kernel journal:
 


	 
 


	 
 


	frames out of 143,641decoder resetsspeed
 


	theirs, jellyfin-ffmpeg 8.1.3-1 with its bundled fork MPP100,13111,520~120 fps until it broke at 42:11
 


	ours, system ffmpeg &#x2192; rockchip-vaapi &#x2192; upstream-lineage MPP143,6410106 fps, intact to the end
 


	The chart shows it in one glance: nothing missing anywhere for either until minute 40, then orange bars at 50 to 60 percent loss for the remaining hour, green flat on zero the whole way. The speed difference is the honest cost of the guard, one decode task at a time instead of two, and it's the throughput the revert was presumably chasing.
 


	Where everything is:
 


	claude-pi-handoffs/20261002/FINDING-jellyfin-mpp-vp9-10bit-frame-loss.md, now with the fourth row, the throughput note and the chart reference.
 


	ours-vs-theirs.png beside it, 1600&#xD7;900, ready to attach.
 


	after-gaps-sheet.png in the evidence folder if anyone asks what the surviving frames look like.
 


	The evidence folder holds every log, both journal counts, the gap analysis, the test scripts and the rating with three addenda.
 


	One disclosure kept in the document rather than buried: ours printed two MPP buffer-slot assertion lines at teardown, after the last frame, with no effect on output. Better that you say it than someone else finds it.
 


	The output file and the source title are still on the test board under ~/probe if you want to watch the freezes before posting. Nothing else is running; the package is complete.
 


	 
	NO SLOP!</description><pubDate>Sun, 04 Oct 2026 02:13:02 +0000</pubDate></item><item><title>ROCK 5B + Radxa Camera 4K (IMX415) at 4K@60 on the vendor-rk35xx kernel &#x2013; out-of-tree module</title><link><![CDATA[https://testforum.armbian.com/topic/62372-rock-5b-radxa-camera-4k-imx415-at-4k60-on-the-vendor-rk35xx-kernel-%E2%80%93-out-of-tree-module/?do=findComment&comment=243452]]></link><description>For the vendor-rk35xx kernel (6.1.115): an out-of-tree build of the vendor imx415 driver with a real 4K@60 mode, plus the overlay to bind it. 
	 
	https://github.com/bambooCZ/rk3588-imx415-4k60</description><pubDate>Sun, 04 Oct 2026 00:05:06 +0000</pubDate></item><item><title>OS update wiped all apps and data</title><link><![CDATA[https://testforum.armbian.com/topic/62369-os-update-wiped-all-apps-and-data/?do=findComment&comment=243445]]></link><description><![CDATA[Hello all,
 


	 
 


	earlier I booted up the board (Radxa Dragon Q8B) when it prompted to reboot &amp; update and I allowed it. The update took uncharacteristically long. The OS is running off an SD card. There is no SSD or eMMC installed.
 


	 
 


	Turns out it wiped the install clean. There was about 20 GB of free space prior to the update, now there's 46 GB.
 


	For some reason the user itself and the wifi login are still there, but everything in the home directory is gone. Installed applications and the driver for the wireless card are gone. Chrome add-ons are still there, but reset. The Downloads folder now has Armbian_26.8.1_Radxa-dragon-q8b_resolute_vendor_7.0.11_gnome_desktop.img.xz, which wasn't there before.
 


	 
 


	I didn't lose anything important, just 60 hrs of savegames and a godot project I don't really care about.
 


	 
 


	Could I stupidly have triggered this somehow? I've been running Armbian on three other boards and nothing like this happened on those. So if it's not my fault this might be a Q8B-specific problem.
 


	 
 


	Thanks for any input
 


	Kind regards
 


	 
 


	Edit1: Just noticed there's now another update requiring restart. Weird.
 


	Edit2: Alright, this one was pain free. I'm a bit paranoid now :,-)]]></description><pubDate>Sat, 03 Oct 2026 18:30:36 +0000</pubDate></item><item><title>[CNX-Software] - UUNA TEK iAuto review &#x2013; A professional handwriting and drawing machine</title><link><![CDATA[https://testforum.armbian.com/topic/62447-cnx-software-uuna-tek-iauto-review-a-professional-handwriting-and-drawing-machine/?do=findComment&comment=243602]]></link><description>Hello, today I am going to review the UUNA TEK iAuto, an automatic handwriting machine designed to reproduce physical handwriting using a real pen on real paper. It also supports wireless connectivity, spreadsheet-based mail merge, custom fonts, and font variation features that can make the writing look more natural. The machine can handle paper sizes up to A3 and supports pens with a diameter of up to 18 mm. The UUNA TEK iAuto works with the manufacturer&#x2019;s free iAuto software, which is available for Windows on both x64 and Arm-based systems, as well as for macOS on Apple M1, M2, M3, and Intel-based Macs. Most of the following review focuses on the machine&#x2019;s writing capabilities, including tests with text, SVG graphics, different writing speeds, various pens, and different paper types. Unboxing The parcel was shipped from China by land transportation and took around six days to arrive at my office [...] 
The post UUNA TEK iAuto review &#x2013; A professional handwriting and drawing machine appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Sat, 03 Oct 2026 03:00:36 +0000</pubDate></item><item><title>[Collabora] - Open Source in Prague: A week of talks, hands-on demos, and community!</title><link><![CDATA[https://testforum.armbian.com/topic/62361-collabora-open-source-in-prague-a-week-of-talks-hands-on-demos-and-community/?do=findComment&comment=243429]]></link><description>Next week we'll be in Prague for a packed Open Source week! We&#x2019;ll speak at the Linux Plumbers Conference and GStreamer Conference, and present two demos at the ELC Technical Showcase.
  View the full article</description><pubDate>Fri, 02 Oct 2026 21:01:33 +0000</pubDate></item><item><title>[CNX-Software] - UP Xtreme PTL Edge Air Panther Lake Mini PC gets AirJet solid-state active cooling solution</title><link><![CDATA[https://testforum.armbian.com/topic/62448-cnx-software-up-xtreme-ptl-edge-air-panther-lake-mini-pc-gets-airjet-solid-state-active-cooling-solution/?do=findComment&comment=243603]]></link><description>AAEON has introduced a new version of its UP Xtreme PTL Edge Panther Lake mini PC with the &#x201C;Air&#x201D; variant featuring Frore Systems AirJet solid-state active cooling solution. The company says the AirJet passive cooling technology makes the Panther Lake mini PC 35% thinner, 43% lighter, and capable of operating silently at under 21 dBA. This is mostly achieved by removing the thick (and heavy) heatsink found on the original design. The mini PC still benefits from up to an Intel Core Ultra X7 358H with 180 TOPS of AI performance, a 40-pin GPIO header, two RS-232/422/485 COM ports, and a wide 19 to 36V DC input range. UP Xtreme PTL Edge Air specifications: Intel Core Ultra Series 3 Panther Lake SoC (one or the other) Intel Core Ultra X7 Processor 358H CPU &#x2013; 16-core (4P + 8E + 4LPE) @ 1.9/1.5/1.5 GHz Base frequency, 4.8/3.5/3.5 GHz Turbo frequency Cache [...] 
The post UP Xtreme PTL Edge Air Panther Lake Mini PC gets AirJet solid-state active cooling solution appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Fri, 02 Oct 2026 09:00:53 +0000</pubDate></item><item><title>[CNX-Software] - Avaota F2 &#x2013; Allwinner V861 RISC-V SBC targets AI cameras with PTZ and audio support</title><link><![CDATA[https://testforum.armbian.com/topic/62449-cnx-software-avaota-f2-allwinner-v861-risc-v-sbc-targets-ai-cameras-with-ptz-and-audio-support/?do=findComment&comment=243604]]></link><description>Avaota F2 is the first SBC based on an Allwinner V861 dual-core 64-bit RISC-V SoC with 128MB on-chip DDR3 memory, support for 4K cameras, H.265 video codec, and a 1 TOPS AI accelerator. It&#x2019;s an update to the earlier Avaota F1 camera board based on an Allwinner V821 SoC. The new open-source hardware F2 SBC offers several benefits, including support for both Full HD and 4K camera sensors, motor control for the PTZ (Pan-Tilt-Zoom) feature, and improved audio support through speaker (one) and microphone (two) connectors. However, the F1 also included WiFi, which the Avaota F2 lacks. Avaota F2 specifications: SoC &#x2013; Allwinner V861M2-XXX CPU Dual-Core RISC-V XuanTie C907 (RV64GCBV/RV32GGCBV) clocked up to 1.4GHz with RVV 1.0 extensions Single-core RISC-V XuanTie E907 (RV32IMAFC) clocked up to 800MHz VPU Video Encoder H.264/H.265 up to  4K @ 25fps (M)JPEG up to 8192&#xD7;8192 Video Decoder &#x2013; (M)JPEG up to 1080p60 AI accelerator &#x2013; [...] 
The post Avaota F2 &#x2013; Allwinner V861 RISC-V SBC targets AI cameras with PTZ and audio support appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Fri, 02 Oct 2026 02:00:37 +0000</pubDate></item><item><title>[CNX-Software] - ASRock Industrial NUC 300 series &#x2013; Intel Core 3 304/Core 5 320 mini PCs and motherboards</title><link><![CDATA[https://testforum.armbian.com/topic/62450-cnx-software-asrock-industrial-nuc-300-series-intel-core-3-304core-5-320-mini-pcs-and-motherboards/?do=findComment&comment=243605]]></link><description>ASRock Industrial has introduced the NUC Core 300 BOX series of mini PCs and the NUC Core 300 motherboards built around Intel Core Series 3 Wildcat Lake-U processors. The lineup includes the NUC BOX-320, with the Intel Core 5 320 SoC, and the NUC BOX-304, which uses the Core 3 304 SoC. The company also offers the NUC-320 and NUC-304 as standalone motherboards for custom systems. The systems support up to 64GB DDR5-6400 with In-Band ECC, dual M.2 PCIe Gen4 storage, dual 2.5GbE, Wi-Fi 6E, Bluetooth 5.3, triple-display output, USB 3.2 connectivity, and 12&#x2013;24V DC input. These features make them suitable for industrial PCs, edge computing systems, and other embedded applications. ASRock NUC Core 300 series specifications: Wildcat Lake SoC Intel Core 3 304 (NUC BOX-304, NUC-304) 5-core CPU &#x2013; 1x P-cores @ 1.5/4.3 GHz (Turbo) + 4x LPE-cores @ 1.4/3.3 GHz (Turbo) GPU &#x2013; 1-core Intel Xe3 Graphics @ [...] 
The post ASRock Industrial NUC 300 series &#x2013; Intel Core 3 304/Core 5 320 mini PCs and motherboards appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Fri, 02 Oct 2026 00:00:32 +0000</pubDate></item><item><title>How to build uboot with custom config file</title><link><![CDATA[https://testforum.armbian.com/topic/62351-how-to-build-uboot-with-custom-config-file/?do=findComment&comment=243403]]></link><description>Hi everybody
 


	With freshly installed armbian (commit id: d9fb61be0) I created a new uboot config file:
 


	 
 


	./compile.sh uboot-config BOARD=orangepizeroplus BRANCH=current SHARE_LOG=yes
 


	 
 


	This creates the file: ./output/defconfig-uboot-orangepizeroplus-current
 


	But the command:
 


	 
 


	./compile.sh uboot BOARD=orangepizeroplus BRANCH=current SHARE_LOG=yes
 


	 
 


	does not compile uboot, it just touches ./output/debs/linux-u-boot-orangepizeroplus-current_26.11.0-trunk_arm64__2026.07-*.deb file.
 


	 
 


	Do I miss something?
 


	Do I have to copy the file ./output/defconfig-uboot-orangepizeroplus-current to a place in ./userpatches?
 


	 
 


	Thanks in advance,
 


	Hackbeere
 

log-uboot-config-f8ff6bc1-9053-44de-932f-fc933aa65f54.log 
log-uboot-289bad48-a6fa-43df-9b92-ac809bac3c2d.log</description><pubDate>Thu, 01 Oct 2026 16:36:32 +0000</pubDate></item><item><title>[CNX-Software] - LakeShark firmware turns LilyGO T-Display P4 into a handheld ESP32-P4 SDR scanner</title><link><![CDATA[https://testforum.armbian.com/topic/62451-cnx-software-lakeshark-firmware-turns-lilygo-t-display-p4-into-a-handheld-esp32-p4-sdr-scanner/?do=findComment&comment=243606]]></link><description>LakeShark is open-source firmware by Samuel Reynolds (SAMS0N1TE) that turns the ESP32-P4-based LilyGO T-Display P4 into a handheld SDR scanner. Paired with an RTL-SDR Blog V3 or V4 dongle, it supports P25 Phase I trunking, analog FM/AM, POCSAG pager decoding, and 1090 MHz ADS-B reception directly on the ESP32-P4, without a PC, Raspberry Pi, or smartphone. It also includes an onboard SX1262 that supports LoRa and MeshCore applications. SDR devices like LimeSDR Micro, xSDR, UUGear&#x2019;s VU GPSDR, and many others usually rely on a PC, Raspberry Pi, or smartphone for processing, but LakeShark shows that a powerful microcontroller can also handle many SDR tasks. We previously covered the LilyGO T-Display P4 in March 2026, and LakeShark makes good use of its built-in hardware, including the SX1262 for LoRa and MeshCore applications, L76K GPS receiver for location tracking and offline maps, and ESP32-C6 for Wi-Fi and Bluetooth connectivity. LakeShark hardware requirements: Primary [...] 
The post LakeShark firmware turns LilyGO T-Display P4 into a handheld ESP32-P4 SDR scanner appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Thu, 01 Oct 2026 09:00:28 +0000</pubDate></item><item><title>v26.11 on Orange Pi PC Plus fails to boot from eMMC.</title><link><![CDATA[https://testforum.armbian.com/topic/62346-v2611-on-orange-pi-pc-plus-fails-to-boot-from-emmc/?do=findComment&comment=243395]]></link><description>The system v26.11 rolling for Orange Pi PC Plus running Armbian Linux 6.18.53-current-sunxi cannot boot from eMMC on the Orange Pi PC Plus. The bootloader is looking for an old partition on /dev/mmcblk0p1, whereas the current partition of emmc is identified differently - as /dev/mmcblk2p1. 
	Therefore, it is necessary to use a bootloader from an SD card, which specifies the path to the eMMC partition for subsequent operation.</description><pubDate>Thu, 01 Oct 2026 08:03:34 +0000</pubDate></item><item><title>[CNX-Software] - $30 Raspberry Pi Smart Display Module for CM5 targets digital signage displays and kiosks</title><link><![CDATA[https://testforum.armbian.com/topic/62452-cnx-software-30-raspberry-pi-smart-display-module-for-cm5-targets-digital-signage-displays-and-kiosks/?do=findComment&comment=243607]]></link><description>Raspberry Pi Smart Display Module is a CM5 carrier board compatible with the Intel Smart Display Module (SDM) specification, more specifically the SDM-L form factor (as opposed to the smaller SDM-S option). The Intel SDM standard has been around for years, and we first wrote it in 2018, covering the Axiomtek SDM300s (SDM-S) module. These cards are designed to be plugged into compatible digital signage displays, kiosks, point-of-sale systems, and so on. They feature a standard 98-pin PCIe edge connector with USB 3.0, HDMI 1.4/2.0, I2C/UART/SPI signalling, as well as Ethernet, HDMI, USB ports, and an M.2 expansion socket. Raspberry Pi Smart Display Module specifications: Compatible with Raspberry Pi Compute Module 5 Video Output &#x2013; Full-size HDMI 2.0 port Camera &#x2013; 22-way MIPI DSI/CSI-2 connector (internal) Networking Gigabit Ethernet RJ45 port WiFi 5 and Bluetooth 5.2 (on CM5) with U.FL antenna USB USB 3.0 Type-A port USB 2.0 Type-C port for programming [...] 
The post $30 Raspberry Pi Smart Display Module for CM5 targets digital signage displays and kiosks appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Thu, 01 Oct 2026 00:00:53 +0000</pubDate></item><item><title>[News from Armbian] - Armbian Newsletter September 2026</title><link><![CDATA[https://testforum.armbian.com/topic/62342-news-from-armbian-armbian-newsletter-september-2026/?do=findComment&comment=243387]]></link><description>Welcome to the latest Armbian Newsletter: your source for the latest developments, community highlights, and behind-the-scenes updates from the world of open-source ARM and RISC-V computing.  JetHome boosts Armbian CIJetHome (Shenzhen JetHome Technology Co.) donated a build server for Armbian. The server compiles Armbian images, kernels and U-Boot packages. Thank you, JetHome. HW Specifications CPU 2 &#xD7; Intel Xeon Gold 6148, 80 threads Memory 384 GB Storage 3.84 TB SSD, plus 20 TB of disk Network 2 &#xD7; 1Sponsored Github HighlightsThis week&#x2019;s work centers on Rockchip platform maturation, kernel and toolchain modernization, and board-level enablement across vendors. Rockchip received the largest share of attention, with RK3528 gaining a thermal driver, cooling-map refinements, and cleanup of legacy PCIe and pmdomain workarounds. The Radxa E24C now stores its U-Booting every board, every nightArmbian builds for hundreds of boards. A kernel bump that is clean on one SoC can leave another unbootable and no build log will tell you. So there is a rack, and the rack boots them. Compiling is not evidence. A kernel that builds, packages that install, an image thatMali GPU with LiteRT-LMRunning Gemma 4 E2B on a Mali GPU with LiteRT-LM This guide should work on any armbian minimal/console (trixie) system with a working Mali-g610 GPU. DO NOT USE DESKTOP Verified on: Orange Pi 5 Max (Rockchip RK3588, Arm Mali-G610 MC4), Armbian/Debian 13 (trixie), aarch64, 8View the full article</description><pubDate>Wed, 30 Sep 2026 18:40:54 +0000</pubDate></item><item><title>[Armbian newsletter] - Armbian Newsletter September 2026</title><link><![CDATA[https://testforum.armbian.com/topic/62340-armbian-newsletter-armbian-newsletter-september-2026/?do=findComment&comment=243385]]></link><description>Welcome to the latest Armbian Newsletter: your source for the latest developments, community highlights, and behind-the-scenes updates from the world of open-source ARM and RISC-V computing.  JetHome boosts Armbian CIJetHome (Shenzhen JetHome Technology Co.) donated a build server for Armbian. The server compiles Armbian images, kernels and U-Boot packages. Thank you, JetHome. HW Specifications CPU 2 &#xD7; Intel Xeon Gold 6148, 80 threads Memory 384 GB Storage 3.84 TB SSD, plus 20 TB of disk Network 2 &#xD7; 1Sponsored Github HighlightsThis week&#x2019;s work centers on Rockchip platform maturation, kernel and toolchain modernization, and board-level enablement across vendors. Rockchip received the largest share of attention, with RK3528 gaining a thermal driver, cooling-map refinements, and cleanup of legacy PCIe and pmdomain workarounds. The Radxa E24C now stores its U-Booting every board, every nightArmbian builds for hundreds of boards. A kernel bump that is clean on one SoC can leave another unbootable and no build log will tell you. So there is a rack, and the rack boots them. Compiling is not evidence. A kernel that builds, packages that install, an image thatMali GPU with LiteRT-LMRunning Gemma 4 E2B on a Mali GPU with LiteRT-LM This guide should work on any armbian minimal/console (trixie) system with a working Mali-g610 GPU. DO NOT USE DESKTOP Verified on: Orange Pi 5 Max (Rockchip RK3588, Arm Mali-G610 MC4), Armbian/Debian 13 (trixie), aarch64, 8View the full article</description><pubDate>Wed, 30 Sep 2026 18:40:54 +0000</pubDate></item><item><title>The password input field appears briefly and immediately disappears again.</title><link><![CDATA[https://testforum.armbian.com/topic/62339-the-password-input-field-appears-briefly-and-immediately-disappears-again/?do=findComment&comment=243384]]></link><description>Hello, 
	 
	i've installed the latest vendor version for Radxa ROCK 5 ITX. 
	 
 


	When I want to change settings, the password entry pop-up appears briefly and immediately disappears again, preventing the settings from being saved.
 


	I performed a completely fresh installation of the computer, and the problem still occurs. What is causing this? 
	 
	Any help would be appreciated. 
	 
	Best regards 
	Albrecht</description><pubDate>Wed, 30 Sep 2026 18:30:27 +0000</pubDate></item><item><title>[News from Armbian] - Booting every board, every night</title><link><![CDATA[https://testforum.armbian.com/topic/62343-news-from-armbian-booting-every-board-every-night/?do=findComment&comment=243388]]></link><description>Armbian builds for hundreds of boards. A kernel bump that is clean on one SoC can leave another unbootable and no build log will tell you. So there is a rack, and the rack boots them. Compiling is not evidence. A kernel that builds, packages that install, an image that flashes &#x2014; none of it proves a board comes back after reboot. Armbian supports a very large number of boards across a dozen vendors and twenty SoC families, maintained largely by volunteers who each own one or two of them. The failure mode that hurts is not a broken build. It is a change that builds perfectly and quietly bricks the boot path on hardware nobody happened to have on their desk that week. The automated test facility exists to close that gap. It is a rack of real boards, wired for remote power, that installs what Armbian published and then tries to use it: upgrade, switch kernel branches, reboot repeatedly, measure, report. What follows is what it does today, the hardware it takes to run, where AI fits into maintaining the stack around it, and the change we want to make next: moving hardware validation from nightly builds to pull requests. What is in the rackFleet composition, as recorded in inventory 65 Boards under test 62 Distinct models 22 Vendors 20 SoC families The boards are the point, and the spread is deliberate. Rockchip, Amlogic, Allwinner, NXP, Marvell, Broadcom, TI, Samsung, Qualcomm, SpacemiT and x86 are all represented, because that is where the differences live; a change to a shared kernel config lands differently on rockchip64 than on meson64, and only one of them will tell you so. Vendors currently on the bench include Radxa, FriendlyELEC, Khadas, Orange Pi, Banana Pi, Odroid, Raspberry Pi, Pine64, SolidRun, Mekotronics, Kobol, Cubietech, Udoo, Inovato and Arduino. Of the 65, 56 are active and 9 are in a failed state at the moment article was done boards that need a hand in the rack. That number is itself a signal: a board that has stopped answering is a board that stopped being able to report, which is usually more interesting than a test that merely failed. Every board is registered in NetBox, which is the source of truth for the whole system. Not just an asset list the orchestrator reads it to decide what a board can be tested with. Power is derived from cabling topology rather than a field someone typed: a board's power port is cabled to an outlet on a controller device, and the controller carries the driver. If the cable is not in the model, the board is treated as having no managed power, and the tests that need a hard power cut are skipped rather than faked. The hardware it takesPer bench, and the shared infrastructure behind it The cost of adding a board is not the board. It is the wiring around it. Each bench needs some subset of the following, and which subset a board has determines which tests it is eligible for. Remote power Required  A way to cut and restore power without a human. Three backends are in use: PoE switch ports for anything powered over Ethernet, a switched rack PDU for mains devices, and a 24-channel relay board driven over GPIO for DC-barrel and USB-powered boards. Without this there is no cold-boot test, only a soft reboot which is exactly the case that tends to pass while the real one fails.  Network Required  Wired Ethernet on a managed switch. This is the control channel (the harness drives boards over SSH), the measurement channel for throughput tests, and on PoE benches, the power channel too. A board that only has Wi-Fi is testable but much harder to recover.  Power metering Strongly recommended  PoE ports meter per-port draw, so the harness samples watts throughout a run. This is how you tell a board that genuinely rebooted from one whose SoC never stopped executing the power trace is flat across what was supposed to be a power cycle.  Serial console Recommended  USB-to-TTL adapters on a powered hub, exposed over the network as named consoles. Without one, a board that fails to boot tells you nothing at all: you get silence and have to guess. Several boards in the rack currently lack one, and every hang on those is an investigation that stalls at "it does not come back".  Clean-flash path Not yet wired  An SD-card switcher that presents the card to a flasher host or to the board, or USB access for vendor recovery modes. This is what makes a board recoverable from software that does not boot. The framework supports it; no bench in the rack is currently wired for it, which is the single biggest constraint on what comes next. Behind the benches sits the shared infrastructure, the part people underestimate when they picture "a few boards on a shelf": Switching. Three core switches and four access switches, several of them PoE, which do double duty as the fleet's power controllers. Between them they carry the control network, the test traffic and the power for a large fraction of the boards. This is no longer just a 1 GbE network: newer boards increasingly come with 2.5 GbE, while the uplinks and core need 10 GbE to aggregate traffic from many boards running tests in parallel. Without that headroom, the lab network itself becomes the bottleneck and network-performance results stop measuring the board under test.Power delivery. A switched rack PDU, multi-channel DC supplies, multiple 16-way USB supply, switched power strips, and a UPS in front of all of it because a lab that loses power mid-write is a lab that corrupts SD cards.Console and out-of-band. Dedicated console hosts, including a KVM device for the machines that need screen-level access.Compute. Six servers in the same site, including two Ampere-class ARM machines, running the CI runners that execute the build and test jobs and the services the fleet depends on.All of it is scripted. Each class of hardware has a small command-line tool with the same shape &#x2014; status, on, off, powercycle so the harness does not care whether a board is switched by a PoE port, a PDU outlet or a relay channel. It resolves the path from the inventory model and calls whichever tool matches. What a nightly run doesThe cycle, end to end The fleet does not stay powered. A full cycle brings it up, tests it, and puts it back to sleep. The last step runs even when everything before it failed. Power on The fleet is brought up from the PDU and the boards are given several minutes to boot.Scan and reconcile Every board is probed and the inventory updated: what version it is running, what kernel, when it was last seen. Drift between the model and reality is recorded rather than assumed away.Sync maintainer keys Board maintainers' SSH keys are pushed to the boards they own, so the person responsible for a board can log into the actual unit that failed.Run the board pipeline A matrix job per board, in parallel across the runners. This is the part below.Scan again Post-test state is captured; what the run left behind, not just what it reported.Power off Always, including after a failure. A rack left powered on a failed run is a rack that cooks.Inside step four, each board runs the same pipeline. It upgrades to the nightly repository, reboots, and then walks every kernel branch that board is configured to test: 

StepWhat it doesupgradePoint at the nightly repository and install what is currently published.rebootVerify that the board comes back with what it already had installed.For each branchRepeat the steps below for each kernel branch (current, edge, &#x2026;).&#x21B3; kernel-switchInstall that branch's kernel and verify that it is fully configured.&#x21B3; rebootPerform warm reboots, followed by a cold power cycle where switched power is available.&#x21B3; hw-performanceTest CPU, memory, disk and temperature.&#x21B3; dvfsVerify that the governor actually reaches the frequencies it claims.&#x21B3; network-iperfMeasure throughput on each cabled network interface.&#x21B3; store-versionsRecord exactly what is installed and running.restore-stablePut the board back the way it was found.

Two details in there carry more weight than they look. The reboot module does warm reboots followed by a cold power cycle, because those fail differently: a board can survive reboot indefinitely and still not come back from a real power cut. Testing both is the only way to catch both failure modes. And kernel-switch verifies that the package is genuinely configured rather than trusting an exit code, because the interesting failures can leave a kernel half-installed while every command reports success. What the results look like Current results are published publicly at docs.armbian.com/status/board-tests, refreshed as runs complete. What it actually catchesHere are few examples from recent runs. Reboots that hang on both kernelsOne board fails every reboot attempt on both of its kernel branches. The power trace shows the draw holding steady through what should have been a restart &#x2014; the SoC never stopped executing. That points at firmware rather than the kernel, but the issue remains unresolved. It is also a good example of the console gap: that bench has no serial console, so the investigation is relying on power measurements and inference instead of a boot log. A test that was wrong about x86The frequency-scaling check assumed that a governor under load should reach at least 95% of the maximum advertised frequency. That works for ARM cpufreq, but not for Intel and AMD, where the driver manages turbo behaviour itself and the advertised maximum is not a promise. Every x86 board was therefore failing a test that was itself wrong. The test was fixed by detecting the driver and applying the check only where it makes sense. Telling a broken board from a broken runnerSelf-hosted runners occasionally drop mid-job: the test finishes green, then the job dies later and the run is marked failed. Retrying everything would be wrong. A board pipeline power-cycles hardware and takes about half an hour, so retrying a genuine failure wastes rack time and keeps cycling a board that may already be unwell. The retry logic therefore re-runs only jobs whose test step did not fail. A real hardware or test failure stays red rather than being hidden by an automatic retry. Where AI fitsAnd where it explicitly does not A large share of the tooling described here &#x2014; the test modules, hardware control scripts, inventory reconciliation and documentation &#x2014; is now written and maintained with AI assistance. That is worth being plain about, including the parts that go wrong. What AI is genuinely good at is shortening the distance from symptom to candidate explanation. A board fails; there is a transcript, a package state, a power trace, a kernel version and forty thousand lines of shell across several repositories. Correlating those quickly, proposing a mechanism and drafting a patch is work that used to take an evening and can now take a few minutes. What it is bad at is knowing when it is wrong. In the course of this work, an analysis confidently concluded that a particular board had never appeared in the test results. The conclusion came from a sample that covered about three-quarters of the archive and happened to miss both of that board's records. The reasoning was sound; the evidence was partial; nothing in the output said so. The pointAI shortens the distance from symptom to patch. It does not shorten the distance from patch to proof. Those are different problems, and only one of them has been made easier. That is precisely why the rack matters more now, not less. If proposing changes gets cheaper while validating them does not, the amount of unverified change grows faster than our ability to verify it. And the most dangerous bugs here are exactly the ones that compile cleanly, install without error, and fail only when a specific board is asked to come back from a power cut. A machine that is confidently wrong is a fine collaborator as long as something downstream can check it. Sixty-five boards that will actually try to boot are that something. So the working rule is simple: AI is free to propose anything, but nothing reaches a board on its say-so. Hardware evidence is the gate, and every conclusion that matters is expected to point at a run, a trace or a package state rather than an argument. What is next: validation at pull-request timeThe change we want to make Today the facility validates nightly builds. Whatever was published overnight gets installed on real hardware and exercised. That is genuinely useful, and it is how the bugs above were found, but it is validation after the fact. By the time a board fails, the change is already in the nightly repository and, depending on timing, already on users' machines. The goal is to move that gate earlier: a pull request that touches a board family gets that family's boards booted before it merges. Not the whole rack for every PR, just the boards the change can actually reach. Several things have to be true first, and they are worth stating honestly rather than as a roadmap of solved problems. SelectionA diff has to map to boards. A change to a board configuration file implicates that board; a change to a kernel family implicates every board in it; a change to the packaging code implicates everything. Select too broadly and every PR occupies the entire rack for half an hour. Select too narrowly and the one board that would have caught the regression never gets tested. ArtifactsA PR build currently proves a compile. Hardware testing needs installable packages the rack can pull and install exactly as a user would, which means PR builds must publish to an isolated repository the fleet can reach. Our current build machinery is already stretched by existing CI and release workloads. Making hardware testing part of routine PR validation will require additional build capacity, storage and package-publishing infrastructure. Time budgetA full board pipeline takes around thirty minutes. That is acceptable overnight and much too slow as a merge gate, particularly when a nightly cycle already has the rack. This needs a short profile for PRs: install, switch kernel, reboot warm and cold, and confirm it is running what was installed. Performance and throughput work can stay in the nightly run. It also needs real contention handling, so a PR does not simply queue behind a fleet cycle. RecoveryThis is the hard one, and it is a hardware problem rather than a software one. Testing unmerged code means occasionally installing a kernel that does not boot. Right now every bench in the rack is tested in place; there is no remote path to reflash a board whose boot is broken. A board that a bad PR bricks is a board that stays bricked until somebody walks to the rack. So PR-stage testing starts on benches that can be recovered remotely: SD-card switchers for boards that boot from removable media, and vendor recovery modes over USB for those that support it. Wiring that up across the fleet is the prerequisite that gates everything else, and it is where the next round of hardware effort goes. Boards that cannot be recovered remotely stay on nightly testing, where a failure is an inconvenience instead of a dead unit. Signal qualityA merge gate that fails for reasons unrelated to the change is worse than no gate: it trains people to ignore it. The distinction between a board failure and a broken bench, already important for nightly runs, becomes critical the moment a red result blocks a merge. HelpingInfrastructure, capacity, partnerships There are three practical ways to move this forward. Bench infrastructure. Remote recovery is the immediate blocker for PR-stage testing, particularly SD-card switchers and the wiring around them. The network also needs to grow with the hardware being tested: managed PoE switches with 2.5 GbE access ports and 10 GbE uplinks, plus PoE splitters for boards that cannot be powered directly over Ethernet. These are not just infrastructure upgrades; they expand what can be tested, measured and recovered without somebody standing in front of the rack. Build capacity. PR-stage hardware testing needs PR builds, and build queue time is already a constraint on how quickly a fix reaches hardware. More build capacity, storage and package-publishing infrastructure are needed to move validation from nightly runs into the pull-request workflow. If you can host a build server, the requirements are documented, and the current fleet is listed on the build machinery page. Hardware partnerships. For vendors, the facility provides a way to keep hardware under continuous validation rather than testing it once around release. Devices covered by support and maintenance agreements can become part of the permanent test fleet, where kernel updates, upgrades, reboots, networking and other regressions are exercised on real hardware as Armbian evolves. The value is not the board itself; it is keeping that board working over its supported lifetime. View the full article</description><pubDate>Wed, 30 Sep 2026 18:29:14 +0000</pubDate></item><item><title>[Armbian newsletter] - Booting every board, every night</title><link><![CDATA[https://testforum.armbian.com/topic/62341-armbian-newsletter-booting-every-board-every-night/?do=findComment&comment=243386]]></link><description>Armbian builds for hundreds of boards. A kernel bump that is clean on one SoC can leave another unbootable and no build log will tell you. So there is a rack, and the rack boots them. Compiling is not evidence. A kernel that builds, packages that install, an image that flashes &#x2014; none of it proves a board comes back after reboot. Armbian supports a very large number of boards across a dozen vendors and twenty SoC families, maintained largely by volunteers who each own one or two of them. The failure mode that hurts is not a broken build. It is a change that builds perfectly and quietly bricks the boot path on hardware nobody happened to have on their desk that week. The automated test facility exists to close that gap. It is a rack of real boards, wired for remote power, that installs what Armbian published and then tries to use it: upgrade, switch kernel branches, reboot repeatedly, measure, report. What follows is what it does today, the hardware it takes to run, where AI fits into maintaining the stack around it, and the change we want to make next: moving hardware validation from nightly builds to pull requests. What is in the rackFleet composition, as recorded in inventory 65 Boards under test 62 Distinct models 22 Vendors 20 SoC families The boards are the point, and the spread is deliberate. Rockchip, Amlogic, Allwinner, NXP, Marvell, Broadcom, TI, Samsung, Qualcomm, SpacemiT and x86 are all represented, because that is where the differences live; a change to a shared kernel config lands differently on rockchip64 than on meson64, and only one of them will tell you so. Vendors currently on the bench include Radxa, FriendlyELEC, Khadas, Orange Pi, Banana Pi, Odroid, Raspberry Pi, Pine64, SolidRun, Mekotronics, Kobol, Cubietech, Udoo, Inovato and Arduino. Of the 65, 56 are active and 9 are in a failed state at the moment article was done boards that need a hand in the rack. That number is itself a signal: a board that has stopped answering is a board that stopped being able to report, which is usually more interesting than a test that merely failed. Every board is registered in NetBox, which is the source of truth for the whole system. Not just an asset list the orchestrator reads it to decide what a board can be tested with. Power is derived from cabling topology rather than a field someone typed: a board's power port is cabled to an outlet on a controller device, and the controller carries the driver. If the cable is not in the model, the board is treated as having no managed power, and the tests that need a hard power cut are skipped rather than faked. The hardware it takesPer bench, and the shared infrastructure behind it The cost of adding a board is not the board. It is the wiring around it. Each bench needs some subset of the following, and which subset a board has determines which tests it is eligible for. Remote power Required  A way to cut and restore power without a human. Three backends are in use: PoE switch ports for anything powered over Ethernet, a switched rack PDU for mains devices, and a 24-channel relay board driven over GPIO for DC-barrel and USB-powered boards. Without this there is no cold-boot test, only a soft reboot which is exactly the case that tends to pass while the real one fails.  Network Required  Wired Ethernet on a managed switch. This is the control channel (the harness drives boards over SSH), the measurement channel for throughput tests, and on PoE benches, the power channel too. A board that only has Wi-Fi is testable but much harder to recover.  Power metering Strongly recommended  PoE ports meter per-port draw, so the harness samples watts throughout a run. This is how you tell a board that genuinely rebooted from one whose SoC never stopped executing the power trace is flat across what was supposed to be a power cycle.  Serial console Recommended  USB-to-TTL adapters on a powered hub, exposed over the network as named consoles. Without one, a board that fails to boot tells you nothing at all: you get silence and have to guess. Several boards in the rack currently lack one, and every hang on those is an investigation that stalls at "it does not come back".  Clean-flash path Not yet wired  An SD-card switcher that presents the card to a flasher host or to the board, or USB access for vendor recovery modes. This is what makes a board recoverable from software that does not boot. The framework supports it; no bench in the rack is currently wired for it, which is the single biggest constraint on what comes next. Behind the benches sits the shared infrastructure, the part people underestimate when they picture "a few boards on a shelf": Switching. Three core switches and four access switches, several of them PoE, which do double duty as the fleet's power controllers. Between them they carry the control network, the test traffic and the power for a large fraction of the boards. This is no longer just a 1 GbE network: newer boards increasingly come with 2.5 GbE, while the uplinks and core need 10 GbE to aggregate traffic from many boards running tests in parallel. Without that headroom, the lab network itself becomes the bottleneck and network-performance results stop measuring the board under test.Power delivery. A switched rack PDU, multi-channel DC supplies, multiple 16-way USB supply, switched power strips, and a UPS in front of all of it because a lab that loses power mid-write is a lab that corrupts SD cards.Console and out-of-band. Dedicated console hosts, including a KVM device for the machines that need screen-level access.Compute. Six servers in the same site, including two Ampere-class ARM machines, running the CI runners that execute the build and test jobs and the services the fleet depends on.All of it is scripted. Each class of hardware has a small command-line tool with the same shape &#x2014; status, on, off, powercycle so the harness does not care whether a board is switched by a PoE port, a PDU outlet or a relay channel. It resolves the path from the inventory model and calls whichever tool matches. What a nightly run doesThe cycle, end to end The fleet does not stay powered. A full cycle brings it up, tests it, and puts it back to sleep. The last step runs even when everything before it failed. Power on The fleet is brought up from the PDU and the boards are given several minutes to boot.Scan and reconcile Every board is probed and the inventory updated: what version it is running, what kernel, when it was last seen. Drift between the model and reality is recorded rather than assumed away.Sync maintainer keys Board maintainers' SSH keys are pushed to the boards they own, so the person responsible for a board can log into the actual unit that failed.Run the board pipeline A matrix job per board, in parallel across the runners. This is the part below.Scan again Post-test state is captured; what the run left behind, not just what it reported.Power off Always, including after a failure. A rack left powered on a failed run is a rack that cooks.Inside step four, each board runs the same pipeline. It upgrades to the nightly repository, reboots, and then walks every kernel branch that board is configured to test: 

StepWhat it doesupgradePoint at the nightly repository and install what is currently published.rebootVerify that the board comes back with what it already had installed.For each branchRepeat the steps below for each kernel branch (current, edge, &#x2026;).&#x21B3; kernel-switchInstall that branch's kernel and verify that it is fully configured.&#x21B3; rebootPerform warm reboots, followed by a cold power cycle where switched power is available.&#x21B3; hw-performanceTest CPU, memory, disk and temperature.&#x21B3; dvfsVerify that the governor actually reaches the frequencies it claims.&#x21B3; network-iperfMeasure throughput on each cabled network interface.&#x21B3; store-versionsRecord exactly what is installed and running.restore-stablePut the board back the way it was found.

Two details in there carry more weight than they look. The reboot module does warm reboots followed by a cold power cycle, because those fail differently: a board can survive reboot indefinitely and still not come back from a real power cut. Testing both is the only way to catch both failure modes. And kernel-switch verifies that the package is genuinely configured rather than trusting an exit code, because the interesting failures can leave a kernel half-installed while every command reports success. What the results look like Current results are published publicly at docs.armbian.com/status/board-tests, refreshed as runs complete. What it actually catchesHere are few examples from recent runs. Reboots that hang on both kernelsOne board fails every reboot attempt on both of its kernel branches. The power trace shows the draw holding steady through what should have been a restart &#x2014; the SoC never stopped executing. That points at firmware rather than the kernel, but the issue remains unresolved. It is also a good example of the console gap: that bench has no serial console, so the investigation is relying on power measurements and inference instead of a boot log. A test that was wrong about x86The frequency-scaling check assumed that a governor under load should reach at least 95% of the maximum advertised frequency. That works for ARM cpufreq, but not for Intel and AMD, where the driver manages turbo behaviour itself and the advertised maximum is not a promise. Every x86 board was therefore failing a test that was itself wrong. The test was fixed by detecting the driver and applying the check only where it makes sense. Telling a broken board from a broken runnerSelf-hosted runners occasionally drop mid-job: the test finishes green, then the job dies later and the run is marked failed. Retrying everything would be wrong. A board pipeline power-cycles hardware and takes about half an hour, so retrying a genuine failure wastes rack time and keeps cycling a board that may already be unwell. The retry logic therefore re-runs only jobs whose test step did not fail. A real hardware or test failure stays red rather than being hidden by an automatic retry. Where AI fitsAnd where it explicitly does not A large share of the tooling described here &#x2014; the test modules, hardware control scripts, inventory reconciliation and documentation &#x2014; is now written and maintained with AI assistance. That is worth being plain about, including the parts that go wrong. What AI is genuinely good at is shortening the distance from symptom to candidate explanation. A board fails; there is a transcript, a package state, a power trace, a kernel version and forty thousand lines of shell across several repositories. Correlating those quickly, proposing a mechanism and drafting a patch is work that used to take an evening and can now take a few minutes. What it is bad at is knowing when it is wrong. In the course of this work, an analysis confidently concluded that a particular board had never appeared in the test results. The conclusion came from a sample that covered about three-quarters of the archive and happened to miss both of that board's records. The reasoning was sound; the evidence was partial; nothing in the output said so. The pointAI shortens the distance from symptom to patch. It does not shorten the distance from patch to proof. Those are different problems, and only one of them has been made easier. That is precisely why the rack matters more now, not less. If proposing changes gets cheaper while validating them does not, the amount of unverified change grows faster than our ability to verify it. And the most dangerous bugs here are exactly the ones that compile cleanly, install without error, and fail only when a specific board is asked to come back from a power cut. A machine that is confidently wrong is a fine collaborator as long as something downstream can check it. Sixty-five boards that will actually try to boot are that something. So the working rule is simple: AI is free to propose anything, but nothing reaches a board on its say-so. Hardware evidence is the gate, and every conclusion that matters is expected to point at a run, a trace or a package state rather than an argument. What is next: validation at pull-request timeThe change we want to make Today the facility validates nightly builds. Whatever was published overnight gets installed on real hardware and exercised. That is genuinely useful, and it is how the bugs above were found, but it is validation after the fact. By the time a board fails, the change is already in the nightly repository and, depending on timing, already on users' machines. The goal is to move that gate earlier: a pull request that touches a board family gets that family's boards booted before it merges. Not the whole rack for every PR, just the boards the change can actually reach. Several things have to be true first, and they are worth stating honestly rather than as a roadmap of solved problems. SelectionA diff has to map to boards. A change to a board configuration file implicates that board; a change to a kernel family implicates every board in it; a change to the packaging code implicates everything. Select too broadly and every PR occupies the entire rack for half an hour. Select too narrowly and the one board that would have caught the regression never gets tested. ArtifactsA PR build currently proves a compile. Hardware testing needs installable packages the rack can pull and install exactly as a user would, which means PR builds must publish to an isolated repository the fleet can reach. Our current build machinery is already stretched by existing CI and release workloads. Making hardware testing part of routine PR validation will require additional build capacity, storage and package-publishing infrastructure. Time budgetA full board pipeline takes around thirty minutes. That is acceptable overnight and much too slow as a merge gate, particularly when a nightly cycle already has the rack. This needs a short profile for PRs: install, switch kernel, reboot warm and cold, and confirm it is running what was installed. Performance and throughput work can stay in the nightly run. It also needs real contention handling, so a PR does not simply queue behind a fleet cycle. RecoveryThis is the hard one, and it is a hardware problem rather than a software one. Testing unmerged code means occasionally installing a kernel that does not boot. Right now every bench in the rack is tested in place; there is no remote path to reflash a board whose boot is broken. A board that a bad PR bricks is a board that stays bricked until somebody walks to the rack. So PR-stage testing starts on benches that can be recovered remotely: SD-card switchers for boards that boot from removable media, and vendor recovery modes over USB for those that support it. Wiring that up across the fleet is the prerequisite that gates everything else, and it is where the next round of hardware effort goes. Boards that cannot be recovered remotely stay on nightly testing, where a failure is an inconvenience instead of a dead unit. Signal qualityA merge gate that fails for reasons unrelated to the change is worse than no gate: it trains people to ignore it. The distinction between a board failure and a broken bench, already important for nightly runs, becomes critical the moment a red result blocks a merge. HelpingInfrastructure, capacity, partnerships There are three practical ways to move this forward. Bench infrastructure. Remote recovery is the immediate blocker for PR-stage testing, particularly SD-card switchers and the wiring around them. The network also needs to grow with the hardware being tested: managed PoE switches with 2.5 GbE access ports and 10 GbE uplinks, plus PoE splitters for boards that cannot be powered directly over Ethernet. These are not just infrastructure upgrades; they expand what can be tested, measured and recovered without somebody standing in front of the rack. Build capacity. PR-stage hardware testing needs PR builds, and build queue time is already a constraint on how quickly a fix reaches hardware. More build capacity, storage and package-publishing infrastructure are needed to move validation from nightly runs into the pull-request workflow. If you can host a build server, the requirements are documented, and the current fleet is listed on the build machinery page. Hardware partnerships. For vendors, the facility provides a way to keep hardware under continuous validation rather than testing it once around release. Devices covered by support and maintenance agreements can become part of the permanent test fleet, where kernel updates, upgrades, reboots, networking and other regressions are exercised on real hardware as Armbian evolves. The value is not the board itself; it is keeping that board working over its supported lifetime. View the full article</description><pubDate>Wed, 30 Sep 2026 18:29:14 +0000</pubDate></item><item><title>[News from Armbian] - JetHome boosts Armbian CI</title><link><![CDATA[https://testforum.armbian.com/topic/62336-news-from-armbian-jethome-boosts-armbian-ci/?do=findComment&comment=243380]]></link><description>JetHome (Shenzhen JetHome Technology Co.) donated a build server for Armbian. The server compiles Armbian images, kernels and U-Boot packages. Thank you, JetHome. HW Specifications



  CPU
  
    2 &#xD7; Intel Xeon Gold 6148, 80 threads
  

  Memory
  
    384 GB
  

  Storage
  
    3.84 TB SSD, plus 20 TB of disk
  

  Network
  
    2 &#xD7; 1 Gbit/s, bonded
  

  Build runners
  
    40
  



That is about a tenth of the fleet's capacity, running up to 3 kernel or 40 full image builds at once. The server also remembers work it has already done: Compiled code is reused. A rebuild takes under a minute instead of three.Software packages are downloaded once and shared by all 40 build jobs.Source code and ready-made parts, such as kernels, are fetched once and kept on the server.The fleet today18 build servers &#xB7; 774 CPU threads &#xB7; 322 build runners With 2371 GB of memory across x86-64 and ARM servers. Part of the fleet sleeps and powers up only when builds are waiting. Current build servers are sponsored by JetHome, the OSU Open Source Lab and netcup. Armbian members sponsor all other servers. See the live list on the build machinery page. We need more build servers!More servers mean more than more boards. We want faster CI, and more building and testing of every pull request, so community developers get feedback sooner and fixes reach users faster. Today the build queue is longer than it should be. 



  
  
    Minimum
  
  
    Ideal
  

  CPU
  16 cores
  32 cores

  Memory
  64 GB
  128 GB

  Storage (NVMe)
  512 GB
  1 TB

  Upload
  50 Mbit/s
  1 Gbit/s



Both x86-64 and arm64 help. The server runs only Armbian builds, and we credit your hosting on the build machinery page. 
            
            
                
                
                    
                    
                        
                            Spare CPU cores and a fast uplink? Put them to work compiling Armbian for hundreds of boards. 
                        
                    
                    
                        
                            Donate build capacity
                        
                        
                    
                
            
        View the full article</description><pubDate>Wed, 30 Sep 2026 15:26:59 +0000</pubDate></item><item><title>[Armbian newsletter] - JetHome boosts Armbian CI</title><link><![CDATA[https://testforum.armbian.com/topic/62334-armbian-newsletter-jethome-boosts-armbian-ci/?do=findComment&comment=243378]]></link><description>JetHome (Shenzhen JetHome Technology Co.) donated a build server for Armbian. The server compiles Armbian images, kernels and U-Boot packages. Thank you, JetHome. HW Specifications



  CPU
  
    2 &#xD7; Intel Xeon Gold 6148, 80 threads
  

  Memory
  
    384 GB
  

  Storage
  
    3.84 TB SSD, plus 20 TB of disk
  

  Network
  
    2 &#xD7; 1 Gbit/s, bonded
  

  Build runners
  
    40
  



That is about a tenth of the fleet's capacity, running up to 3 kernel or 40 full image builds at once. The server also remembers work it has already done: Compiled code is reused. A rebuild takes under a minute instead of three.Software packages are downloaded once and shared by all 40 build jobs.Source code and ready-made parts, such as kernels, are fetched once and kept on the server.The fleet today18 build servers &#xB7; 774 CPU threads &#xB7; 322 build runners With 2371 GB of memory across x86-64 and ARM servers. Part of the fleet sleeps and powers up only when builds are waiting. Current build servers are sponsored by JetHome, the OSU Open Source Lab and netcup. Armbian members sponsor all other servers. See the live list on the build machinery page. We need more build servers!More servers mean more than more boards. We want faster CI, and more building and testing of every pull request, so community developers get feedback sooner and fixes reach users faster. Today the build queue is longer than it should be. 



  
  
    Minimum
  
  
    Ideal
  

  CPU
  16 cores
  32 cores

  Memory
  64 GB
  128 GB

  Storage (NVMe)
  512 GB
  1 TB

  Upload
  50 Mbit/s
  1 Gbit/s



Both x86-64 and arm64 help. The server runs only Armbian builds, and we credit your hosting on the build machinery page. 
            
            
                
                
                    
                    
                        
                            Spare CPU cores and a fast uplink? Put them to work compiling Armbian for hundreds of boards. 
                        
                    
                    
                        
                            Donate build capacity
                        
                        
                    
                
            
        View the full article</description><pubDate>Wed, 30 Sep 2026 15:26:59 +0000</pubDate></item><item><title>[News from Armbian] - Mali GPU with LiteRT-LM</title><link><![CDATA[https://testforum.armbian.com/topic/62337-news-from-armbian-mali-gpu-with-litert-lm/?do=findComment&comment=243381]]></link><description><![CDATA[Running Gemma 4 E2B on a Mali GPU with LiteRT-LMThis guide should work on any armbian minimal/console (trixie) system with a working Mali-g610 GPU.   DO NOT USE DESKTOP Verified on: Orange Pi 5 Max (Rockchip RK3588, Arm Mali-G610 MC4), Armbian/Debian 13 (trixie), aarch64, 8 GB RAM. Status summary: Both CPU (XNNPACK) and GPU (WebGPU/Dawn → Vulkan → panvk → panthor) work on the mainline panthor kernel — numbers below. The GPU path needed one line of local patching in Mesa's panvk driver (raise maxImageDimension3D 512 → 2048 to meet the WebGPU minimums that LiteRT's Dawn library enforces; recipe in §5, rationale in §7.1). The model is multimodal (Text + Vision + Audio): the vision encoder runs on the same patched panvk via--vision-backend gpu (§5 "VL path" results). The vendor Rockchip libmali route and OpenCL remain unavailable on mainline panthor (§7.2, §7.3). Stack (as shipped): Gemma 4 E2B (.litertlm, int4)  →  LiteRT-LM CLI  →  LiteRT GPU accelerator (WebGPU/ML Drift)

Dawn (WebGPU impl) → Vulkan → panvk → panthor (kernel) → Mali-G610
1. PrerequisitesARM (aarch64) Linux with a Mali GPU and at least 8 GB RAM.Armbian/Debian 13 (trixie)The panthor (or panfrost for older Mali) kernel driver active:ls /dev/dri/renderD128          # render node must exist
lsmod | grep panthor            # or panfrost / lima
Full ARMv8.2-A dotprod support is required — LiteRT's ARM64 binaries are built with it and will SIGILL otherwise:lscpu | grep -w asimddp (both A55 and A76 cores list it here). 2. Install Mesa + Vulkan for Mali (needs root)sudo apt update
# Prefer the newest Mesa (backports on Debian) for the best panvk coverage of Valhall CSF GPUs:
sudo apt install -y -t trixie-backports mesa-vulkan-drivers libvulkan1 vulkan-tools
# Optional (see §7 — currently yields NO usable OpenCL device on panthor):
sudo apt install -y -t trixie-backports mesa-opencl-icd clinfo
Verify the GPU is visible to Vulkan: vulkaninfo --summary | grep -iE "deviceName|driverName"
# Expect: deviceName = Mali-G610 MC4   driverName = panvk
3. Install the LiteRT-LM CLI (user space, no root)curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
uv tool install litert-lm        # current: v0.17.x; incl. CPU (XNNPACK/YNNPACK) + GPU (WebGPU/Vulkan) backends
4. Get the model (Gemma 4 E2B, int4 .litertlm, 2.58 GB)mkdir -p ~/litert-lm-bench &amp;&amp; cd ~/litert-lm-bench
curl -L -o gemma-4-E2B-it.litertlm \
  https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it.litertlm
# or have the CLI fetch it for you:
#   litert-lm benchmark --from-huggingface-repo litert-community/gemma-4-E2B-it-litert-lm gemma-4-E2B-it.litertlm
Other ready models: google/gemma-3n-E2B-it-litert-lm (gemma-3n-E2B-it-int4.litertlm),litert-community/gemma-4-E4B-it-litert-lm, ... (see litert-lm list / HF). 5. BenchmarkLock the CPU governor to performance first (fair, repeatable numbers): sudo sh -c 'for c in /sys/devices/system/cpu/cpu[0-7]/cpufreq/scaling_governor; do echo performance &gt; $c; done'
CPU baseline (XNNPACK, 8 threads): litert-lm benchmark ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  -p 1024 -d 256 --backend cpu --cpu-thread-count 8 --cache disk --runs 2
GPU (patched panvk, §7.1). One-time local Mesa build — stays entirely in userland, the system Mesa is untouched: # 1) Mesa source + one-line patch (26.1.2)
cd ~/litert-lm-bench
curl -L -o mesa.tar.xz https://archive.mesa3d.org/mesa-26.1.2.tar.xz
tar -xf mesa.tar.xz &amp;&amp; cd mesa-26.1.2
python3 - &lt;&lt;'PY'
p = 'src/panfrost/vulkan/panvk_vX_physical_device.c'
s = open(p).read()
s = s.replace('.maxImageDimension3D = PAN_ARCH &lt;= 10 ? (1 &lt;&lt; 9) : (1 &lt;&lt; 14),',
              '.maxImageDimension3D = (1 &lt;&lt; 11), /* 2048 — meets WebGPU min */')
open(p, 'w').write(s)
PY

# 2) build deps (the LLVM/CLC chain is required — panvk bakes CLC-compiled SPIR-V for libpan)
sudo apt install -y --no-install-recommends meson ninja-build pkg-config gcc g++ python3-mako \
  python3-yaml python3-ply libdrm-dev llvm-19-dev libllvmspirvlib-19-dev spirv-tools \
  libclang-19-dev libclang-cpp19-dev

# 3) panvk-only build (~10–25 min on the 5 Max)
meson setup build-panvk -Dvulkan-drivers=panfrost -Dgallium-drivers= -Dbuildtype=release \
  -Dllvm=enabled -Dmesa-clc=auto -Dplatforms= -Degl=disabled -Dgbm=disabled -Dglx=disabled \
  -Dopengl=false -Dglvnd=disabled -Dtools= -Dbuild-tests=false
ninja -C build-panvk -j6

# 4) benchmark with the patched driver, process-scoped. First put the WebGPU prebuilts
#    (libLiteRtTopKWebGpuSampler.so + libwebgpu_dawn.so etc., litert-lm repo tag v0.17.1,
#    prebuilt/linux_arm64) in ~/litert-lm-bench/prebuilt_v0171/ — see Troubleshooting.
export BUILD=~/litert-lm-bench/mesa-26.1.2/build-panvk
export VK_ICD_FILENAMES="$BUILD/src/panfrost/vulkan/panfrost_devenv_icd.aarch64.json"
export LD_LIBRARY_PATH="$BUILD/src/panfrost/vulkan:$HOME/litert-lm-bench/prebuilt_v0171"
export PATH="$HOME/.local/bin:$PATH"            # uv-installed CLI
litert-lm benchmark ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  -p 1024 -d 256 --backend gpu --cache disk --runs 2
First GPU run compiles the WebGPU/Vulkan shaders (one-time) and uploads GPU-rearranged weights (~0.8 GB weight cache); --cache disk persists both next to the model, so later loads start fast — the compile cost is NOT repaid on every run. Results on this Orange Pi 5 Max (Mali-G610 MC4)




Backend
Prefill (tk/s)
Decode (tk/s)
TTFT (s)




CPU (XNNPACK, 8 threads)
123.6
12.3
8.4


GPU (WebGPU/Dawn→Vulkan, patched panvk §5/§7.1)
374.0
8.7
2.9




Google's on-device-class references for Gemma 4 E2B: S26 Ultra GPU 3808/52 tk/s, Raspberry Pi 5 CPU 133/7.6 tk/s. On this board the GPU wins the prefill race by ~3.0× (374 vs 124 tk/s) and TTFT by ~2.9× (2.9 vs 8.4 s), while decode stays on the CPU's side (8.7 vs 12.3 tk/s) — as expected, decode is the bottleneck on Mali-class hardware; the Mali GPU is a prefill/TTFT accelerator here, not a decode accelerator. GPU clock note (measured, no guesswork): the Mali-G610 is an integrated GPU sharing the board's DDR. The devfreq governor (simple_ondemand, stock) boosts it to 1 GHz under load and parks it at 200 MHz idle — confirmed by sampling cur_freq at 400 ms during the run (233/263 samples at 1000 MHz, temps 41→56 °C, no thermal trip). Leave the governor alone: forcingperformance/min/max via sysfs was counterproductive (idle readbacks that look like the clock collapsed, and it destabilized perfectly good runs). The numbers above are at the stock governor's real 1 GHz boost. Results: Gemma 4 E4B (4B) — text GPU via the web flavor, vision GPU straight from stockE4B (the 4B sibling) ships as three files in the HF repo: the stock gemma-4-E4B-it.litertlm (text+vision+audio, 3.66 GB) plus an -gpu and a -web (text-only, 2.97 GB) variant. On this 8 GB board the stock file cannot run on the GPU — two structural walls, both measured: panthor job watchdog: a fixed one-shot pipeline dispatch (dmesg: job timeout ... seqno=144, same job on every E4B attempt) exceeds the driver's compiled-in 1 s job timeout even at the real 1 GHz boost (E2B's equivalent is seqno=77 and fits). The GPU is reset, Dawn reports VK_ERROR_DEVICE_LOST, generation aborts. 8 GB RAM ceiling: GPU buffers (pinned, unrescalable shmem) peak near 4–5 GB on top of the 3.66 GB model; every run ended in a global OOM-kill (EXIT=137) during iteration 2 even with a 2048-token KV cap + ringbuffers + disk cache. The -web flavor dodges both — its finer op layout splits the killer dispatch under the 1 s bar and shrinks the GPU working set (peak 4.3 GB observed, holds 1 GHz the whole run): 




Gemma 4 E4B lane
Flavor
Prefill (tk/s)
Decode (tk/s)
TTFT (s)




CPU (XNNPACK, 8 threads)
stock
52.6
5.58
19.6


GPU (patched panvk)
web (text-only)
75.1
4.54
13.9




(reproducible to the decimal across --runs 2; init 6.2 s; note --cache disk does not persist for the web flavor — expect a recompile each run. --speculative-decoding true gave no gain:4.37 vs 4.54 tok/s decode (this build ships no draft model).) Reference: Raspberry Pi 5 (16 GB, CPU) 51/3.2/20.5 — this board matches or beats it on every column. Same shape as E2B: GPU wins prefill +1.4× and TTFT 19.6→13.9 s, but decode stays CPU-favored (4.5 vs 5.6 tk/s). E4B vision (VL) on GPU works — cpu text + gpu visionThe stock E4B's vision encoder is a separate 1477-op subgraph that fits under the panthor watchdog and inside 8 GB even though the full stock model's text lane does not. Drive it via the Engine API (this repo's vl_bench.py --model ...), LLM lane = CPU, vision encoder = GPU (patched panvk): the test image (resized to 912×672 → 2394 patches, near E4B's max_num_patches 2520) is encoded on the Mali. 




E4B VL (LLM lane = cpu)
vision cpu
vision gpu (patched panvk)




TTFT (s)
12.3–12.5
9.6


Decode (tok/s)
7.33–7.37
7.28–7.39


Reply (same image)
"coyote walking on a dirt path"
identical




Text-only CPU control: TTFT ≈ 2.0 s (7-token prompt, decode ~7.8 tok/s). Isolated vision-encode cost: ~10.4 s CPU vs ~7.6 s GPU — the Mali cuts E4B vision latency by ~2.9 s/image (~27%). No watchdog hits, no OOM (peaks well below ceiling; vision weights are a fraction of a GB). Same conclusion as E2B: for vision work keep the LLM on CPU and let the GPU run the encoder. # 1. SET ENVIRONMENT FOR GPU VISION DELEGATE
  export LITERT_VISION_DELEGATE=gpu

  # 2. RUN VL HARNESS FOR STOCK GEMMA-4-E4B
~/.local/share/uv/tools/litert-lm/bin/python vl_bench.py \
    --text cpu \
    --vision gpu \
    --image \
    --iters 3 \
    --model gemma-4-E4B-it.litertlm# Ensure directory exists and download model
mkdir -p ~/litert-lm-bench
curl -L -o ~/litert-lm-bench/gemma-4-E4B-it-web.litertlm \
  https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm

# Execute benchmark with standard LiteRT-LM flags
litert-lm benchmark ~/litert-lm-bench/gemma-4-E4B-it-web.litertlm \
  --backend=gpu \
  -p 1024 \
  -d 256 \
  --runs 2Results: VL (vision) pathThe benchmark sub-command only benches the text path. To time the vision encoder, drive the same engine via the Python API (vl_bench.py in this directory) — it loads the model, streams a real image (test_multi.jpg, httpbin.org/image/jpeg) + text through vision_backend=cpu|gpu and prints TTFT (vision encode + prefill + first token), per-chunk decode rate, and the reply. One sentence prompt, 13-token answer, ~290-token total prefill (280 vision + text), generations deterministic (temperature=0). Medians over 3+ runs after compile: 




Combo (text / vision)
VL TTFT (s)
Decode (tok/s)
Reply matches CPU?




cpu / cpu
8.93–9.40
17.4
baseline


cpu / gpu (patched panvk)
6.16–6.62
17.2
yes, identical


gpu / gpu (patched panvk)
5.62–6.16
9.8
yes, identical




Text-only controls (7-token prompt): CPU TTFT ≈ 0.8 s, GPU TTFT ≈ 0.57 s. Isolating the vision cost (VL TTFT − text-only TTFT for the same text backend): ~8.1 s on a CPU vision encoder vs ~5.4 s GPU — the Mali GPU cuts vision-encoder latency by ~2.7–3 s per image (~30%), and the full-GPU combo is ~37% faster end-to-end (5.6 vs 8.9 s). The patched panvk covers the model's separate VISION_ENCODER subgraph too (no extra Dawn limits tripped). Caveat: for short generations (&lt; ~20 tokens) GPU decode is slower than CPU (9.8 vs 17.4 tok/s) — per-iteration GPU sync overhead — so for chatty/VL replies the CPU text lane with GPU vision is often the best mix (6.2 s TTFT, CPU-fast decode). Benchmarking the VL path yourself# 1. FETCH SAMPLE TEST IMAGE
  curl -sL -o ~/litert-lm-bench/test_multi.jpg https://httpbin.org/image/jpeg

  # 2. SET PYTHON INTERPRETER PATH
  VL_PY=~/.local/share/uv/tools/litert-lm/bin/python

  # 3. BASELINE: TEXT (CPU) + VISION (CPU)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --vision cpu --image --iters 3

  # 4. HYBRID: TEXT (CPU) + VISION (GPU) — EXPORT PANVK MESA ENVS FIRST
  export BUILD=~/litert-lm-bench/mesa-26.1.2/build-panvk
  export VK_ICD_FILENAMES="$BUILD/src/panfrost/vulkan/panfrost_devenv_icd.aarch64.json"
  export LD_LIBRARY_PATH="$BUILD/src/panfrost/vulkan:$HOME/litert-lm-bench/prebuilt_v0171"

  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --vision gpu --image --iters 3

  # 5. FULL ACCELERATION: TEXT (GPU) + VISION (GPU)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text gpu --vision gpu --image --iters 3

  # 6. TEXT-ONLY CONTROLS (ISOLATE VISION-ENCODER COST)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --iters 3
  $VL_PY ~/litert-lm-bench/vl_bench.py --text gpu --iters 3
Prints per-iteration TTFT / decode tok/s / reply. Run cases sequentially — parallel GPU runs contend for the Mali GPU and inflate the numbers (observed 2× TTFT when two ran at once). 6. Inference# 1. DIRECT CLI EVALUATION 
  litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
    --cache disk --prompt "What is the capital of France?"

  # 2. INTERACTIVE REPL MODE
  litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm

  # 3. OPENAI-COMPATIBLE API SERVER
  litert-lm serve ~/litert-lm-bench/gemma-4-E2B-it.litertlm
Vision (and audio) input uses run with attachments — one per --attachment, placed before the first user text (images and audio can be mixed): litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  --attachment ~/litert-lm-bench/test_multi.jpg \
  --prompt "What is in this image? Answer in one sentence." \
  --vision-backend cpu          
  # or gpu (patched panvk, §5) — ~2.7–3 s faster vision encode
 --vision-backend/--audio-backend pick the encoder lane independently of --backend (which chooses the LLM lane). Like --backend gpu, --vision-backend gpu needs the §5 env (VK_ICD_FILENAMES + LD_LIBRARY_PATH) exported for that run. Notes: --cache disk persists compiled artifacts next to the model — the first GPU load compiles shaders, later loads start instantly. The load time is NOT paid on every run. Observed caches: &lt;model&gt;_*_mldrift_program_cache.bin (compiled kernels) and&lt;model&gt;_*_mldrift_weight_cache.bin (GPU-rearranged weights, ~0.8 GB). The vision encoder's kernels live in the same cache files — first GPU --vision-backend gpu run compiles, later runs reuse. GPU (patched panvk) is ~2.8× faster at prefill and ~2.7× on TTFT, but ~30% slower at decode — pick the lane by workload (§7.4). Vision: --vision-backend gpu cuts vision-encode latency by ~2.7–3 s per image; CPU text + GPU vision is the best blend for short/chatty replies (§5 VL results). Speculative decoding (--speculative-decoding true) can lift decode on CPU+GPU for rewrite/summarize/coding style prompts (Gemma 4 E2B supports it). 7. GPU deep dive: the blocker and how it was unblocked hereEverything below was reproduced with LiteRT-LM v0.17.1 (CLI + litert-lm-api), Mesa 26.1.2 (trixie-backports), kernel 7.2.4-edge-rockchip64 (mainline panthor). 7.1 The panvk limit blocker — RESOLVED with a one-line local patchLiteRT's WebGPU accelerator uses Dawn, which enforces the WebGPU spec minimums against the Vulkan driver and refuses to proceed when they are unmet. Stock panvk reports: maxImageDimension3D = 512      # WebGPU spec requires ≥ 2048
Dawn logs exactly this (PhysicalDeviceVk.cpp:794: "Insufficient Vulkan limits for maxTextureDimension3D ... must be at least 2048"), and stock panvk then dies with a null-pointer dispatch (SIGSEGV, pc=0x0) inside the WebGPU path on the first real GPU execution. The root cause is the driver limit, not packaging: the crash is identical even with the WebGPU prebuilts (libLiteRtTopKWebGpuSampler.so + friends) fetched from the litert-lm repo prebuilt/linux_arm64 @ v0.17.1 on LD_LIBRARY_PATH. The fix (validated on this board): panvk caps 3D textures at 512 for Valhall (PAN_ARCH &lt;= 10), but the Mali-G610 hardware handles 2048³ — raising the advertised limit to 2048 makes Dawn accept the adapter: -.maxImageDimension3D = PAN_ARCH &lt;= 10 ? (1 &lt;&lt; 9) : (1 &lt;&lt; 14),
+.maxImageDimension3D = (1 &lt;&lt; 11),       /* 2048 — meets WebGPU min (was 512 on arch &lt;= 10) */
Why it's safe: Dawn only validates the advertised limit against its spec minimum, and the value also caps future image allocations — so if a kernel ever genuinely requested a 2048³ 3D texture, panvk would fail cleanly at allocation instead of corrupting anything. LiteRT/ML-Drift's LLM and vision-encoder kernels allocate buffers and 2D textures only, so real GPU behaviour is unchanged; Dawn simply stops rejecting the adapter, the SIGSEGV disappears, and the full benchmark runs (§5). Confirmed via vulkaninfo on the patched build: maxImageDimension3D = 2048. All other WebGPU minimums (per-stage descriptors, workgroup sizes, buffer ranges) were already comfortably met. The build is process-scoped (VK_ICD_FILENAMES + LD_LIBRARY_PATH per run), the system Mesa is never touched, and reverting is unsetting two variables. Unless/until Mesa raises this limit upstream for Valhall, keep this build around for LiteRT-LM GPU runs. 7.2 The vendor route (Rockchip libmali) — needs a different kernelRockchip's proprietary blob would satisfy Dawn (it exposes Vulkan 1.3 with full limits), but the blob's userspace talks to Rockchip's proprietary kbase kernel driver (/dev/mali) and cannot attach to the mainline panthor driver: "libmali-valhall-g610-g13p0-gbm"      → loads, exports NO Vulkan ICD (0 vk_* symbols)
"libmali-valhall-g610-g24p0-gbm"
  libMaliVulkan.so.1 (api 1.3.276)    → loads, "No mali devices found" then SIGSEGV (no /dev/mali)
Installable packages exist (tsukumijima/libmali-rockchip releases, e.g. v1.9-1-20260312-bd33ee2), but they all presume the vendor kernel. Unblock: flash a vendor-kernel image (kernel with kbase/mali.ko, e.g.  Armbian images with the Rockchip BSP kernel), then install libmali-valhall-g610-g13p0-gbm (or g24p0) and point Dawn/Vulkan at it (VK_DRIVER_FILES/LD_LIBRARY_PATH). That same blob also provides OpenCL 3.0 (libMaliOpenCL.so + /etc/OpenCL/vendors/mali.icd), which would additionally satisfy the "would OpenCL be faster?" curiosity — for running LLMs, both WebGPU/Vulkan and OpenCL on the same GPU land in the same class of throughput; the win is the mature compiler's fast startup, not raw speed.  7.3 OpenCL on the current kernel — not availableMesa's rusticl on panthor currently exposes zero devices (clinfo -l shows only the rusticl platform, no device). So there is no OpenCL device at all on the mainline stack, and LiteRT-LM has no Linux OpenCL accelerator anyway. 7.4 Practical advice for this board todayChat / streaming (decode-bound): CPU is the better lane — 12.3 vs 8.7 tk/s decode.Long prompts / RAG / document Q&amp;A (prefill-bound): GPU pays off — 345 vs 124 tk/s prefill, 3.1 vs 8.4 s TTFT.Images / VL: --vision-backend gpu cuts vision-encode latency by ~2.7–3 s (~30%). Shortest VL TTFT is text+vision both on GPU (5.6 vs 8.9 s all-CPU), but keep the LLM on CPU when replies are short and chatty (6.2 s TTFT plus CPU-fast decode). --speculative-decoding true can lift decode further on both lanes (Gemma 4 E2B supports it).Serving an OpenAI-compatible endpoint (litert-lm serve)litert-lm serve exposes an OpenAI API on 0.0.0.0:9379, so LAN clients (LiteCode, opencode, aider, Continue, scripts) use the board like any OpenAI endpoint. Import a model once (litert-lm import ./gemma-4-E2B-it.litertlm, registry at ~/.litert-lm/models/), then litert-lm serve. Per-model settings come from ~/.litert-lm/config.json (default + models.&lt;id&gt;), so clients stay plain-OpenAI: {
  "default": { "backend": "cpu", "cpu_thread_count": 8, "cache": "disk" },
  "models": { "gemma-4-E2B-it.litertlm": { "speculative_decoding": true, "max_num_tokens": 4096 } }
}
Endpoints: GET /v1/models and POST /v1/chat/completions (streaming + non-streaming). OpenAI tools / tool_choice are bridged to the model's function-calling template — verified to return valid tool_calls JSON (non-streaming and streamed) and to complete the full agent cycle (assistant tool_call → tool result → final answer). /v1/embeddings exists but is not tied to LLM models. Even though litert-lm describe reports Supports Function Call: NO for Gemma 4, the serve layer still bridges tools into the model template (empirically verified); that flag only means the CLI's interactive run has no native FC template. RAM budget (E2B, CPU): max_num_tokens preallocates KV/ringbuffer arenas up front.Measured process RSS: 4096 → ~3.1 GB (4.9 GB free — recommended), 8192 → ~7 GB (1.1 GB free — works but leaves no headroom). Keep 4096 and let clients budget. Config keys (0.15+): backend, vision_backend, audio_backend, cpu_thread_count, cache, max_num_tokens, speculative_decoding, thinking, thinking_budget, gpu_decode_steps_per_sync, sampling. CLI flags override config. For a persistent border, run under systemd. Verified client on this boardLiteCode (razvanneculai/litecode) — works end-to-end. Its Planner ({"synthesis","tasks"} strict JSON) and Executor (raw file content, no fences) prompts fit the 4096 budget; single-request task runs completed correctly and files linter-clean. litecode.json: {
  "provider": { "baseURL": "http://&lt;yourIP&gt;:9379/v1", "apiKey": "", "model": "gemma-4-E2B-it.litertlm" },
  "tokenLimit": 4096, "reservedOutputTokens": 1500, "systemPromptBudget": 1000, "maxParallelExecutors": 1
}
TroubleshootingFATAL ERROR: This binary was compiled with dotprod enabled... → CPU lacks FEAT_DotProd, not supported by the ARM64 prebuilt wheels. RK3588 has it. GPU benchmark errors but CPU works → with stock Mesa this is the §7.1 Dawn limit crash (maxImageDimension3D = 512); with the patched build, check vulkaninfo --summary again — panvk must list the Mali device and report maxImageDimension3D = 2048. ExportVK_ICD_FILENAMES+LD_LIBRARY_PATH for every run that should use the patched driver. Could not load shared library libLiteRtTopKWebGpuSampler.so → the CLI wheel does not bundle the WebGPU samplers; fetch them from the litert-lm repo prebuilt/linux_arm64/ at the matching version tag (e.g. v0.17.1) and export their directory on LD_LIBRARY_PATH. First GPU run is slow (one-time kernel compilation) — normal; use --cache disk so later loads skip it. Caches persist next to the model. Bigger models (e.g. stock gemma-4-E4B-it.litertlm, 3.66 GB) fail on the GPU even with the patched driver: panthor ... job timeout in dmesg (fixed 1 s driver watchdog, not tunable; the model has a one-shot dispatch that exceeds it even at the real 1 GHz boost) theVK_ERROR_DEVICE_LOST, and/or a global OOM-kill (EXIT=137) when pinned GPU buffers + the model outgrow 8 GB. E2B fits, E4B-stock doesn't. Use the text-only -web flavor (gemma-4-E4B-it-web.litertlm, 2.97 GB) for E4B-on-GPU — its finer kernels stay under the watchdog and its GPU set peaks ~4.3 GB (§5 E4B section). Join the conversation on the Armbian Forum and let us know how it runs on your hardware! View the full article]]></description><pubDate>Wed, 30 Sep 2026 15:24:54 +0000</pubDate></item><item><title>[Armbian newsletter] - Mali GPU with LiteRT-LM</title><link><![CDATA[https://testforum.armbian.com/topic/62335-armbian-newsletter-mali-gpu-with-litert-lm/?do=findComment&comment=243379]]></link><description><![CDATA[Running Gemma 4 E2B on a Mali GPU with LiteRT-LMThis guide should work on any armbian minimal/console (trixie) system with a working Mali-g610 GPU.   DO NOT USE DESKTOP Verified on: Orange Pi 5 Max (Rockchip RK3588, Arm Mali-G610 MC4), Armbian/Debian 13 (trixie), aarch64, 8 GB RAM. Status summary: Both CPU (XNNPACK) and GPU (WebGPU/Dawn → Vulkan → panvk → panthor) work on the mainline panthor kernel — numbers below. The GPU path needed one line of local patching in Mesa's panvk driver (raise maxImageDimension3D 512 → 2048 to meet the WebGPU minimums that LiteRT's Dawn library enforces; recipe in §5, rationale in §7.1). The model is multimodal (Text + Vision + Audio): the vision encoder runs on the same patched panvk via--vision-backend gpu (§5 "VL path" results). The vendor Rockchip libmali route and OpenCL remain unavailable on mainline panthor (§7.2, §7.3). Stack (as shipped): Gemma 4 E2B (.litertlm, int4)  →  LiteRT-LM CLI  →  LiteRT GPU accelerator (WebGPU/ML Drift)

Dawn (WebGPU impl) → Vulkan → panvk → panthor (kernel) → Mali-G610
1. PrerequisitesARM (aarch64) Linux with a Mali GPU and at least 8 GB RAM.Armbian/Debian 13 (trixie)The panthor (or panfrost for older Mali) kernel driver active:ls /dev/dri/renderD128          # render node must exist
lsmod | grep panthor            # or panfrost / lima
Full ARMv8.2-A dotprod support is required — LiteRT's ARM64 binaries are built with it and will SIGILL otherwise:lscpu | grep -w asimddp (both A55 and A76 cores list it here). 2. Install Mesa + Vulkan for Mali (needs root)sudo apt update
# Prefer the newest Mesa (backports on Debian) for the best panvk coverage of Valhall CSF GPUs:
sudo apt install -y -t trixie-backports mesa-vulkan-drivers libvulkan1 vulkan-tools
# Optional (see §7 — currently yields NO usable OpenCL device on panthor):
sudo apt install -y -t trixie-backports mesa-opencl-icd clinfo
Verify the GPU is visible to Vulkan: vulkaninfo --summary | grep -iE "deviceName|driverName"
# Expect: deviceName = Mali-G610 MC4   driverName = panvk
3. Install the LiteRT-LM CLI (user space, no root)curl -LsSf https://astral.sh/uv/install.sh | sh
export PATH="$HOME/.local/bin:$PATH"
uv tool install litert-lm        # current: v0.17.x; incl. CPU (XNNPACK/YNNPACK) + GPU (WebGPU/Vulkan) backends
4. Get the model (Gemma 4 E2B, int4 .litertlm, 2.58 GB)mkdir -p ~/litert-lm-bench &amp;&amp; cd ~/litert-lm-bench
curl -L -o gemma-4-E2B-it.litertlm \
  https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it.litertlm
# or have the CLI fetch it for you:
#   litert-lm benchmark --from-huggingface-repo litert-community/gemma-4-E2B-it-litert-lm gemma-4-E2B-it.litertlm
Other ready models: google/gemma-3n-E2B-it-litert-lm (gemma-3n-E2B-it-int4.litertlm),litert-community/gemma-4-E4B-it-litert-lm, ... (see litert-lm list / HF). 5. BenchmarkLock the CPU governor to performance first (fair, repeatable numbers): sudo sh -c 'for c in /sys/devices/system/cpu/cpu[0-7]/cpufreq/scaling_governor; do echo performance &gt; $c; done'
CPU baseline (XNNPACK, 8 threads): litert-lm benchmark ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  -p 1024 -d 256 --backend cpu --cpu-thread-count 8 --cache disk --runs 2
GPU (patched panvk, §7.1). One-time local Mesa build — stays entirely in userland, the system Mesa is untouched: # 1) Mesa source + one-line patch (26.1.2)
cd ~/litert-lm-bench
curl -L -o mesa.tar.xz https://archive.mesa3d.org/mesa-26.1.2.tar.xz
tar -xf mesa.tar.xz &amp;&amp; cd mesa-26.1.2
python3 - &lt;&lt;'PY'
p = 'src/panfrost/vulkan/panvk_vX_physical_device.c'
s = open(p).read()
s = s.replace('.maxImageDimension3D = PAN_ARCH &lt;= 10 ? (1 &lt;&lt; 9) : (1 &lt;&lt; 14),',
              '.maxImageDimension3D = (1 &lt;&lt; 11), /* 2048 — meets WebGPU min */')
open(p, 'w').write(s)
PY

# 2) build deps (the LLVM/CLC chain is required — panvk bakes CLC-compiled SPIR-V for libpan)
sudo apt install -y --no-install-recommends meson ninja-build pkg-config gcc g++ python3-mako \
  python3-yaml python3-ply libdrm-dev llvm-19-dev libllvmspirvlib-19-dev spirv-tools \
  libclang-19-dev libclang-cpp19-dev

# 3) panvk-only build (~10–25 min on the 5 Max)
meson setup build-panvk -Dvulkan-drivers=panfrost -Dgallium-drivers= -Dbuildtype=release \
  -Dllvm=enabled -Dmesa-clc=auto -Dplatforms= -Degl=disabled -Dgbm=disabled -Dglx=disabled \
  -Dopengl=false -Dglvnd=disabled -Dtools= -Dbuild-tests=false
ninja -C build-panvk -j6

# 4) benchmark with the patched driver, process-scoped. First put the WebGPU prebuilts
#    (libLiteRtTopKWebGpuSampler.so + libwebgpu_dawn.so etc., litert-lm repo tag v0.17.1,
#    prebuilt/linux_arm64) in ~/litert-lm-bench/prebuilt_v0171/ — see Troubleshooting.
export BUILD=~/litert-lm-bench/mesa-26.1.2/build-panvk
export VK_ICD_FILENAMES="$BUILD/src/panfrost/vulkan/panfrost_devenv_icd.aarch64.json"
export LD_LIBRARY_PATH="$BUILD/src/panfrost/vulkan:$HOME/litert-lm-bench/prebuilt_v0171"
export PATH="$HOME/.local/bin:$PATH"            # uv-installed CLI
litert-lm benchmark ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  -p 1024 -d 256 --backend gpu --cache disk --runs 2
First GPU run compiles the WebGPU/Vulkan shaders (one-time) and uploads GPU-rearranged weights (~0.8 GB weight cache); --cache disk persists both next to the model, so later loads start fast — the compile cost is NOT repaid on every run. Results on this Orange Pi 5 Max (Mali-G610 MC4)




Backend
Prefill (tk/s)
Decode (tk/s)
TTFT (s)




CPU (XNNPACK, 8 threads)
123.6
12.3
8.4


GPU (WebGPU/Dawn→Vulkan, patched panvk §5/§7.1)
374.0
8.7
2.9




Google's on-device-class references for Gemma 4 E2B: S26 Ultra GPU 3808/52 tk/s, Raspberry Pi 5 CPU 133/7.6 tk/s. On this board the GPU wins the prefill race by ~3.0× (374 vs 124 tk/s) and TTFT by ~2.9× (2.9 vs 8.4 s), while decode stays on the CPU's side (8.7 vs 12.3 tk/s) — as expected, decode is the bottleneck on Mali-class hardware; the Mali GPU is a prefill/TTFT accelerator here, not a decode accelerator. GPU clock note (measured, no guesswork): the Mali-G610 is an integrated GPU sharing the board's DDR. The devfreq governor (simple_ondemand, stock) boosts it to 1 GHz under load and parks it at 200 MHz idle — confirmed by sampling cur_freq at 400 ms during the run (233/263 samples at 1000 MHz, temps 41→56 °C, no thermal trip). Leave the governor alone: forcingperformance/min/max via sysfs was counterproductive (idle readbacks that look like the clock collapsed, and it destabilized perfectly good runs). The numbers above are at the stock governor's real 1 GHz boost. Results: Gemma 4 E4B (4B) — text GPU via the web flavor, vision GPU straight from stockE4B (the 4B sibling) ships as three files in the HF repo: the stock gemma-4-E4B-it.litertlm (text+vision+audio, 3.66 GB) plus an -gpu and a -web (text-only, 2.97 GB) variant. On this 8 GB board the stock file cannot run on the GPU — two structural walls, both measured: panthor job watchdog: a fixed one-shot pipeline dispatch (dmesg: job timeout ... seqno=144, same job on every E4B attempt) exceeds the driver's compiled-in 1 s job timeout even at the real 1 GHz boost (E2B's equivalent is seqno=77 and fits). The GPU is reset, Dawn reports VK_ERROR_DEVICE_LOST, generation aborts. 8 GB RAM ceiling: GPU buffers (pinned, unrescalable shmem) peak near 4–5 GB on top of the 3.66 GB model; every run ended in a global OOM-kill (EXIT=137) during iteration 2 even with a 2048-token KV cap + ringbuffers + disk cache. The -web flavor dodges both — its finer op layout splits the killer dispatch under the 1 s bar and shrinks the GPU working set (peak 4.3 GB observed, holds 1 GHz the whole run): 




Gemma 4 E4B lane
Flavor
Prefill (tk/s)
Decode (tk/s)
TTFT (s)




CPU (XNNPACK, 8 threads)
stock
52.6
5.58
19.6


GPU (patched panvk)
web (text-only)
75.1
4.54
13.9




(reproducible to the decimal across --runs 2; init 6.2 s; note --cache disk does not persist for the web flavor — expect a recompile each run. --speculative-decoding true gave no gain:4.37 vs 4.54 tok/s decode (this build ships no draft model).) Reference: Raspberry Pi 5 (16 GB, CPU) 51/3.2/20.5 — this board matches or beats it on every column. Same shape as E2B: GPU wins prefill +1.4× and TTFT 19.6→13.9 s, but decode stays CPU-favored (4.5 vs 5.6 tk/s). E4B vision (VL) on GPU works — cpu text + gpu visionThe stock E4B's vision encoder is a separate 1477-op subgraph that fits under the panthor watchdog and inside 8 GB even though the full stock model's text lane does not. Drive it via the Engine API (this repo's vl_bench.py --model ...), LLM lane = CPU, vision encoder = GPU (patched panvk): the test image (resized to 912×672 → 2394 patches, near E4B's max_num_patches 2520) is encoded on the Mali. 




E4B VL (LLM lane = cpu)
vision cpu
vision gpu (patched panvk)




TTFT (s)
12.3–12.5
9.6


Decode (tok/s)
7.33–7.37
7.28–7.39


Reply (same image)
"coyote walking on a dirt path"
identical




Text-only CPU control: TTFT ≈ 2.0 s (7-token prompt, decode ~7.8 tok/s). Isolated vision-encode cost: ~10.4 s CPU vs ~7.6 s GPU — the Mali cuts E4B vision latency by ~2.9 s/image (~27%). No watchdog hits, no OOM (peaks well below ceiling; vision weights are a fraction of a GB). Same conclusion as E2B: for vision work keep the LLM on CPU and let the GPU run the encoder. # 1. SET ENVIRONMENT FOR GPU VISION DELEGATE
  export LITERT_VISION_DELEGATE=gpu

  # 2. RUN VL HARNESS FOR STOCK GEMMA-4-E4B
~/.local/share/uv/tools/litert-lm/bin/python vl_bench.py \
    --text cpu \
    --vision gpu \
    --image \
    --iters 3 \
    --model gemma-4-E4B-it.litertlm# Ensure directory exists and download model
mkdir -p ~/litert-lm-bench
curl -L -o ~/litert-lm-bench/gemma-4-E4B-it-web.litertlm \
  https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm

# Execute benchmark with standard LiteRT-LM flags
litert-lm benchmark ~/litert-lm-bench/gemma-4-E4B-it-web.litertlm \
  --backend=gpu \
  -p 1024 \
  -d 256 \
  --runs 2Results: VL (vision) pathThe benchmark sub-command only benches the text path. To time the vision encoder, drive the same engine via the Python API (vl_bench.py in this directory) — it loads the model, streams a real image (test_multi.jpg, httpbin.org/image/jpeg) + text through vision_backend=cpu|gpu and prints TTFT (vision encode + prefill + first token), per-chunk decode rate, and the reply. One sentence prompt, 13-token answer, ~290-token total prefill (280 vision + text), generations deterministic (temperature=0). Medians over 3+ runs after compile: 




Combo (text / vision)
VL TTFT (s)
Decode (tok/s)
Reply matches CPU?




cpu / cpu
8.93–9.40
17.4
baseline


cpu / gpu (patched panvk)
6.16–6.62
17.2
yes, identical


gpu / gpu (patched panvk)
5.62–6.16
9.8
yes, identical




Text-only controls (7-token prompt): CPU TTFT ≈ 0.8 s, GPU TTFT ≈ 0.57 s. Isolating the vision cost (VL TTFT − text-only TTFT for the same text backend): ~8.1 s on a CPU vision encoder vs ~5.4 s GPU — the Mali GPU cuts vision-encoder latency by ~2.7–3 s per image (~30%), and the full-GPU combo is ~37% faster end-to-end (5.6 vs 8.9 s). The patched panvk covers the model's separate VISION_ENCODER subgraph too (no extra Dawn limits tripped). Caveat: for short generations (&lt; ~20 tokens) GPU decode is slower than CPU (9.8 vs 17.4 tok/s) — per-iteration GPU sync overhead — so for chatty/VL replies the CPU text lane with GPU vision is often the best mix (6.2 s TTFT, CPU-fast decode). Benchmarking the VL path yourself# 1. FETCH SAMPLE TEST IMAGE
  curl -sL -o ~/litert-lm-bench/test_multi.jpg https://httpbin.org/image/jpeg

  # 2. SET PYTHON INTERPRETER PATH
  VL_PY=~/.local/share/uv/tools/litert-lm/bin/python

  # 3. BASELINE: TEXT (CPU) + VISION (CPU)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --vision cpu --image --iters 3

  # 4. HYBRID: TEXT (CPU) + VISION (GPU) — EXPORT PANVK MESA ENVS FIRST
  export BUILD=~/litert-lm-bench/mesa-26.1.2/build-panvk
  export VK_ICD_FILENAMES="$BUILD/src/panfrost/vulkan/panfrost_devenv_icd.aarch64.json"
  export LD_LIBRARY_PATH="$BUILD/src/panfrost/vulkan:$HOME/litert-lm-bench/prebuilt_v0171"

  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --vision gpu --image --iters 3

  # 5. FULL ACCELERATION: TEXT (GPU) + VISION (GPU)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text gpu --vision gpu --image --iters 3

  # 6. TEXT-ONLY CONTROLS (ISOLATE VISION-ENCODER COST)
  $VL_PY ~/litert-lm-bench/vl_bench.py --text cpu --iters 3
  $VL_PY ~/litert-lm-bench/vl_bench.py --text gpu --iters 3
Prints per-iteration TTFT / decode tok/s / reply. Run cases sequentially — parallel GPU runs contend for the Mali GPU and inflate the numbers (observed 2× TTFT when two ran at once). 6. Inference# 1. DIRECT CLI EVALUATION 
  litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
    --cache disk --prompt "What is the capital of France?"

  # 2. INTERACTIVE REPL MODE
  litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm

  # 3. OPENAI-COMPATIBLE API SERVER
  litert-lm serve ~/litert-lm-bench/gemma-4-E2B-it.litertlm
Vision (and audio) input uses run with attachments — one per --attachment, placed before the first user text (images and audio can be mixed): litert-lm run ~/litert-lm-bench/gemma-4-E2B-it.litertlm \
  --attachment ~/litert-lm-bench/test_multi.jpg \
  --prompt "What is in this image? Answer in one sentence." \
  --vision-backend cpu          
  # or gpu (patched panvk, §5) — ~2.7–3 s faster vision encode
 --vision-backend/--audio-backend pick the encoder lane independently of --backend (which chooses the LLM lane). Like --backend gpu, --vision-backend gpu needs the §5 env (VK_ICD_FILENAMES + LD_LIBRARY_PATH) exported for that run. Notes: --cache disk persists compiled artifacts next to the model — the first GPU load compiles shaders, later loads start instantly. The load time is NOT paid on every run. Observed caches: &lt;model&gt;_*_mldrift_program_cache.bin (compiled kernels) and&lt;model&gt;_*_mldrift_weight_cache.bin (GPU-rearranged weights, ~0.8 GB). The vision encoder's kernels live in the same cache files — first GPU --vision-backend gpu run compiles, later runs reuse. GPU (patched panvk) is ~2.8× faster at prefill and ~2.7× on TTFT, but ~30% slower at decode — pick the lane by workload (§7.4). Vision: --vision-backend gpu cuts vision-encode latency by ~2.7–3 s per image; CPU text + GPU vision is the best blend for short/chatty replies (§5 VL results). Speculative decoding (--speculative-decoding true) can lift decode on CPU+GPU for rewrite/summarize/coding style prompts (Gemma 4 E2B supports it). 7. GPU deep dive: the blocker and how it was unblocked hereEverything below was reproduced with LiteRT-LM v0.17.1 (CLI + litert-lm-api), Mesa 26.1.2 (trixie-backports), kernel 7.2.4-edge-rockchip64 (mainline panthor). 7.1 The panvk limit blocker — RESOLVED with a one-line local patchLiteRT's WebGPU accelerator uses Dawn, which enforces the WebGPU spec minimums against the Vulkan driver and refuses to proceed when they are unmet. Stock panvk reports: maxImageDimension3D = 512      # WebGPU spec requires ≥ 2048
Dawn logs exactly this (PhysicalDeviceVk.cpp:794: "Insufficient Vulkan limits for maxTextureDimension3D ... must be at least 2048"), and stock panvk then dies with a null-pointer dispatch (SIGSEGV, pc=0x0) inside the WebGPU path on the first real GPU execution. The root cause is the driver limit, not packaging: the crash is identical even with the WebGPU prebuilts (libLiteRtTopKWebGpuSampler.so + friends) fetched from the litert-lm repo prebuilt/linux_arm64 @ v0.17.1 on LD_LIBRARY_PATH. The fix (validated on this board): panvk caps 3D textures at 512 for Valhall (PAN_ARCH &lt;= 10), but the Mali-G610 hardware handles 2048³ — raising the advertised limit to 2048 makes Dawn accept the adapter: -.maxImageDimension3D = PAN_ARCH &lt;= 10 ? (1 &lt;&lt; 9) : (1 &lt;&lt; 14),
+.maxImageDimension3D = (1 &lt;&lt; 11),       /* 2048 — meets WebGPU min (was 512 on arch &lt;= 10) */
Why it's safe: Dawn only validates the advertised limit against its spec minimum, and the value also caps future image allocations — so if a kernel ever genuinely requested a 2048³ 3D texture, panvk would fail cleanly at allocation instead of corrupting anything. LiteRT/ML-Drift's LLM and vision-encoder kernels allocate buffers and 2D textures only, so real GPU behaviour is unchanged; Dawn simply stops rejecting the adapter, the SIGSEGV disappears, and the full benchmark runs (§5). Confirmed via vulkaninfo on the patched build: maxImageDimension3D = 2048. All other WebGPU minimums (per-stage descriptors, workgroup sizes, buffer ranges) were already comfortably met. The build is process-scoped (VK_ICD_FILENAMES + LD_LIBRARY_PATH per run), the system Mesa is never touched, and reverting is unsetting two variables. Unless/until Mesa raises this limit upstream for Valhall, keep this build around for LiteRT-LM GPU runs. 7.2 The vendor route (Rockchip libmali) — needs a different kernelRockchip's proprietary blob would satisfy Dawn (it exposes Vulkan 1.3 with full limits), but the blob's userspace talks to Rockchip's proprietary kbase kernel driver (/dev/mali) and cannot attach to the mainline panthor driver: "libmali-valhall-g610-g13p0-gbm"      → loads, exports NO Vulkan ICD (0 vk_* symbols)
"libmali-valhall-g610-g24p0-gbm"
  libMaliVulkan.so.1 (api 1.3.276)    → loads, "No mali devices found" then SIGSEGV (no /dev/mali)
Installable packages exist (tsukumijima/libmali-rockchip releases, e.g. v1.9-1-20260312-bd33ee2), but they all presume the vendor kernel. Unblock: flash a vendor-kernel image (kernel with kbase/mali.ko, e.g.  Armbian images with the Rockchip BSP kernel), then install libmali-valhall-g610-g13p0-gbm (or g24p0) and point Dawn/Vulkan at it (VK_DRIVER_FILES/LD_LIBRARY_PATH). That same blob also provides OpenCL 3.0 (libMaliOpenCL.so + /etc/OpenCL/vendors/mali.icd), which would additionally satisfy the "would OpenCL be faster?" curiosity — for running LLMs, both WebGPU/Vulkan and OpenCL on the same GPU land in the same class of throughput; the win is the mature compiler's fast startup, not raw speed.  7.3 OpenCL on the current kernel — not availableMesa's rusticl on panthor currently exposes zero devices (clinfo -l shows only the rusticl platform, no device). So there is no OpenCL device at all on the mainline stack, and LiteRT-LM has no Linux OpenCL accelerator anyway. 7.4 Practical advice for this board todayChat / streaming (decode-bound): CPU is the better lane — 12.3 vs 8.7 tk/s decode.Long prompts / RAG / document Q&amp;A (prefill-bound): GPU pays off — 345 vs 124 tk/s prefill, 3.1 vs 8.4 s TTFT.Images / VL: --vision-backend gpu cuts vision-encode latency by ~2.7–3 s (~30%). Shortest VL TTFT is text+vision both on GPU (5.6 vs 8.9 s all-CPU), but keep the LLM on CPU when replies are short and chatty (6.2 s TTFT plus CPU-fast decode). --speculative-decoding true can lift decode further on both lanes (Gemma 4 E2B supports it).Serving an OpenAI-compatible endpoint (litert-lm serve)litert-lm serve exposes an OpenAI API on 0.0.0.0:9379, so LAN clients (LiteCode, opencode, aider, Continue, scripts) use the board like any OpenAI endpoint. Import a model once (litert-lm import ./gemma-4-E2B-it.litertlm, registry at ~/.litert-lm/models/), then litert-lm serve. Per-model settings come from ~/.litert-lm/config.json (default + models.&lt;id&gt;), so clients stay plain-OpenAI: {
  "default": { "backend": "cpu", "cpu_thread_count": 8, "cache": "disk" },
  "models": { "gemma-4-E2B-it.litertlm": { "speculative_decoding": true, "max_num_tokens": 4096 } }
}
Endpoints: GET /v1/models and POST /v1/chat/completions (streaming + non-streaming). OpenAI tools / tool_choice are bridged to the model's function-calling template — verified to return valid tool_calls JSON (non-streaming and streamed) and to complete the full agent cycle (assistant tool_call → tool result → final answer). /v1/embeddings exists but is not tied to LLM models. Even though litert-lm describe reports Supports Function Call: NO for Gemma 4, the serve layer still bridges tools into the model template (empirically verified); that flag only means the CLI's interactive run has no native FC template. RAM budget (E2B, CPU): max_num_tokens preallocates KV/ringbuffer arenas up front.Measured process RSS: 4096 → ~3.1 GB (4.9 GB free — recommended), 8192 → ~7 GB (1.1 GB free — works but leaves no headroom). Keep 4096 and let clients budget. Config keys (0.15+): backend, vision_backend, audio_backend, cpu_thread_count, cache, max_num_tokens, speculative_decoding, thinking, thinking_budget, gpu_decode_steps_per_sync, sampling. CLI flags override config. For a persistent border, run under systemd. Verified client on this boardLiteCode (razvanneculai/litecode) — works end-to-end. Its Planner ({"synthesis","tasks"} strict JSON) and Executor (raw file content, no fences) prompts fit the 4096 budget; single-request task runs completed correctly and files linter-clean. litecode.json: {
  "provider": { "baseURL": "http://&lt;yourIP&gt;:9379/v1", "apiKey": "", "model": "gemma-4-E2B-it.litertlm" },
  "tokenLimit": 4096, "reservedOutputTokens": 1500, "systemPromptBudget": 1000, "maxParallelExecutors": 1
}
TroubleshootingFATAL ERROR: This binary was compiled with dotprod enabled... → CPU lacks FEAT_DotProd, not supported by the ARM64 prebuilt wheels. RK3588 has it. GPU benchmark errors but CPU works → with stock Mesa this is the §7.1 Dawn limit crash (maxImageDimension3D = 512); with the patched build, check vulkaninfo --summary again — panvk must list the Mali device and report maxImageDimension3D = 2048. ExportVK_ICD_FILENAMES+LD_LIBRARY_PATH for every run that should use the patched driver. Could not load shared library libLiteRtTopKWebGpuSampler.so → the CLI wheel does not bundle the WebGPU samplers; fetch them from the litert-lm repo prebuilt/linux_arm64/ at the matching version tag (e.g. v0.17.1) and export their directory on LD_LIBRARY_PATH. First GPU run is slow (one-time kernel compilation) — normal; use --cache disk so later loads skip it. Caches persist next to the model. Bigger models (e.g. stock gemma-4-E4B-it.litertlm, 3.66 GB) fail on the GPU even with the patched driver: panthor ... job timeout in dmesg (fixed 1 s driver watchdog, not tunable; the model has a one-shot dispatch that exceeds it even at the real 1 GHz boost) theVK_ERROR_DEVICE_LOST, and/or a global OOM-kill (EXIT=137) when pinned GPU buffers + the model outgrow 8 GB. E2B fits, E4B-stock doesn't. Use the text-only -web flavor (gemma-4-E4B-it-web.litertlm, 2.97 GB) for E4B-on-GPU — its finer kernels stay under the watchdog and its GPU set peaks ~4.3 GB (§5 E4B section). Join the conversation on the Armbian Forum and let us know how it runs on your hardware! View the full article]]></description><pubDate>Wed, 30 Sep 2026 15:24:54 +0000</pubDate></item><item><title>[CNX-Software] - OpenArm 2.0 &#x2013; An open-source 7-DOF robot arm with QDD joints, bilateral force feedback, in-hand camera&#xA0;</title><link><![CDATA[https://testforum.armbian.com/topic/62453-cnx-software-openarm-20-an-open-source-7-dof-robot-arm-with-qdd-joints-bilateral-force-feedback-in-hand-camera%C2%A0/?do=findComment&comment=243608]]></link><description>Tokyo-based Enactic OpenArm 2.0 is an open-source hardware 7-DOF robot arm designed for physical AI research, teleoperation, and contact-rich data collection. It uses quasi-direct-drive (QDD) backdrivable joints to support compliant motion and bilateral force-feedback control. The arm supports 4.1 kg nominal and 6 kg peak payload, features 1 kHz CAN-FD control, and a compact parallel gripper with an in-hand camera and replaceable fingers. It supports bilateral force-feedback teleoperation, gravity compensation, and compliant interaction, with an aluminum and stainless-steel structure and MISUMI-frame base. The ecosystem also includes the OpenArm Cell for standardized evaluation and OpenArm KER, a motorless replica for teleoperation and data collection. Open-source CAD, BOM, firmware, control software, ROS 2, MuJoCo, Isaac Lab, and dataset tools support applications such as imitation learning, reinforcement learning, sim-to-real, and robotic manipulation. OpenArm 2.0 specifications: Communication CAN-FD (recommended): nominal 1 Mbps, data 5 Mbps, control loop 1 kHz Classic CAN 2.0 fallback @ [...] 
The post OpenArm 2.0 &#x2013; An open-source 7-DOF robot arm with QDD joints, bilateral force feedback, in-hand camera  appeared first on CNX Software - Embedded Systems News. 
View the full article</description><pubDate>Wed, 30 Sep 2026 09:00:23 +0000</pubDate></item><item><title>[Collabora] - AMD Embedded Computing Summit 2026 in Frankfurt</title><link><![CDATA[https://testforum.armbian.com/topic/62317-collabora-amd-embedded-computing-summit-2026-in-frankfurt/?do=findComment&comment=243351]]></link><description>We&#x2019;ll be in Frankfurt this Thursday for the AMD Embedded Computing Summit! See a live demo of our AI Magic Mirror for a touchless, real-time experience.
  View the full article</description><pubDate>Tue, 29 Sep 2026 20:39:18 +0000</pubDate></item><item><title>Bluetooth keyboard not working on orange pi 4 pro</title><link><![CDATA[https://testforum.armbian.com/topic/62302-bluetooth-keyboard-not-working-on-orange-pi-4-pro/?do=findComment&comment=243321]]></link><description>The new Orange Pi 4 Pro image connects to Bluetooth keyboards perfectly, but typing doesn't work because uinput is completely missing from the 6.6.98-vendor-sun60iw2 kernel config.</description><pubDate>Mon, 28 Sep 2026 17:43:12 +0000</pubDate></item></channel></rss>
