Initial RK1 media-center image project
This commit is contained in:
@@ -0,0 +1,147 @@
|
||||
# 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 `/boot` on eMMC)
|
||||
- Login: `rkadmin` using 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](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 `kodi`
|
||||
user 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:
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
./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.
|
||||
|
||||
```bash
|
||||
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](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:
|
||||
|
||||
```bash
|
||||
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](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](DESIGN.md) for pins, trust boundaries, and tradeoffs.
|
||||
Reference in New Issue
Block a user