From 992796345c1211f03fb934adf7c8a5bad795da89 Mon Sep 17 00:00:00 2001 From: raw-designs Date: Wed, 2 Sep 2026 02:11:29 +0200 Subject: [PATCH] fix(P4): Bridge-Grundeinstellung nach dem DSI-Start wiederholen (1.6.20) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Beobachtung am Gerät: Beim Einschalten geht nach 2-3 s die Beleuchtung an, dann kommt nichts. Nach einem Reset geht die Beleuchtung kurz aus, danach erscheint Beleuchtung samt Bild - reproduzierbar in zwei von zwei Fällen. Dass die Beleuchtung ausgeht, zeigt: Die Bridge folgt dem DSI-Signal. Und dass der zweite Durchlauf klappt, zeigt warum - die Bridge hatte ihre Grundeinstellung aus dem ersten Durchlauf noch und fand diesmal ein DSI-Signal vor. Beim ersten Start bekommt sie ihre Einstellung dagegen, bevor die DSI-Strecke überhaupt existiert. ws7_bridge_core_init() ist aus ws7_bridge_pre_init() herausgelöst und wird jetzt ein zweites Mal aufgerufen, sobald esp_lcd_panel_init() läuft - dasselbe Vorgehen wie bei ws7_panel_wake() in 1.6.19. Die Register sind wiederholbar. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01P7JsiDJ1QbNFLDz5chf8Jt --- P4_Display_Firmware/Changelog.txt | 14 ++++++++++++++ P4_Display_Firmware/board_bringup.c | 25 ++++++++++++++++++++----- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index 2f7b8a6..c704819 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,17 @@ +Version 1.6.20: +- Nach 1.6.19 lief es reproduzierbar so ab: Beim Einschalten ging nach zwei bis drei + Sekunden die Hintergrundbeleuchtung an, dann kam nichts mehr; nach einem Reset ging die + Beleuchtung kurz aus und danach erschien Beleuchtung samt Bild. Daraus folgt der letzte + fehlende Schritt: Auch die Grundeinstellung der Bridge lief bisher nur einmal, und zwar + bevor die DSI-Strecke ueberhaupt existierte. Beim Reset half es nur deshalb, weil die + Bridge ihre Einstellung aus dem vorigen Durchlauf noch hatte und diesmal ein DSI-Signal + vorfand. +- Die Grundeinstellung der Bridge wird jetzt ein zweites Mal geschrieben, sobald die + Videoausgabe laeuft - dasselbe Vorgehen wie bei den Weckbefehlen des Panels in 1.6.19. + Damit wird ohne Reset erreicht, was vorher erst der zweite Durchlauf brachte. +- Im Start-Log sind beide Durchgaenge benannt ("Bridge-Grundeinstellung vor dem DSI-Start" + und "... nach dem Start der Videoausgabe"). + Version 1.6.19: - Die Wartezeit aus 1.6.18 hat den Start deutlich verbessert, aber noch nicht zuverlässig gemacht. Aus dem verbliebenen Fehlerbild folgt der nächste Schritt: Die Beleuchtung ging diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index 8ca9e0d..d69e8ef 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -193,8 +193,24 @@ static void ws7_bridge_write(uint8_t reg, uint8_t value) } } -// Bridge am I2C-Bus anmelden und Grundinitialisierung schreiben. Muss VOR dem -// DSI-Bringup laufen; die Hintergrundbeleuchtung bleibt dabei noch aus. +// Grundeinstellung der Bridge. Bewusst mehrfach aufrufbar, siehe unten. +// +// Warum zweimal: Beim ersten Aufruf existiert die DSI-Strecke noch gar nicht - die Bridge +// bekommt ihre Einstellung also, bevor ein Signal anliegt. Beim ersten Einschalten reichte +// das nicht: Die Beleuchtung ging an (die haengt an der Bridge), ein Bild kam aber nicht. +// Erst ein Reset half - und dann nur deshalb, weil die Bridge ihre Einstellung aus dem +// vorigen Durchlauf noch hatte und diesmal ein DSI-Signal vorfand. Genau das holt der +// zweite Aufruf nach, ohne dass ein Reset noetig ist. Die Register sind wiederholbar. +static void ws7_bridge_core_init(const char *wann) +{ + esp_rom_printf("[Panel] Bridge-Grundeinstellung %s\n", wann); + ws7_bridge_write(0xC0, 0x01); + ws7_bridge_write(0xC2, 0x01); + ws7_bridge_write(0xAC, 0x01); +} + +// Bridge am I2C-Bus anmelden und erstmalig einstellen. Laeuft VOR dem DSI-Bringup; +// die Hintergrundbeleuchtung bleibt dabei noch aus. static void ws7_bridge_pre_init(void) { i2c_device_config_t dev_cfg = { @@ -206,9 +222,7 @@ static void ws7_bridge_pre_init(void) s_bridge_handle = NULL; return; } - ws7_bridge_write(0xC0, 0x01); - ws7_bridge_write(0xC2, 0x01); - ws7_bridge_write(0xAC, 0x01); + ws7_bridge_core_init("vor dem DSI-Start"); } void jc_backlight_init(void) @@ -536,6 +550,7 @@ bool jc_board_bringup(void) // Zweiter Anlauf, jetzt bei laufender Videoausgabe: faengt den Fall ab, dass das // Panel beim ersten Mal noch nicht aufnahmebereit war. vTaskDelay(pdMS_TO_TICKS(WS7_PANEL_SETTLE_MS)); + ws7_bridge_core_init("nach dem Start der Videoausgabe"); ws7_panel_wake(io, "nach dem Start der Videoausgabe"); #if WS7_TEST_PATTERN // Prueffarbbalken: Sie entstehen im DSI-Baustein selbst und benutzen weder den