diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index 3c67087..2f7b8a6 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,16 @@ +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 + an, das Bild fehlte. Die Beleuchtung hängt an der Bridge und wird über I2C geschaltet - + sie funktioniert also. Verloren gehen die Weckbefehle an das Panel selbst. +- Diese Befehle wurden bisher genau einmal geschickt, bevor die Videoausgabe lief. War der + Panel-Controller in dem Moment noch nicht aufnahmebereit, waren sie weg, und danach hat + nie wieder jemand nachgefragt. Sie werden jetzt ein zweites Mal gesendet, sobald die + Videoausgabe steht. Die Befehle sind wiederholbar, der zweite Anlauf kostet nichts. +- Die Pause dazwischen steht als WS7_PANEL_SETTLE_MS in pins_config.h (Vorgabe 200 ms). +- Im Start-Log ist jeder Anlauf einzeln zu sehen ("Weckbefehle vor/nach dem Start der + Videoausgabe"). + Version 1.6.18: - Ursache des unzuverlässigen Starts gefunden: Der P4 sprach Bridge und Panel sofort nach dem Einschalten an. Das Displaymodul braucht danach aber einen Moment, bis es bereit ist. diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index 480fb68..8ca9e0d 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -383,6 +383,31 @@ static void jc_touch_scale(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y, } #endif +#if JC_PANEL_TYPE == WS_PANEL_7H +// Panel wecken. Bewusst mehrfach, siehe unten. +// +// Ein reines DPI-Panel kennt keine reset-Funktion, esp_lcd_panel_reset() wuerde ins Leere +// greifen - deshalb nur die DCS-Befehle. +// +// Warum mehrfach: Verpasst der Panel-Controller diese Befehle, weil er nach dem +// Einschalten noch nicht bereit war, bleibt der Bildschirm dunkel, obwohl der P4 alles +// korrekt gesendet hat und jeder Schritt Erfolg meldet. Die Hintergrundbeleuchtung geht +// trotzdem an, weil sie an der Bridge haengt und nicht am Panel - genau dieses Bild. +// Die Befehle sind wiederholbar, ein zweiter Anlauf nach dem Start der Videoausgabe +// kostet nichts und faengt den Fall ab. +static void ws7_panel_wake(esp_lcd_panel_io_handle_t io, const char *wann) +{ + uint8_t zero = 0x00; + uint8_t madctl = WS7_MADCTL; + esp_rom_printf("[Panel] Weckbefehle %s\n", wann); + BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x36, &madctl, 1), "Panel-Befehl MADCTL"); + BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x11, &zero, 1), "Panel-Befehl Sleep Out"); + vTaskDelay(pdMS_TO_TICKS(120)); + BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x29, &zero, 1), "Panel-Befehl Display On"); + vTaskDelay(pdMS_TO_TICKS(20)); +} +#endif + // Bringt Panel + Touch + LVGL-Port hoch (LVGL laeuft danach in eigenem Task). // Rueckgabe false: Panel kam nicht hoch - der Aufrufer darf dann KEINE LVGL-Funktion // benutzen, sonst folgt ein zweiter Absturz, der die eigentliche Ursache ueberdeckt. @@ -504,19 +529,14 @@ bool jc_board_bringup(void) return false; } - // Panel wecken (MADCTL / Sleep Out / Display On). Ein Reset gibt es hier nicht: - // ein reines DPI-Panel kennt keine reset-Funktion, esp_lcd_panel_reset() wuerde - // ins Leere greifen. - { - uint8_t zero = 0x00; - uint8_t madctl = WS7_MADCTL; - BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x36, &madctl, 1), "Panel-Befehl MADCTL"); - BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x11, &zero, 1), "Panel-Befehl Sleep Out"); - vTaskDelay(pdMS_TO_TICKS(120)); - BSP_STEP(esp_lcd_panel_io_tx_param(io, 0x29, &zero, 1), "Panel-Befehl Display On"); - vTaskDelay(pdMS_TO_TICKS(20)); - } + ws7_panel_wake(io, "vor dem Start der Videoausgabe"); + BSP_STEP(esp_lcd_panel_init(disp_panel), "DPI-Videoausgabe starten"); + + // 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_panel_wake(io, "nach dem Start der Videoausgabe"); #if WS7_TEST_PATTERN // Prueffarbbalken: Sie entstehen im DSI-Baustein selbst und benutzen weder den // Bildspeicher noch LVGL. Erscheinen sie, arbeitet die Anzeigekette bis zum Panel und diff --git a/P4_Display_Firmware/pins_config.h b/P4_Display_Firmware/pins_config.h index eea6f4d..6fce2e5 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -154,6 +154,11 @@ // der erste Wert zum Erhoehen; laeuft es sicher, kann er vorsichtig gesenkt werden. #define WS7_PANEL_WARMUP_MS 2000 +// Pause zwischen dem Start der Videoausgabe und dem zweiten Anlauf der Weckbefehle. +// Verpasst das Panel den ersten Anlauf, bleibt der Bildschirm dunkel, waehrend die +// Beleuchtung brennt - sie haengt an der Bridge, nicht am Panel. +#define WS7_PANEL_SETTLE_MS 200 + #define WS7_TEST_PATTERN 0 #elif JC_PANEL_TYPE == JC_PANEL_70