diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index d234c8c..04cf8a3 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,15 +1,12 @@ -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.12: +- Die Abschaltfolge für die Bridge aus 1.6.11 ist zurückgenommen. Sie hat den Fehler nicht + behoben, sondern verschlimmert: Nach dem Nullsetzen von C0/C2/AC kam das Panel auch + direkt nach dem Flashen nicht mehr hoch, die normale Einschaltfolge holt es aus diesem + Zustand nicht zurück. Der Start entspricht damit wieder 1.6.10. +- Stattdessen zwei Diagnosen, um die Ursache des schwarzen Bildes nach einem Reset + einzugrenzen: Der Startgrund wird beim Hochlauf ausgegeben (1 = Kaltstart, alles andere + Warmstart), und das Anfordern der Stromversorgung für die MIPI-Strecke wird jetzt auf + Fehler geprüft - bislang lief dieser Schritt als einziger ungeprüft durch. Version 1.6.10: - WS7_PARTIAL_REFRESH ist jetzt auch im Auslieferungsstand 1. Am Gerät geprüft: kein diff --git a/P4_Display_Firmware/README.md b/P4_Display_Firmware/README.md index 7096565..916d016 100644 --- a/P4_Display_Firmware/README.md +++ b/P4_Display_Firmware/README.md @@ -67,11 +67,6 @@ 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 ffa2e21..8bfdedb 100644 --- a/P4_Display_Firmware/board_bringup.c +++ b/P4_Display_Firmware/board_bringup.c @@ -30,6 +30,7 @@ #include "esp_heap_caps.h" #include "esp_rom_sys.h" #include "esp_timer.h" +#include "esp_system.h" #include "esp_ldo_regulator.h" #include "esp_lcd_panel_io.h" #include "esp_lcd_panel_ops.h" @@ -110,16 +111,8 @@ static void ws7_bridge_write(uint8_t reg, uint8_t value) i2c_master_transmit(s_bridge_handle, buf, sizeof(buf), 100); } -// 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. +// Bridge am I2C-Bus anmelden und Grundinitialisierung schreiben. Muss VOR dem +// DSI-Bringup laufen; die Hintergrundbeleuchtung bleibt dabei noch aus. static void ws7_bridge_pre_init(void) { i2c_device_config_t dev_cfg = { @@ -131,22 +124,9 @@ 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) @@ -341,12 +321,17 @@ bool jc_board_bringup(void) ws7_bridge_pre_init(); #endif + // Reset-Grund mitschreiben: 1 = Kaltstart (Strom weg), alles andere ist ein Warmstart. + // Nur beim Warmstart behalten die Bausteine ihren alten Zustand - genau dann traten + // die schwarzen Bilder auf. + esp_rom_printf("[Panel] Startgrund: %d (1 = Kaltstart)\n", (int)esp_reset_reason()); + static esp_ldo_channel_handle_t phy_pwr_chan = NULL; esp_ldo_channel_config_t ldo_cfg = { .chan_id = BSP_MIPI_DSI_PHY_PWR_LDO_CHAN, .voltage_mv = BSP_MIPI_DSI_PHY_PWR_LDO_VOLTAGE_MV, }; - esp_ldo_acquire_channel(&ldo_cfg, &phy_pwr_chan); + BSP_STEP(esp_ldo_acquire_channel(&ldo_cfg, &phy_pwr_chan), "Stromversorgung MIPI-D-PHY"); esp_lcd_dsi_bus_handle_t mipi_dsi_bus; esp_lcd_panel_io_handle_t io = NULL; diff --git a/P4_Display_Firmware/config.h b/P4_Display_Firmware/config.h index 1d4fa97..969092c 100644 --- a/P4_Display_Firmware/config.h +++ b/P4_Display_Firmware/config.h @@ -126,7 +126,7 @@ // ------------------------------------------------------------------------------------- // Firmware // ------------------------------------------------------------------------------------- -#define DISPLAY_FW_VERSION "1.6.11" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) +#define DISPLAY_FW_VERSION "1.6.10" // 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 468b969..a0e0fb2 100644 --- a/P4_Display_Firmware/pins_config.h +++ b/P4_Display_Firmware/pins_config.h @@ -114,12 +114,6 @@ // 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.