displaywatch: panel takeover at boot, daily re-init, cold/warm boot log

Investigation on a returned unit (docs/display-blank-investigation.md):
the dark-panel/backlight-on failure reproduces with a warm reboot or a
200 ms pulse on the panel reset line, with no kernel message. After the
U-Boot logo hand-off the panel powers/avee GPIOs stay undriven inputs.

- Fresh boot: DPMS off/on before the UI starts (unit Before=buttontask),
  so the driver runs the full panel power-on and drives those lines.
- Daily preventive re-init (01:30 UTC, or every 24 h of uptime without
  NTP); not counted towards reboot escalation.
- Previous boot found by saved boot_id, not 'journalctl -b -1' (clock
  jumps reorder boots); log cold/warm boot from the rk809 RTC (reset to
  2017-08-04 on power loss); keep the RTC set from NTP; uptime in every
  incident line; loop timers on the monotonic clock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-11 00:50:37 +00:00
co-authored by Claude Opus 5.5
parent 1dc88fabf5
commit 66578a0925
3 changed files with 260 additions and 17 deletions
+5 -1
View File
@@ -1,6 +1,8 @@
[Unit]
Description=ButtonTask display/GUI watchdog (panel re-init, crash escalation)
After=buttontask.service
# Before the UI: on a fresh boot it re-inits the panel while nobody holds the
# display, then reports READY and buttontask starts (see boot_takeover).
Before=buttontask.service
StartLimitIntervalSec=0
[Service]
@@ -9,6 +11,8 @@ StartLimitIntervalSec=0
Type=notify
NotifyAccess=main
WatchdogSec=60
# Never hold the UI back for long if something hangs before READY.
TimeoutStartSec=30
Environment=BUTTONTASK_ROOT=/opt/buttontask
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /opt/buttontask/scripts/bt-displaywatch run