class DSIDisplay – DSI-Display-Treiber

Die Klasse DSIDisplay steuert MIPI-DSI-Panels über den STM32-DSI-Host-Controller an. MIPI DSI ist ein paketorientiertes serielles Display-Protokoll, das eine Clock-Lane plus eine oder mehrere Daten-Lanes als differenzielle Paare verwendet, wodurch hochauflösende Inhalte (bis zu 1080p) über deutlich weniger Leitungen als 24-Bit-Parallel-RGB übertragen werden können. Pixel werden direkt aus einem SDRAM-gestützten Framebuffer mit der gewählten Bildwiederholrate gestreamt, sodass die CPU nicht in den Refresh involviert ist.

Die Panel-Auflösung wird über framesize mithilfe der Konstanten im Modul display ausgewählt (QVGA, VGA, HD, FHD, …). Panel-spezifische Initialisierungssequenzen werden über das Schlüsselwortargument controller eingebunden – ST7701 deckt die gängigen ST7701-basierten 480x800-DSI-Panels ab. DCS-Befehle können out-of-band über bus_write() / bus_read() ausgegeben werden. Die Helligkeit der Hintergrundbeleuchtung wird standardmäßig als einfacher GPIO angesteuert oder durch DACBacklight / PWMBacklight, wenn diese als backlight übergeben werden.

Einzelbilder werden durch Aufruf von write() mit einem image.Image dargestellt. Der Treiber übernimmt RGB-Konvertierung, Skalierung, ROI, Palette und Orientierungstransformationen intern.

Beispiel – die Kamera auf ein ST7701-basiertes 480x800-DSI-Panel spiegeln:

import csi
import display
import image

csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)

lcd = display.DSIDisplay(framesize=display.TFWVGA,
                         controller=display.ST7701())

while True:
    lcd.write(csi0.snapshot(), hint=image.SCALE_ASPECT_KEEP)

Konstruktoren

class display.DSIDisplay(framesize: int = FWVGA, *, refresh: int = 60, display_on: bool = True, triple_buffer: bool = True, portrait: bool = False, channel: int = 0, controller: Any | None = None, backlight: Any | None = None)

framesize Eine der standardmäßig unterstützten Auflösungen (z. B. display.FWVGA).

refresh Legt die Bildwiederholrate des Bildschirms in Hertz fest. Der gültige Bereich ist 30 bis 120. Dies steuert den DSI-LCD-Takt.

display_on Aktiviert das Display.

triple_buffer Reserviert drei Framebuffer, um tearing-freie Display-Aktualisierungen zu ermöglichen. Erforderlich für vertikales Spiegeln in write().

portrait Vertauscht Breite und Höhe der Framesize.

channel Der virtuelle MIPI-DSI-Kanal, der für die Kommunikation mit dem Display verwendet werden soll.

controller Übergeben Sie hier die Klasse des Controller-Chips, um ihn zusammen mit dem Display zu initialisieren. Z. B. display.ST7701(), ein Standard-Display-Controller für MIPI-DSI-Displays.

backlight Geben Sie ein zu verwendendes Hintergrundbeleuchtungs-Controller-Modul an. Standardmäßig wird die Hintergrundbeleuchtung über einen GPIO-Pin gesteuert.

deinit() None

Gibt die von der Klasse verwendeten I/O-Pins und den RAM frei. Dies wird beim Zerstören automatisch aufgerufen.

width() int

Gibt die Breite des Bildschirms zurück.

height() int

Gibt die Höhe des Bildschirms zurück.

triple_buffer() int

Gibt zurück, ob Triple-Buffering aktiviert ist.

bgr() int

Gibt zurück, ob das Display BGR-geordnete Pixel erwartet.

byte_swap() int

Gibt zurück, ob das Display byte-vertauschte Pixel erwartet.

framesize() int

Gibt die Framesize-Konstante zurück, mit der das Display initialisiert wurde.

refresh() int

Gibt die Bildwiederholrate in Hertz zurück.

write(image: image.Image, x: int = 0, y: int = 0, x_scale: float = 1.0, y_scale: float = 1.0, roi: Tuple[int, int, int, int] | None = None, rgb_channel: int = -1, alpha: int = 255, color_palette: image.Image | None = None, alpha_palette: image.Image | None = None, hint: int = 0) None

Zeigt ein image an, dessen obere linke Ecke an der Position x, y beginnt.

image kann anstelle eines Bildobjekts auch ein Pfad-String sein, um das Bild automatisch von der Festplatte zu laden. Z. B. write("test.jpg").

x_scale steuert, wie stark das angezeigte Bild in x-Richtung skaliert wird (float). Ist dieser Wert negativ, wird das Bild horizontal gespiegelt. Wenn y_scale nicht angegeben ist, wird es an x_scale angepasst, um das Seitenverhältnis beizubehalten.

y_scale steuert, wie stark das angezeigte Bild in y-Richtung skaliert wird (float). Ist dieser Wert negativ, wird das Bild vertikal gespiegelt. Vertikales Spiegeln erfordert triple_buffer=True. Wenn x_scale nicht angegeben ist, wird es an y_scale angepasst.

roi ist das Rechteck-Tupel (x, y, w, h) des Interessensbereichs des anzuzeigenden Bildes.

rgb_channel ist der RGB-Kanal (0=R, 1=G, 2=B), der aus einem RGB565-Bild extrahiert und auf dem Display in Graustufen dargestellt werden soll. -1 deaktiviert die Extraktion. Der gültige Bereich ist -1 bis 2.

alpha steuert, wie deckend das Bild ist. 255 zeigt ein deckendes Bild an, niedrigere Werte blenden in Richtung Schwarz über, und 0 ergibt ein vollständig schwarzes Bild. Der gültige Bereich ist 0 bis 255.

color_palette kann ein Farbpaletten-Enum oder ein 256-Pixel-RGB565-Bild sein, das als Farb-Nachschlagetabelle für den Graustufenwert des Eingabebildes verwendet wird. Wird nach der rgb_channel-Extraktion angewendet.

alpha_palette kann ein 256-Pixel-Graustufenbild sein, das als Alpha-Nachschlagetabelle verwendet wird und alpha pro Eingabe-Pixel-Graustufenwert moduliert. Wird nach der rgb_channel-Extraktion angewendet.

hint ist eine logische ODER-Verknüpfung der Flags:

clear(display_off: bool = False) None

Setzt den LCD-Framebuffer auf Schwarz zurück.

display_off schaltet bei True die Display-Logik aus, anstatt den Framebuffer zu löschen.

backlight(value: int | None = None) int

Stellt den Dimmwert der LCD-Hintergrundbeleuchtung ein, 0 (aus) bis 100 (an). Übergeben Sie keine Argumente, um den aktuellen Wert der Hintergrundbeleuchtung abzurufen.

Sofern dem Konstruktor kein DACBacklight- oder PWMBacklight-Controller übergeben wird, wird die Hintergrundbeleuchtung als GPIO-Pin gesteuert und kann nur zwischen 0 (aus) und ungleich Null (an) wechseln.

bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None

Sendet den DSI-Befehl cmd an das Display.

args ist eine optionale Ganzzahl oder ein Puffer mit Befehlsparametern.

dcs sendet bei True den Befehl als DCS-Paket (Display Command Set).

bus_read(cmd: int, len: int, args: int | bytes | None = None, *, dcs: bool = False) bytes

Liest len Bytes vom Display mit dem DSI-Befehl cmd.

args ist eine optionale Ganzzahl oder ein Puffer mit Befehlsparametern.

dcs sendet bei True den Befehl als DCS-Paket (Display Command Set).

ioctl(cmd: int, arg: Any | None = None) Any

Sendet einen treiberspezifischen ioctl-Befehl cmd mit optionalem arg an das Display. Löst ValueError aus, wenn das Display ioctl nicht unterstützt.