evidence · 2.2 KiB

README.md

Committed at docs/evidence/keyboard-base/backlight/README.md. This is what grounds the requirements that cite it.

Open raw source

Dimmable key backlight on PWM4 (task 4.2)

Installed system /nix/store/5dchd37z…-nixos-system-nixos-26.11.20260919.20b1ddd (.#kernelMainlineDrmShellLandscapeBootFiles from impl/kbd-pwm-backlight), booted 2026-10-14 11:09 CDT on the second board in its keyboard case.

Board-read

$ dmesg | grep pwm
[    2.499143] k230-pwm 9140a040.pwm: 100000000 Hz
$ cat /sys/class/leds/k230::kbd_backlight/max_brightness
255
$ grep "pin 52" /sys/kernel/debug/pinctrl/*/pinmux-pins
pin 52 (IO52): device keyboard-base-backlight function kbd-backlight-pins group kbd-backlight-cfg

PWM registers (devmem) after writing each brightness. 0x9140a040 is PWMCFG, 0x9140a060 is pwmcmp0 (the period), and 0x9140a068 is pwmcmp2 (channel 1, PWM4):

b=255 cfg=0xE0001200 cmp0=0x00001387 cmp2=0x00000000
b=128 cfg=0xA0001200 cmp0=0x00001387 cmp2=0x000009BB
b=32  cfg=0xA0001200 cmp0=0x00001387 cmp2=0x00001115
b=4   cfg=0xA0001200 cmp0=0x00001387 cmp2=0x0000133A
b=0   cfg=0xA0001200 cmp0=0x00001387 cmp2=0x00001388

The period is 5000 ticks of the 100 MHz clock (50 µs, 20 kHz). The compare value is the period minus the on-time, so 0 is always on and 5000 is never on. The top bits of PWMCFG are the block’s interrupt-pending flags.

Operator (camera waived)

With shell-keyboard-base.service stopped, a loop wrote 255, 128, 32, 4 and 0, four seconds each, for six rounds. It ran twice. Operator, 2026-10-14: “it dims fine, off is dark”. This confirms the NORMAL-polarity reading of the comparator in nix/patches/mainline/pwm-k230.c: the output is high while the counter is >= pwmcmpN.

Settings slider, live (board, 2026-10-14)

Settings stores the Key backlight level at each slider detent, and keyboard_based.py polls the file every 0.2 s and lights the keys at a new level for a 3 s preview. Board read, preference written over SSH, LED brightness read 0.5 s after each write:

pref=medium led=0
low -> 20
medium -> 76
high -> 255
after preview -> 0

Operator, 2026-10-14, dragging the slider on the glass: “works live now”.

settings-slider-board-grim.png is a native grim capture of the landscape Settings page at 2026-10-14T14:27:03-05:00, the slider at High with its four detents.