Merge pull request 'perf(P4): Darstellung am Waveshare-Panel beschleunigen (1.6.4)' (#32) from perf/waveshare-darstellung-beschleunigen into main
This commit was merged in pull request #32.
This commit is contained in:
@@ -1,3 +1,19 @@
|
||||
Version 1.6.4:
|
||||
- Waveshare 7" (H): Drei Maßnahmen gegen die träge Bedienung am großen Panel. 1280x720
|
||||
sind 2,4-mal so viele Pixel wie beim 4,3-Zöller, und bis 1.6.3 wurde bei jeder Änderung
|
||||
das komplette Bild in 24 Bit neu gezeichnet.
|
||||
* Farbtiefe RGB565 statt RGB888 (WS7_COLOR_BITS): halbiert die Datenmenge je Bild.
|
||||
Feinere Farbabstufungen entfallen, sichtbar allenfalls in den dunklen Verläufen der
|
||||
Rundanzeige - die JC-Panels laufen seit jeher so.
|
||||
* Nur geänderte Bildbereiche neu zeichnen statt des ganzen Bildes
|
||||
(WS7_PARTIAL_REFRESH, LVGL-Direct-Mode mit zwei Puffern). Eine sich ändernde
|
||||
Temperaturanzeige kostet damit ein paar tausend statt 921.600 Pixel.
|
||||
* LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen (WS7_PARALLEL_RENDER).
|
||||
- Jeder der drei Schalter steht in pins_config.h und lässt sich einzeln zurückstellen;
|
||||
die README nennt zu jedem, woran man erkennt, dass er zurück muss. Die JC-Panels sind
|
||||
von allen dreien nicht betroffen.
|
||||
- Nebeneffekt: Der Framebuffer-Bedarf sinkt von rund 8,3 MB auf 3,7 MB PSRAM.
|
||||
|
||||
Version 1.6.3:
|
||||
- Waveshare ESP32-P4-Pico: UART zur Hauptplatine liegt jetzt auf TX = GPIO20 und
|
||||
RX = GPIO21 (vorher GPIO17/GPIO18). Die JC-Panels bleiben bei GPIO33/GPIO31.
|
||||
|
||||
@@ -44,13 +44,13 @@ Vendor-Pakete: 4,3" im Ordner `JC4880P443C_I_W/`, 7,0" im Repo-Ordner
|
||||
| Haupt-MCU (UI) | ESP32-P4 | ESP32-P4 | ESP32-P4 (32 MB PSRAM, 32 MB Flash) |
|
||||
| WLAN/BT (hier ungenutzt) | ESP32-C6 | ESP32-C6 | — (kein Funkmodul) |
|
||||
| Display | ST7701, 480×800 IPS, MIPI-DSI | JD9165, 1024×600 IPS, MIPI-DSI | 1280×720 IPS, MIPI-DSI 2 Lanes über Waveshare-Bridge |
|
||||
| Farbformat | RGB565 | RGB565 | **RGB888** (Bridge nimmt nichts anderes) |
|
||||
| Farbformat | RGB565 | RGB565 | RGB565 oder RGB888, `WS7_COLOR_BITS` |
|
||||
| LVGL-Ausrichtung | Rotation **270°** (PPA) → 800×480 | **keine** Rotation, nativ 1024×600 | **keine** Rotation, nativ 1280×720 |
|
||||
| Touch | GT911, I²C SDA=GPIO7 / SCL=GPIO8 | GT911, I²C SDA=GPIO7 / SCL=GPIO8 | **GT9271** (I²C-Adresse **0x14**), SDA=GPIO7 / SCL=GPIO8 |
|
||||
| Touch-Rohkoordinaten | 480×800 (= Panelraster) | **800×480** → wird auf 1024×600 skaliert | **720×1280** (Hochformat) → X/Y werden getauscht |
|
||||
| LCD-Reset | GPIO5 | **GPIO27** | kein Reset-Pin (macht die Bridge) |
|
||||
| Backlight | GPIO23 (LEDC-PWM) | GPIO23 (LEDC-PWM) | **Bridge-Register** auf I²C **0x45** (`AD`/`AB`/`AA`) |
|
||||
| Framebuffer (3×) | 3 × 750 KB ≈ 2,3 MB PSRAM | 3 × 1,2 MB ≈ 3,6 MB PSRAM | 3 × 2,8 MB ≈ **8,3 MB** PSRAM |
|
||||
| Framebuffer | 3 × 750 KB ≈ 2,3 MB PSRAM | 3 × 1,2 MB ≈ 3,6 MB PSRAM | 2 × 1,8 MB ≈ 3,7 MB PSRAM (RGB565, Teil-Neuzeichnen) |
|
||||
| Freie Expansion-IO | Stiftleiste **JP1**: GPIO 52/51/50/49/35/34/33/32/31/30/29/28 | FPC 1,0 mm 16-pol. **FPC4**: GPIO 34/33/32/31/30/29/28 · **FPC3**: 48/47/46/45/5/4/3/2 | 40-poliger Header im Raspberry-Pi-Pico-Format; belegt sind I²C (7/8), TF-Karte (9/10/11/12/13/53) und Debug-UART0 (37/38) |
|
||||
| UART zur Hauptplatine | TX GPIO33 / RX GPIO31 | TX GPIO33 / RX GPIO31 | **TX GPIO20 / RX GPIO21** |
|
||||
|
||||
@@ -75,6 +75,21 @@ Das Panel hängt hinter einer Waveshare-Bridge und braucht **keinen** Hersteller
|
||||
`WS7_TOUCH_MIRROR_RAW_X` steht deshalb auf **1** (dreht oben/unten), unabhängig von der
|
||||
Bilddrehung.
|
||||
|
||||
### Waveshare 7" (H) — Tempo-Schalter
|
||||
|
||||
1280×720 bedeutet 2,4-mal so viele Pixel wie beim 4,3-Zöller. Drei Schalter in
|
||||
[`pins_config.h`](pins_config.h) halten die Bedienung flüssig; jeder ist einzeln
|
||||
zurückstellbar, falls er Ärger macht:
|
||||
|
||||
| Schalter | Vorgabe | Wirkung | Wenn es klemmt |
|
||||
|---|---|---|---|
|
||||
| `WS7_COLOR_BITS` | `16` | RGB565 halbiert die Datenmenge je Bild gegenüber RGB888. Sichtbar nur in den dunklen Verläufen der Rundanzeige. | Bild falschfarbig oder dunkel → die Bridge will kein RGB565, auf `24` stellen |
|
||||
| `WS7_PARTIAL_REFRESH` | `1` | Nur geänderte Bildbereiche neu zeichnen statt jedes Mal des ganzen Bildes (LVGL-Direct-Mode, zwei Puffer). Größter Gewinn. | Flackern in Flächen, die selten neu gezeichnet werden → auf `0` |
|
||||
| `WS7_PARALLEL_RENDER` | `1` | LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen. | P4 startet nicht mehr (zwei zusätzliche Stacks im knappen internen RAM) → zuerst hier auf `0` |
|
||||
|
||||
Die Farbtiefe muss für Sketch **und** LVGL-Bibliothek dieselbe sein; `lv_conf.h` liest
|
||||
`WS7_COLOR_BITS` deshalb direkt aus `pins_config.h`.
|
||||
|
||||
> Beim 7-Zöller ist die Expansion-IO **kein Stiftleisten-Header**, sondern eine
|
||||
> FPC-Buchse (1,0 mm Raster, 16-polig) — für die UART-Verdrahtung wird ein
|
||||
> FPC-Breakout/Adapterkabel gebraucht. Schaltplan: `../JC_Display_Firmware_7zoll/5-Schematic/4_CONN.png`.
|
||||
|
||||
@@ -59,10 +59,10 @@
|
||||
#define BSP_LCD_BACKLIGHT ((gpio_num_t)LCD_LED)
|
||||
#define LCD_LEDC_CH LEDC_CHANNEL_0
|
||||
|
||||
// Bytes je Pixel im Framebuffer. Das Waveshare-Panel laeuft in RGB888 (LVGL ebenfalls,
|
||||
// siehe lv_conf.h), die JC-Panels in RGB565.
|
||||
// Bytes je Pixel im Framebuffer. Beim Waveshare-Panel waehlbar ueber WS7_COLOR_BITS
|
||||
// (pins_config.h); LVGL rechnet mit derselben Tiefe (lv_conf.h). JC-Panels: RGB565.
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
#define BSP_LCD_FB_BYTES_PER_PX (3)
|
||||
#define BSP_LCD_FB_BYTES_PER_PX (WS7_COLOR_BITS / 8)
|
||||
#else
|
||||
#define BSP_LCD_FB_BYTES_PER_PX (2)
|
||||
#endif
|
||||
@@ -296,7 +296,11 @@ bool jc_board_bringup(void)
|
||||
.virtual_channel = 0,
|
||||
.dpi_clk_src = MIPI_DSI_DPI_CLK_SRC_DEFAULT,
|
||||
.dpi_clock_freq_mhz = WS7_DPI_CLOCK_MHZ,
|
||||
#if WS7_COLOR_BITS == 24
|
||||
.pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB888,
|
||||
#else
|
||||
.pixel_format = LCD_COLOR_PIXEL_FORMAT_RGB565,
|
||||
#endif
|
||||
.num_fbs = LVGL_PORT_LCD_BUFFER_NUMS,
|
||||
.video_timing = {
|
||||
.h_size = BSP_LCD_H_RES,
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
// -------------------------------------------------------------------------------------
|
||||
// Firmware
|
||||
// -------------------------------------------------------------------------------------
|
||||
#define DISPLAY_FW_VERSION "1.6.3" // Firmware-Stand der P4-Display-Steuerung (Info-Seite)
|
||||
#define DISPLAY_FW_VERSION "1.6.4" // Firmware-Stand der P4-Display-Steuerung (Info-Seite)
|
||||
|
||||
// -------------------------------------------------------------------------------------
|
||||
// Protokoll
|
||||
|
||||
@@ -10,12 +10,14 @@
|
||||
#include "display_hal.h"
|
||||
#include "ui.h"
|
||||
#include "config.h"
|
||||
#include "pins_config.h"
|
||||
|
||||
// LVGL muss mit derselben Farbtiefe uebersetzt sein wie das Panel erwartet. Zieht der
|
||||
// Build versehentlich eine fremde lv_conf.h (z.B. eine alte Datei neben dem lvgl-Ordner),
|
||||
// faellt das hier auf - sonst erst am schwarzen oder farbverfaelschten Bild.
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
static_assert(LV_COLOR_DEPTH == 24, "Waveshare 7\" (H) braucht RGB888 - falsche lv_conf.h?");
|
||||
static_assert(LV_COLOR_DEPTH == WS7_COLOR_BITS,
|
||||
"Farbtiefe passt nicht zu WS7_COLOR_BITS - falsche lv_conf.h?");
|
||||
#else
|
||||
static_assert(LV_COLOR_DEPTH == 16, "JC-Panels brauchen RGB565 - falsche lv_conf.h?");
|
||||
#endif
|
||||
|
||||
@@ -26,18 +26,18 @@
|
||||
COLOR SETTINGS
|
||||
*====================*/
|
||||
|
||||
/* Panel-Typ des Projekts. Liegt im selben Ordner wie diese Datei, ein Include mit
|
||||
* Anfuehrungszeichen findet also immer genau diese config.h - auch dann, wenn die
|
||||
* LVGL-Bibliothek uebersetzt wird. Nur so bekommen Sketch UND Bibliothek dieselbe
|
||||
* Farbtiefe; ein Compiler-Flag allein wuerde die Bibliothek nicht erreichen. */
|
||||
#include "config.h"
|
||||
/* Panel- und Tempo-Einstellungen des Projekts. Die Datei liegt im selben Ordner wie
|
||||
* diese hier, ein Include mit Anfuehrungszeichen findet also immer genau sie - auch
|
||||
* dann, wenn die LVGL-Bibliothek uebersetzt wird. Nur so bekommen Sketch UND Bibliothek
|
||||
* dieselben Werte; ein Compiler-Flag allein wuerde die Bibliothek nicht erreichen. */
|
||||
#include "pins_config.h"
|
||||
|
||||
/*Color depth: 1 (I1), 8 (L8), 16 (RGB565), 24 (RGB888), 32 (XRGB8888)*/
|
||||
/* Waveshare 7inch DSI LCD (H): Die Bridge des Panels nimmt ausschliesslich RGB888
|
||||
* entgegen, deshalb muss auch LVGL in 24 Bit rechnen. Die JC-Panels laufen wie
|
||||
* bisher mit RGB565. */
|
||||
/* Waveshare 7inch DSI LCD (H): Farbtiefe kommt aus WS7_COLOR_BITS (pins_config.h) -
|
||||
* 16 Bit halbiert die Datenmenge je Bild, 24 Bit bringt feinere Verlaeufe.
|
||||
* Die JC-Panels laufen unveraendert mit RGB565. */
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
#define LV_COLOR_DEPTH 24
|
||||
#define LV_COLOR_DEPTH WS7_COLOR_BITS
|
||||
#else
|
||||
#define LV_COLOR_DEPTH 16
|
||||
#endif
|
||||
@@ -109,7 +109,14 @@
|
||||
* - LV_OS_WINDOWS
|
||||
* - LV_OS_MQX
|
||||
* - LV_OS_CUSTOM */
|
||||
/* Nur mit einem Betriebssystem kann LVGL auf mehreren Kernen zeichnen. Beim
|
||||
* Waveshare-Panel wird das gebraucht (WS7_PARALLEL_RENDER), sonst bleibt es aus -
|
||||
* die JC-Panels sollen sich nicht aendern. */
|
||||
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_PARALLEL_RENDER
|
||||
#define LV_USE_OS LV_OS_FREERTOS
|
||||
#else
|
||||
#define LV_USE_OS LV_OS_NONE
|
||||
#endif
|
||||
|
||||
#if LV_USE_OS == LV_OS_CUSTOM
|
||||
#define LV_OS_CUSTOM_INCLUDE <stdint.h>
|
||||
@@ -175,7 +182,14 @@
|
||||
/* Set the number of draw unit.
|
||||
* > 1 requires an operating system enabled in `LV_USE_OS`
|
||||
* > 1 means multiple threads will render the screen in parallel */
|
||||
/* Der ESP32-P4 hat zwei Kerne. Beim grossen Waveshare-Panel lohnt es sich, beide
|
||||
* zum Zeichnen zu benutzen; jeder Zeichen-Thread kostet einen eigenen Stack im
|
||||
* knappen internen RAM. */
|
||||
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_PARALLEL_RENDER
|
||||
#define LV_DRAW_SW_DRAW_UNIT_CNT 2
|
||||
#else
|
||||
#define LV_DRAW_SW_DRAW_UNIT_CNT 1
|
||||
#endif
|
||||
|
||||
/* Use Arm-2D to accelerate the sw render */
|
||||
#define LV_USE_DRAW_ARM2D_SYNC 0
|
||||
|
||||
@@ -10,6 +10,28 @@
|
||||
// -------------------------------------------------------------------------------------
|
||||
#define WS7_ROTATE_180 0
|
||||
|
||||
// -------------------------------------------------------------------------------------
|
||||
// Waveshare 7" (H): Tempo-Schalter
|
||||
//
|
||||
// 1280x720 ist gegenueber den JC-Panels ein Vielfaches an Pixeln. Die drei Schalter
|
||||
// senken die Last und lassen sich einzeln zurueckstellen, falls einer Aerger macht.
|
||||
//
|
||||
// WS7_COLOR_BITS 16 = RGB565: halbe Datenmenge je Bild, dafuer 65.000 statt
|
||||
// 16,7 Mio. Farben (sichtbar nur in den dunklen Verlaeufen der
|
||||
// Rundanzeige). 24 = RGB888 wie bis 1.6.3.
|
||||
// ACHTUNG: Nimmt die Bridge des Panels kein RGB565 an, bleibt
|
||||
// das Bild falschfarbig oder aus -> wieder auf 24 stellen.
|
||||
// WS7_PARTIAL_REFRESH 1 = nur geaenderte Bildbereiche neu zeichnen statt jedes Mal des
|
||||
// gesamten Bildes. Groesster Tempogewinn. Am 4,3-Zoll-Panel
|
||||
// hatte dieser Modus geflackert; tritt das hier auch auf, auf 0.
|
||||
// WS7_PARALLEL_RENDER 1 = LVGL zeichnet mit zwei Threads auf beiden Prozessorkernen.
|
||||
// Kostet zwei zusaetzliche Task-Stacks im knappen internen RAM;
|
||||
// startet der P4 nicht mehr, hier zuerst auf 0 stellen.
|
||||
// -------------------------------------------------------------------------------------
|
||||
#define WS7_COLOR_BITS 16
|
||||
#define WS7_PARTIAL_REFRESH 1
|
||||
#define WS7_PARALLEL_RENDER 1
|
||||
|
||||
#define EXAMPLE_LVGL_PORT_TASK_MAX_DELAY_MS 500 //range 2 to 2000
|
||||
#define EXAMPLE_LVGL_PORT_TASK_MIN_DELAY_MS 5 //range 1 to 100
|
||||
#define EXAMPLE_LVGL_PORT_TASK_PRIORITY 4
|
||||
@@ -24,7 +46,13 @@
|
||||
// Bild, daher zeigen statische Flaechen (z.B. Tab-Leiste) nie alten Bufferinhalt.
|
||||
// (Mode 3 = Direct-Mode flackert bei nie neu gezeichneten Bereichen.)
|
||||
// Bei Rotation 90 nutzen beide Modi ohnehin 3 Framebuffer -> kein Mehrverbrauch.
|
||||
// Beim Waveshare-Panel waere Vollbild-Neuzeichnen bei 1280x720 zu teuer -> Mode 3
|
||||
// (Direct-Mode, zwei Puffer, nur geaenderte Bereiche), siehe WS7_PARTIAL_REFRESH.
|
||||
#if (JC_PANEL_TYPE == WS_PANEL_7H) && WS7_PARTIAL_REFRESH
|
||||
#define EXAMPLE_LVGL_PORT_AVOID_TEAR_MODE 3 //range 1 to 3
|
||||
#else
|
||||
#define EXAMPLE_LVGL_PORT_AVOID_TEAR_MODE 2 //range 1 to 3
|
||||
#endif
|
||||
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
// Waveshare 7" (H): Panel ist nativ 1280x720 Querformat. Bei Einbau auf dem Kopf wird um
|
||||
|
||||
Reference in New Issue
Block a user