displaywatch: log SoC temperature with every line

Helps tell a hot-panel blackout from other causes; investigation notes updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-12 12:54:25 +00:00
co-authored by Claude Opus 5.5
parent 66578a0925
commit 7db69d1397
2 changed files with 54 additions and 5 deletions
+44 -4
View File
@@ -16,8 +16,21 @@
| gpio-18 (GPIO0_C2) | `enable-gpios` | out, high | out, high |
| gpio-20 (GPIO0_C4) | `avee-gpios` | **in, high** | out, high |
Неуправляемая линия включения питания панели (`powers`, `avee`) уязвима к помехам. Импульсная помеха или просадка по PoE может снять питание или сбросить контроллер панели при живом SoC. Это совпадает с наблюдениями на объектах: ядро живо, тач работает, картинки нет.
4. **Лечится без перезагрузки:** `blank` / `unblank` дисплея (`/sys/class/graphics/fb0/blank`: 4, затем 0) при остановленном UI. Драйвер панели выполняет полную последовательность: питание, сброс, init-команды. После этого все четыре линии становятся управляемыми выходами.
После U-Boot `powers` — вход с низким уровнем, а панель при этом работает. Значит, эта линия, скорее всего, питание панели не отключает. `avee` — вход с высоким уровнем при внутренней подтяжке вниз (`GPIO0_C4_d`), то есть её держит в высоком уровне что-то на плате. Неуправляемая линия `avee` может быть уязвима к помехам: импульсная помеха или просадка по PoE снимет питание или сбросит контроллер панели при живом SoC. Это гипотеза, не доказано. Совпадает с наблюдениями на объектах: ядро живо, тач работает, картинки нет.
4. **Конфликт выводов в device tree.** В дереве описана вторая подсветка `backlight1` на контроллере `pwm@fe6e0010` (PWM5). Её настройка выводов `pwm5-pins` — это **GPIO0_C4, та же нога, что `avee` панели**. Сейчас ногу держит панель (функция GPIO). PWM5 не включён, его настройка выводов не применена (`current state: none`), скважность 0. Если `backlight1` активируют (запись в `/sys/class/backlight/backlight1`, иной порядок загрузки драйверов), нога может переключиться на ШИМ со скважностью 0. Тогда `avee` упадёт в ноль: картинки нет, подсветка (PWM4, GPIO0_C3) горит. Срабатывание не проверено, но сама ошибка в дереве очевидна. Наше ПО `backlight1` не трогает (`bt-brightness` работает с `backlight`).
Распределение выводов на работающем устройстве (`/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins`):
| вывод | функция | владелец |
|---|---|---|
| GPIO0_C0 | GPIO | панель, `reset` |
| GPIO0_C1 | GPIO | панель, `powers` |
| GPIO0_C2 | GPIO | панель, `enable` |
| GPIO0_C3 | PWM4 | `backlight` (рабочая подсветка) |
| GPIO0_C4 | GPIO | панель, `avee`; **на неё же указывает `pwm5-pins` для `backlight1`** |
UART0 (альтернатива для C0/C1) в дереве выключен. Видеовыход — только DSI-1 (480×480p60, Video Port1). HDMI описан, но выключен.
5. **Лечится без перезагрузки:** `blank` / `unblank` дисплея (`/sys/class/graphics/fb0/blank`: 4, затем 0) при остановленном UI. Драйвер панели выполняет полную последовательность: питание, сброс, init-команды. После этого все четыре линии становятся управляемыми выходами.
## Как воспроизвести
@@ -50,7 +63,8 @@ systemctl start buttontask
1. В device tree и U-Boot: линии `powers-gpios` (GPIO0_C1) и `avee-gpios` (GPIO0_C4) должны с момента включения быть **выходами** в активном уровне. Не оставлять их входами после передачи дисплея от U-Boot ядру. Подтянуть их резисторами на плате, если это предусмотрено схемой.
2. Объяснить, почему после тёплой перезагрузки (питание панели не снималось) панель не инициализируется заново. Вероятно, U-Boot не выполняет сброс и init-последовательность панели, если она уже была включена, а ядро не делает этого из-за передачи логотипа.
3. Проверить помехоустойчивость линии сброса панели (GPIO0_C0) и питания панели при работе от PoE: просадки и импульсные помехи при включении других PoE-нагрузок.
4. По возможности: способ из ядра узнать, что панель жива. Например, периодическое DCS-чтение `get_power_mode` (0x0A), чтобы сбой обнаруживался автоматически.
4. Убрать конфликт в device tree: `backlight1` (PWM5, `pwm5-pins` = GPIO0_C4) указывает на ногу `avee-gpios` панели. Отключить `pwm@fe6e0010` и `backlight1`, если вторая подсветка не используется.
5. По возможности: способ из ядра узнать, что панель жива. Например, периодическое DCS-чтение `get_power_mode` (0x0A), чтобы сбой обнаруживался автоматически.
## Что сделано в нашем ПО (обход)
@@ -59,6 +73,32 @@ systemctl start buttontask
- При каждой загрузке, до запуска UI, `bt-displaywatch` выполняет одну такую переинициализацию. Юнит запускается `Before=buttontask.service`, функция `boot_takeover`. Драйвер берёт линии питания панели под управление, и закрывается тёмный экран после тёплой перезагрузки. Проверено на возвращённом экземпляре: после загрузки `powers`/`avee` стали `out hi`, UI стартует после переинициализации (~0,5 с чёрного экрана до UI).
- Раз в сутки ночью (01:30 UTC = 04:30 МСК, настраивается через `DISPLAYWATCH_DAILY_UTC`) выполняется профилактическая переинициализация: экран моргает примерно на 6 с, приложение перезапускается. Тихий сбой панели (без ошибок ядра и без падения линка) со стороны SoC не обнаружить, поэтому так он длится не дольше суток. Без синхронизированного времени переинициализация выполняется раз в 24 часа аптайма.
- В журнале инцидентов (`/var/log/buttontask/display-incidents.log`) при каждом старте записывается `COLD boot` (питание пропадало) или `WARM boot`, а также как закончилась предыдущая загрузка.
- Каждая строка журнала содержит аптайм и температуру SoC: `2026-11-11 13:03:16 up 44433s 52C …`.
## Другие возможные причины того же симптома
Симптом «подсветка горит, картинки нет, ядро живо» дают и другие причины. Воспроизведённый механизм — самый вероятный, но для объекта не доказан.
| # | причина | признаки | что помогает |
|---|---|---|---|
| 1 | Статика (ESD) при касании: контроллер панели сбрасывается или «зависает» | сбои зимой, при сухом воздухе; кнопку постоянно трогают | переинициализация |
| 2 | Просадка питания панели (PoE, стабилизатор на плате) | совпадения с отключением линка в журнале | переинициализация |
| 3 | Сбой DSI или видеоконтроллера SoC | ошибки DRM/DSI в журнале ядра | переинициализация (срабатывает автоматически) |
| 4 | Приложение рисует чёрное (падение Qt, зависание GPU) | `ui restarted` / `ui frozen` в журнале | перезапуск приложения (вотчдоги) |
| 5 | Шлейф или разъём панели (окисление, вибрация) | помогает нажать на корпус; со временем чаще | ремонт; переинициализация не поможет |
| 6 | Перегрев панели: жидкий кристалл выше ~70–80 °C перестаёт работать | кнопка на солнце, за стеклом, у батареи; высокая температура в журнале | проходит сам после остывания |
| 7 | Деградация панели или её драйвера | отказы всё чаще, затем насовсем | замена |
**Как различить на объекте:**
| что вернуло картинку | вероятная причина |
|---|---|
| жест в углу или автоматическая переинициализация | 1, 2, 3, воспроизведённый механизм |
| перезапуск приложения | 4 |
| только передёргивание питания | 5, 7 или неполная переинициализация |
| экран вернулся сам, когда кнопка остыла | 6 |
Журнал инцидентов фиксирует жест, автоматические переинициализации и температуру. Помогла ли переинициализация, видит только человек у экрана. Персонал стоит попросить отмечать это при жалобе.
## Прочие наблюдения
@@ -87,5 +127,5 @@ systemctl start buttontask
- Раз в сутки ночью экран будится профилактически, на несколько секунд.
- У персонала есть «кнопка спасения»: подержать палец 10 секунд в нижнем левом углу экрана.
**Что должен сделать производитель платы.** Исправить начальную прошивку, чтобы провода питания экрана с самого включения были под управлением. Проверить, насколько плата и экран устойчивы к помехам по питанию PoE.
**Что должен сделать производитель платы.** Исправить начальную прошивку, чтобы провода питания экрана с самого включения были под управлением. Убрать из настроек платы ошибку, из-за которой один из этих проводов одновременно назначен и экрану, и второй, неиспользуемой подсветке. Проверить, насколько плата и экран устойчивы к помехам по питанию PoE.