fix(P4): Panel-Weckbefehle nach dem Start der Videoausgabe wiederholen (1.6.19) #47
@@ -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:
|
Version 1.6.18:
|
||||||
- Ursache des unzuverlässigen Starts gefunden: Der P4 sprach Bridge und Panel sofort nach
|
- 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.
|
dem Einschalten an. Das Displaymodul braucht danach aber einen Moment, bis es bereit ist.
|
||||||
|
|||||||
@@ -383,6 +383,31 @@ static void jc_touch_scale(esp_lcd_touch_handle_t tp, uint16_t *x, uint16_t *y,
|
|||||||
}
|
}
|
||||||
#endif
|
#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).
|
// 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
|
// Rueckgabe false: Panel kam nicht hoch - der Aufrufer darf dann KEINE LVGL-Funktion
|
||||||
// benutzen, sonst folgt ein zweiter Absturz, der die eigentliche Ursache ueberdeckt.
|
// benutzen, sonst folgt ein zweiter Absturz, der die eigentliche Ursache ueberdeckt.
|
||||||
@@ -504,19 +529,14 @@ bool jc_board_bringup(void)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Panel wecken (MADCTL / Sleep Out / Display On). Ein Reset gibt es hier nicht:
|
ws7_panel_wake(io, "vor dem Start der Videoausgabe");
|
||||||
// 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));
|
|
||||||
}
|
|
||||||
BSP_STEP(esp_lcd_panel_init(disp_panel), "DPI-Videoausgabe starten");
|
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
|
#if WS7_TEST_PATTERN
|
||||||
// Prueffarbbalken: Sie entstehen im DSI-Baustein selbst und benutzen weder den
|
// Prueffarbbalken: Sie entstehen im DSI-Baustein selbst und benutzen weder den
|
||||||
// Bildspeicher noch LVGL. Erscheinen sie, arbeitet die Anzeigekette bis zum Panel und
|
// Bildspeicher noch LVGL. Erscheinen sie, arbeitet die Anzeigekette bis zum Panel und
|
||||||
|
|||||||
@@ -154,6 +154,11 @@
|
|||||||
// der erste Wert zum Erhoehen; laeuft es sicher, kann er vorsichtig gesenkt werden.
|
// der erste Wert zum Erhoehen; laeuft es sicher, kann er vorsichtig gesenkt werden.
|
||||||
#define WS7_PANEL_WARMUP_MS 2000
|
#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
|
#define WS7_TEST_PATTERN 0
|
||||||
|
|
||||||
#elif JC_PANEL_TYPE == JC_PANEL_70
|
#elif JC_PANEL_TYPE == JC_PANEL_70
|
||||||
|
|||||||
Reference in New Issue
Block a user