LILYGO T-Display-K230 · hardware note · observed

The first NixOS userspace on this board

On 2026‑09‑20 the board reached a root shell and answered questions. Five commands, and each one of them closes something this project had only been able to argue about from source.

Observed
2026-09-20
/dev/ttyACM0, 115200 8N1
Kernel
Linux 6.6.36 #1-NixOS
Xuantie, riscv64
CPU
thead,c908 · mvendorid 0x5b7
one hart under Linux
Memory
935 MB usable
of the 1 GiB LPDDR
Root
/dev/mmcblk1p2, ext4
resolved via the NIXOS_SD label

the capture

Five commands that only this board could answer

Captured with tools/capture-boot.py over the CH342 bridge. These are commands run on the board, not on the build host — which is the entire point, and is why each one was chosen to be unfakeable somewhere else.

[root@nixos:~]# cat /proc/cpuinfo
processor	: 0
hart		: 0
isa		: rv64imafdcv_zicbom_zicboz_zicntr_zicsr_zifencei_zihpm_zba_zbb_zbs_svpbmt
mmu		: sv39
uarch		: thead,c908
mvendorid	: 0x5b7
marchid		: 0x8000000009140d00
mimpid		: 0x50000

[root@nixos:~]# uname -a
Linux nixos 6.6.36 #1-NixOS SMP Tue Jan  1 00:00:00 UTC 1980 riscv64 GNU/Linux

[root@nixos:~]# cat /proc/cmdline
console=ttyS0,115200n8 root=fstab loglevel=4 lsm=landlock,yama,bpf init=/nix/store/2h0xrlf5n74fjjhxqd18y6vl55w4zyrr-nixos-system-nixos-26.11.20260919.20b1ddd/init

[root@nixos:~]# findmnt -no SOURCE,FSTYPE /
/dev/mmcblk1p2 ext4

[root@nixos:~]# nproc; free -m | head -2
1
               total        used        free      shared  buff/cache   available
Mem:             935         136         773           6         101         798

The raw capture, escape sequences and all, is committed at docs/evidence/hardware-userspace.md. Elided above: the bracketed‑paste sequences the shell emits around every prompt, and the empty prompts between commands. No output line is changed.

line by line

What each line settles

the line what it is what it closes
uarch : thead,c908
mvendorid : 0x5b7
T-Head’s JEDEC vendor ID and the C908 core name, read out of the hart’s own CSRs
We are on the real silicon. These values are read from a T‑Head hart’s own machine CSRs; the x86 build host has no way to produce them, and the emulated virt machine this project boots under is not a C908. Every claim below inherits this one.
Linux nixos 6.6.36
#1-NixOS … riscv64
the kernel banner: version, build number, architecture
It is our kernel, not the vendor’s. The board shipped running RT‑Smart out of Canaan’s image. This is the Xuantie 6.6.36 tree built by this flake, running as a NixOS system.
init=/nix/store/2h0x…
-nixos-system-nixos-…/init
the kernel command line as the kernel received it
Our command line got through. It is character-for-character the string the SD image derivation writes into bootargs.txt. Getting it there took a fix in the U‑Boot environment — the whole story is in the boot-chain note.
/dev/mmcblk1p2 ext4
what / is actually mounted from
root=fstab works here. There is no explicit root= on that command line, so the initrd resolved the device through its own fstab and the NIXOS_SD label. Until this boot every root mount had been done for us by the vendor fallback string; the label path had never once been exercised.
nproc → 1
Mem: 935
harts Linux is scheduling on, and usable RAM
One hart, 935 MB. The memory figure is unremarkable. The hart count is not what the specs expected, and the next section is about why it is nevertheless correct.

the finding

Linux gets one hart, and that is the device tree, not a mistake

The K230D has two C908 cores. Linux sees one. The first instinct — that something in our configuration switched SMP off — is wrong, and it is worth being precise about why, because the wrong diagnosis here costs a day.

Kendryte K230D two C908 harts in silicon cpu@0 thead,c908 · rv64imafdcv declared in k230.dtsi the other C908 no cpu@1 in any K230 DT invisible to Linux described → booted Canaan AMP split Linux 6.6.36 #1-NixOS nproc → 1 CONFIG_SMP=y, one hart to use RT-Smart firmware the vendor’s own OS still resident; not ours to schedule THE TRAP dts/canaan/ does contain cpu@1 nodes. Every one of them belongs to the K210, an unrelated part. grep for cpu@1 in that directory and you will find one. It is not this chip’s.
The second core is not missing; it is spoken for. CONFIG_SMP=y is set, so the kernel would happily bring up a second hart if one were described to it. Nothing describes one: k230.dtsi declares cpu@0 and stops. The K210 device trees in the same directory do declare a cpu@1, which is a good way to convince yourself K230 support has it too, and a wrong one.

scope

What this boot does not prove

A prompt is a prompt. Almost everything this board is for is still dark, and the milestone is worth nothing if it is allowed to imply otherwise.

1

The panel has not lit

The RM69A10 init sequence, the DSI timings and the reset polarity are all still transcription from vendor code. See the panel contract for what is written down and what is guessed.

2

Touch, radio and camera are untested

The GT9895 now gets a chance to bind and the probe tooling exists, but nothing on the silicon map beyond the SD card and the console has been exercised on a running Linux.

3

Nothing is watching the temperature

The sensor binds and the thermal core is present, and between them they do exactly nothing. The thermal note is precise about the gap, and about what to measure first.

4

One boot is one boot

root=fstab resolved once. Generation selection does not exist — the U‑Boot environment loads exactly one kernel by literal filename — so a bad rebuild is still recovered with a card reader, not a boot menu.

Transcript: docs/evidence/hardware-userspace.md, captured 2026-09-20 with tools/capture-boot.py over /dev/ttyACM0 at 115200 8N1. The boot chain that preceded it, failures included, is in docs/evidence/hardware-boot.txt.

Device-tree claims: ruyisdk/linux-xuantie-kernel @ 7d4e1f4 — arch/riscv/boot/dts/canaan/k230.dtsi, and the absence of a cpu@1 anywhere under arch/riscv/boot/dts/canaan/ that is not a K210 file.

House rule in force: observations outrank vendor source, and a datasheet grounds nothing. This page is the first one on this site written entirely from observations.