From 50540179c77dc6b6a97b1e40a19e2fe94cf91d6f Mon Sep 17 00:00:00 2001 From: raw-designs Date: Tue, 1 Sep 2026 16:30:31 +0200 Subject: [PATCH] fix(P4): Touch erst nach Panel-Freigabe initialisieren (1.6.14) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der GT9271 meldete "i2c transaction failed" auch beim Kaltstart, während alle Panel-Schritte fehlerfrei durchliefen und die Bus-Freitaktung aus 1.6.13 den Bus als frei meldete. Ursache ist die Reihenfolge: Im funktionierenden Werks-Testsketch steht initTouch() hinter enableBacklight(). Der GT9271 hängt an derselben Versorgung wie das Panel und antwortet erst, wenn die Bridge über 0xAD freigegeben ist. Beim Übertragen in die Firmware war das verloren gegangen - jc_backlight_set() lief erst nach jc_board_bringup(). - Für WS_PANEL_7H wird die Beleuchtung jetzt innerhalb des Bringups vor der Touch-Initialisierung eingeschaltet, mit WS7_TOUCH_POWER_MS Pause. - Neue Diagnose ws7_i2c_scan() listet die antwortenden I2C-Adressen vor und nach dem Panel-Start. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y --- P4_Display_Firmware/Changelog.txt | 12 ++++++++++++ P4_Display_Firmware/board_bringup.c | 25 +++++++++++++++++++++++++ P4_Display_Firmware/pins_config.h | 5 +++++ 3 files changed, 42 insertions(+) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index e7542d6..cdc0eba 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,15 @@ +Version 1.6.14: +- Der Touch-Controller wird jetzt erst angesprochen, nachdem die Bridge freigegeben und die + Hintergrundbeleuchtung eingeschaltet ist. Der GT9271 haengt an derselben Versorgung und + antwortet vorher nicht auf I2C - deshalb schlug seine Initialisierung bisher schon beim + Kaltstart fehl. In der Werks-Testskizze steht die Touch-Initialisierung aus demselben + Grund hinter dem Einschalten der Beleuchtung; beim Uebertragen in die Firmware war diese + Reihenfolge verloren gegangen. +- Die Wartezeit dazwischen steht als WS7_TOUCH_POWER_MS in pins_config.h (Vorgabe 120 ms). +- Neu im Start-Log: eine Liste aller Bausteine am I2C-Bus, einmal vor und einmal nach dem + Panel-Start. Erwartet werden 0x45 (Bridge) und 0x14 (Touch). Damit ist auf einen Blick zu + sehen, ob ein Baustein gar nicht antwortet, statt aus Treiberfehlern raten zu muessen. + Version 1.6.13: - Ursache des schwarzen Bildes gefunden: ein haengender I2C-Bus. Trifft ein Reset des P4 mitten in eine laufende Uebertragung, bleibt der angesprochene Baustein in seiner diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index 87efda5..598793b 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -131,6 +131,20 @@ static void ws7_i2c_bus_recover(void) gpio_reset_pin(BSP_I2C_SDA); gpio_reset_pin(BSP_I2C_SCL); } + +// Zeigt, welche Bausteine sich am I2C-Bus melden. Erwartet werden 0x45 (Bridge) und +// 0x14 (GT9271-Touch); 0x18 waere der Audio-Baustein. Fehlt einer, sagt das mehr aus als +// jede Fehlermeldung des Treibers. +static void ws7_i2c_scan(const char *wann) +{ + esp_rom_printf("[Panel] I2C-Bausteine (%s):", wann); + for (uint8_t addr = 1; addr < 127; addr++) { + if (i2c_master_probe(s_i2c_handle, addr, 50) == ESP_OK) { + esp_rom_printf(" 0x%02X", addr); + } + } + esp_rom_printf("\n"); +} #endif // JC_PANEL_TYPE == WS_PANEL_7H // Klartext-Meldung auf der seriellen Konsole. Bewusst esp_rom_printf: das laeuft auch bei @@ -389,6 +403,7 @@ bool jc_board_bringup(void) i2c_new_master_bus(&i2c_bus_conf, &s_i2c_handle); #if JC_PANEL_TYPE == WS_PANEL_7H + ws7_i2c_scan("vor dem Panel-Start"); // Bridge des Waveshare-Panels vorbereiten (noch ohne Hintergrundbeleuchtung). ws7_bridge_pre_init(); #endif @@ -567,6 +582,16 @@ bool jc_board_bringup(void) }; esp_lcd_dpi_panel_register_event_callbacks(disp_panel, &cbs, NULL); +#if JC_PANEL_TYPE == WS_PANEL_7H + // Bridge freigeben und Beleuchtung einschalten, BEVOR der Touch angesprochen wird. + // Der GT9271 antwortet erst danach: Die Freigabe der Bridge (Register 0xAD) versorgt + // offenbar auch ihn. In der Werks-Testskizze steht die Touch-Initialisierung aus + // demselben Grund hinter dem Einschalten der Beleuchtung. + jc_backlight_set(100); + vTaskDelay(pdMS_TO_TICKS(WS7_TOUCH_POWER_MS)); + ws7_i2c_scan("nach dem Panel-Start"); +#endif + esp_lcd_panel_io_handle_t tp_io_handle = NULL; // MUSS vorbelegt sein: schlaegt die Touch-Initialisierung fehl, gibt der Treiber einen // unbrauchbaren Zeiger zurueck. Ohne Vorbelegung landet Muell im LVGL-Port. diff --git a/P4_Display_Firmware/pins_config.h b/P4_Display_Firmware/pins_config.h index 4f1abde..78f3100 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -140,6 +140,11 @@ // Wert verzoegert das Loslassen und daempft dadurch den Schwung beim Wischen. #define WS7_TOUCH_HOLD_MS 40 +// Wartezeit zwischen dem Freigeben der Bridge und dem Ansprechen des Touch. Der GT9271 +// haengt an derselben Versorgung und braucht nach dem Einschalten einen Moment, bis er +// auf I2C antwortet. Meldet sich 0x14 beim Start nicht, diesen Wert erhoehen. +#define WS7_TOUCH_POWER_MS 120 + #elif JC_PANEL_TYPE == JC_PANEL_70 #define LCD_H_RES 1024 -- 2.54.0