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