6.5 KiB
Turing RK1 media-center image
This project now produces a complete, flashable home-theater image for a Turing RK1 on a Jetson Orin Nano/NX-compatible HDMI carrier. It uses Debian 13 (Trixie) userspace on Armbian Community with the Rockchip vendor 6.1.115 kernel, then starts Kodi directly on DRM/KMS through GBM—there is no desktop or display manager in the way.
The intentionally non-obvious choice is the kernel. Armbian also offers newer mainline kernels, but the vendor 6.1 branch is currently the coherent path for RK3588 HDMI, RKMPP VPU, RGA, and RKNPU support. “Newest kernel number” and “most complete RK3588 appliance” are not the same target.
Ready artifact
dist/rk1-media-20260817-r4-trixie-vendor-6.1.115-turing-rk1-emmc.img.xz- SHA-256:
bb4fc337f1293fb2b2423b34e8fff370ed69e9ec8709c7da87fdfeea2a516f04 - Compressed size: 591,529,876 bytes; raw image: 4 GiB
- Initial target: whole eMMC (the included guarded helper can then move
/to NVMe while retaining RK1 U-Boot and/booton eMMC) - Login:
rkadminusing the sole public key whose fingerprint is recorded in the adjacent manifest - Hostname after first boot:
rk1-media.local
There is no password login and no root login. The image contains no SSH private
key and no image-time SSH host key. Unique host keys are generated before SSH
can start. rkadmin has passwordless sudo because its only authentication path
is a supplied public key.
Read FLASHING.md before writing eMMC. The included flasher requires the target path twice, rejects mounted targets, verifies the compressed image, and reads the written bytes back.
Hardware stack
- GPU: Panthor kernel DRM plus Mesa Panfrost/PanVK (OpenGL ES/OpenGL/Vulkan).
- Video: matched RKMPP decode/encode and RGA zero-copy/scaling stack isolated
under
/opt/rkmedia; system FFmpeg libraries are not replaced. - Kodi: direct GBM/GLES appliance service on tty1, running as a locked
kodiuser rather than root. - Decode: H.264, HEVC, VP9, AV1, and MJPEG RKMPP paths.
- Encode: H.264, HEVC, and MJPEG RKMPP paths.
- NPU: pinned RKNN Runtime 2.3.2, RK3588 model, per-core inference test, and local diagnostics.
- HDMI support: exact
rk3588-turing-rk1.dtb, HDMI PHY/audio nodes, Panthor overlay, ALSA, CEC utilities, and IR keymap support.
The open Panthor/Mesa GPU route does not provide Mali OpenCL. Proprietary libMali/OpenCL requires the mutually incompatible Mali kbase stack; it is not mixed into this media image. The RK3588 NPU remains available through RKNN.
Build it again
On an ARM64 build host:
cd /home/ubuntu/rk1-media-image
./build.sh --ssh-public-key /absolute/path/to/authorized_keys
The key file can hold multiple plain OpenSSH public-key lines. Private keys and
authorized-key options are rejected. The build needs no root access, mounts, or
loop devices. It verifies/downloads locked inputs, verifies 140 locked Debian
dependency packages, reproducibly repacks the Kodi bundle, installs the RKNN
runtime into the filesystem, expands the GPT/ext4 image, and emits checksums and
a manifest under dist/.
Validation:
./tests/run-static.sh
./tests/validate-image.sh \
dist/rk1-media-20260817-r4-trixie-vendor-6.1.115-turing-rk1-emmc.img
The produced image uses a checksum-locked Armbian release asset. armbian/
also contains a source-level base-image recipe pinned to the Armbian framework,
kernel, U-Boot, RKBin, and firmware commits. Archive package versions are
captured separately; true byte-for-byte source rebuilds additionally require a
package-repository snapshot.
First boot
Connect Ethernet and HDMI before powering on. Armbian expands the root
filesystem, creates the unique machine/SSH identity, and makes SSH available.
An offline one-shot service then installs the 141-package graphics/media bundle,
reloads device permissions, enables Avahi, and starts Kodi. This can take a few
minutes; do not remove power while rk1-media-provision.service is active.
ssh [email protected]
systemctl status rk1-media-provision.service kodi-rk.service
journalctl -u rk1-media-provision.service -u kodi-rk.service -b
Revision r4 includes the SSH runtime-directory correction introduced in r2,
fixes first-boot offline APT acquisition and Kodi service ordering, and contains
only the dedicated rk1-media public key. Its fingerprint is
SHA256:12b/wcqo8/yLfZ2OnLYga9baOt6tIlOSVZWrnjXtuN4. The superseded
unrevisioned image could leave port 22 closed, while r3 could fail during its
offline package transaction and then deadlock while starting Kodi. Neither
should be used for a new flash; the repaired live r3 system does not need to be
reflashed.
The provisioner retries on the next boot if it does not reach its success marker. Platform kernel/DTB/U-Boot packages are held; Debian security updates are automatic, while platform/media upgrades require an intentionally tested image rebuild.
Continue with ACCEPTANCE.md. Static validation cannot prove the carrier’s physical HPD/DDC/TMDS path, the TV’s EDID, DRM-master acquisition, or sustained 4K acceleration.
Move the root filesystem to NVMe
Flash and boot the image from eMMC first. After first-boot provisioning has
completed, the image includes a guarded migration helper that keeps U-Boot and
/boot on eMMC, creates a fresh ext4 filesystem on the selected NVMe, copies
the live root, and validates the UUIDs, filesystem, fstab, and boot environment
before allowing a reboot:
findmnt -no SOURCE,FSTYPE /
lsblk -e7 -o NAME,PATH,SIZE,TYPE,FSTYPE,MOUNTPOINTS,MODEL,SERIAL
sudo rk1-media-migrate-root-to-nvme \
--target /dev/nvme0n1 \
--serial EXACT_SERIAL_FROM_LSBLK
sudo systemctl reboot
The selected NVMe is erased. Do not use Armbian's split-emmc mode for this
workflow: the eMMC is the boot medium and rollback copy. After reboot,
findmnt / should report the NVMe partition while /boot and
/media/boot-media resolve to eMMC. See FLASHING.md for the
rollback command.
Project layout
image/: rootless raw-image composition and first-boot services.media/: deterministic release repack and fully pinned native source recipe.runtime/: RKNN runtime installer, NPU test, hardware self-test, diagnostics.packages/: exact Debian dependency integrity lock and fetcher.armbian/: source-pinned Armbian base-image recipe.tests/: package, dependency, runtime, and loopless image validation.scripts/: locked input fetcher and guarded eMMC flasher.
See DESIGN.md for pins, trust boundaries, and tradeoffs.