From e8308a91821839eafd61364c5631064028c8184f Mon Sep 17 00:00:00 2001 From: raw-designs Date: Tue, 1 Sep 2026 15:22:11 +0200 Subject: [PATCH] fix(P4): Schwarzes Bild nach Reset am Waveshare-Panel (1.6.11) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Nach einem Reset des P4 blieb das Bild schwarz, die Hintergrundbeleuchtung brannte; nur direkt nach dem Flashen lief es. Die Bridge des Panels hat keine Reset-Leitung und hängt an Dauerstrom. Ein Reset des P4 setzt sie nicht zurück - ihre Register standen noch auf den Werten der vorigen Sitzung, während der P4 seine DSI-Strecke komplett neu aufbaut. Beim Flashen wird die Versorgung getrennt, deshalb trat der Fehler dort nicht auf. ws7_bridge_pre_init() schaltet die Bridge jetzt zuerst definiert ab (AB/AA, AD, dann AC/C2/C0), wartet WS7_BRIDGE_RESET_MS und schreibt erst danach die Grundinitialisierung. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_018QoLDQeUh1dCQz7yYZVb4Y --- P4_Display_Firmware/Changelog.txt | 13 +++++++++++++ P4_Display_Firmware/README.md | 5 +++++ P4_Display_Firmware/board_bringup.c | 25 +++++++++++++++++++++++-- P4_Display_Firmware/config.h | 2 +- P4_Display_Firmware/pins_config.h | 6 ++++++ 5 files changed, 48 insertions(+), 3 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index c440b0d..d234c8c 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,16 @@ +Version 1.6.11: +- Fehlerbehebung: Nach einem Reset des P4 blieb das Bild schwarz, während die + Hintergrundbeleuchtung brannte; erst ein erneutes Flashen half. Die Bridge des + Waveshare-Panels hat keine Reset-Leitung und hängt an Dauerstrom - ein Reset des P4 + setzt sie also nicht zurück, ihre Register standen noch auf den Werten der vorigen + Sitzung. Der P4 baut seine DSI-Strecke aber komplett neu auf, und ein frischer DSI-Start + auf einer bereits laufenden Bridge liefert kein Bild. Beim Flashen wird die Versorgung + getrennt, deshalb war der Fehler dort nicht zu sehen. +- Der Start schaltet die Bridge jetzt zuerst definiert ab (Beleuchtung, dann Ausgabe, + dann Grundregister), wartet WS7_BRIDGE_RESET_MS und fährt sie erst danach hoch. Der + Wert steht in pins_config.h (Vorgabe 120 ms) und ist die erste Stellschraube, falls + nach einem Reset doch einmal ein schwarzes Bild auftaucht. + Version 1.6.10: - WS7_PARTIAL_REFRESH ist jetzt auch im Auslieferungsstand 1. Am Gerät geprüft: kein Flackern, und der Gewinn ist der größte der drei Tempo-Maßnahmen - vor allem während diff --git a/P4_Display_Firmware/README.md b/P4_Display_Firmware/README.md index 916d016..7096565 100644 --- a/P4_Display_Firmware/README.md +++ b/P4_Display_Firmware/README.md @@ -67,6 +67,11 @@ Das Panel hängt hinter einer Waveshare-Bridge und braucht **keinen** Hersteller - Reihenfolge: Bridge-Grundinitialisierung (`C0`/`C2`/`AC`) → DSI → DCS `MADCTL`/`Sleep Out`/ `Display On` → DPI-Start → **erst dann** Hintergrundbeleuchtung. Wird das Licht früher eingeschaltet, blitzt beim Start Bildrauschen auf. +- **Nach einem Reset:** Die Bridge hat keine Reset-Leitung und hängt an Dauerstrom — ein + Reset des P4 setzt sie **nicht** zurück. Der Bringup schaltet sie deshalb zuerst + definiert ab, wartet `WS7_BRIDGE_RESET_MS` und fährt sie dann neu hoch. Ohne das trifft + ein frischer DSI-Start auf eine noch laufende Bridge: Bild schwarz, Beleuchtung an. + Nach dem Flashen fällt das nicht auf, weil dabei die Versorgung getrennt wird. - **Einbaulage:** `WS7_ROTATE_180` in [`pins_config.h`](pins_config.h) dreht Bild **und** Touch um 180°, falls das Panel auf dem Kopf montiert wird. Vorgabe ist **0** — in der jetzigen Einbaulage steht das Bild richtig herum. Die Drehung macht der diff --git a/P4_Display_Firmware/board_bringup.c b/P4_Display_Firmware/board_bringup.c index 8b86efd..ffa2e21 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -110,8 +110,16 @@ static void ws7_bridge_write(uint8_t reg, uint8_t value) i2c_master_transmit(s_bridge_handle, buf, sizeof(buf), 100); } -// Bridge am I2C-Bus anmelden und Grundinitialisierung schreiben. Muss VOR dem -// DSI-Bringup laufen; die Hintergrundbeleuchtung bleibt dabei noch aus. +// Bridge in einen definierten Grundzustand bringen und neu initialisieren. +// +// WICHTIG - der Grund fuer das Abschalten am Anfang: Die Bridge hat keine Reset-Leitung +// und haengt an Dauerstrom. Ein Reset des P4 setzt sie also NICHT zurueck; ihre Register +// stehen noch so, wie die vorige Sitzung sie hinterlassen hat. Der P4 baut seine +// DSI-Strecke aber komplett neu auf. Trifft ein frischer DSI-Start auf eine bereits +// laufende Bridge, bleibt das Bild schwarz, waehrend die Hintergrundbeleuchtung brennt. +// Nach dem Flashen faellt das nicht auf, weil dabei die Versorgung getrennt wird. +// +// Deshalb erst ausschalten (Beleuchtung, dann Bridge), kurz warten, dann normal hochfahren. static void ws7_bridge_pre_init(void) { i2c_device_config_t dev_cfg = { @@ -123,9 +131,22 @@ static void ws7_bridge_pre_init(void) s_bridge_handle = NULL; return; } + + // --- definierter Aus-Zustand (umgekehrte Reihenfolge zum Einschalten) --- + ws7_bridge_write(0xAB, 0xFF); // Helligkeit 0 + ws7_bridge_write(0xAA, 0x01); // uebernehmen + ws7_bridge_write(0xAD, 0x00); // Bridge-Ausgabe aus + vTaskDelay(pdMS_TO_TICKS(20)); + ws7_bridge_write(0xAC, 0x00); + ws7_bridge_write(0xC2, 0x00); + ws7_bridge_write(0xC0, 0x00); + vTaskDelay(pdMS_TO_TICKS(WS7_BRIDGE_RESET_MS)); + + // --- Grundinitialisierung wie im Linux-Treiber --- ws7_bridge_write(0xC0, 0x01); ws7_bridge_write(0xC2, 0x01); ws7_bridge_write(0xAC, 0x01); + vTaskDelay(pdMS_TO_TICKS(20)); } void jc_backlight_init(void) diff --git a/P4_Display_Firmware/config.h b/P4_Display_Firmware/config.h index 969092c..1d4fa97 100644 --- a/P4_Display_Firmware/config.h +++ b/P4_Display_Firmware/config.h @@ -126,7 +126,7 @@ // ------------------------------------------------------------------------------------- // Firmware // ------------------------------------------------------------------------------------- -#define DISPLAY_FW_VERSION "1.6.10" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) +#define DISPLAY_FW_VERSION "1.6.11" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) // ------------------------------------------------------------------------------------- // Protokoll diff --git a/P4_Display_Firmware/pins_config.h b/P4_Display_Firmware/pins_config.h index a0e0fb2..468b969 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -114,6 +114,12 @@ // nicht bekannt; die 180-Grad-Drehung macht deshalb der PPA (WS7_ROTATE_180). #define WS7_MADCTL 0x00 +// So lange bleibt die Bridge beim Start stromlos geschaltet, bevor sie neu +// initialisiert wird. Sie hat keine Reset-Leitung und ueberlebt einen Reset des P4; +// ohne diese Pause trifft ein frischer DSI-Start auf eine noch laufende Bridge und das +// Bild bleibt schwarz. Bei schwarzem Bild nach Reset zuerst diesen Wert erhoehen. +#define WS7_BRIDGE_RESET_MS 120 + // Der GT9271 meldet im Hochformat: Roh-X 0..720, Roh-Y 0..1280. Fuer das Querformat // werden die Achsen getauscht. Die Spiegelung geschieht VOR dem Tausch, also noch auf den // Rohwerten: Roh-X wird zur Bildschirmhoehe, Roh-Y zur Bildschirmbreite.