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)¶
framesizeEine der standardmäßig unterstützten Auflösungen (z. B.display.FWVGA).refreshLegt die Bildwiederholrate des Bildschirms in Hertz fest. Der gültige Bereich ist 30 bis 120. Dies steuert den DSI-LCD-Takt.display_onAktiviert das Display.triple_bufferReserviert drei Framebuffer, um tearing-freie Display-Aktualisierungen zu ermöglichen. Erforderlich für vertikales Spiegeln inwrite().portraitVertauscht Breite und Höhe der Framesize.channelDer 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.backlightGeben 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.
- 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
imagean, dessen obere linke Ecke an der Positionx,ybeginnt.imagekann anstelle eines Bildobjekts auch ein Pfad-String sein, um das Bild automatisch von der Festplatte zu laden. Z. B.write("test.jpg").x_scalesteuert, wie stark das angezeigte Bild in x-Richtung skaliert wird (float). Ist dieser Wert negativ, wird das Bild horizontal gespiegelt. Wenny_scalenicht angegeben ist, wird es anx_scaleangepasst, um das Seitenverhältnis beizubehalten.y_scalesteuert, wie stark das angezeigte Bild in y-Richtung skaliert wird (float). Ist dieser Wert negativ, wird das Bild vertikal gespiegelt. Vertikales Spiegeln erforderttriple_buffer=True. Wennx_scalenicht angegeben ist, wird es any_scaleangepasst.roiist das Rechteck-Tupel (x, y, w, h) des Interessensbereichs des anzuzeigenden Bildes.rgb_channelist der RGB-Kanal (0=R, 1=G, 2=B), der aus einem RGB565-Bild extrahiert und auf dem Display in Graustufen dargestellt werden soll.-1deaktiviert die Extraktion. Der gültige Bereich ist -1 bis 2.alphasteuert, 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_palettekann ein Farbpaletten-Enum oder ein 256-Pixel-RGB565-Bild sein, das als Farb-Nachschlagetabelle für den Graustufenwert des Eingabebildes verwendet wird. Wird nach derrgb_channel-Extraktion angewendet.alpha_palettekann ein 256-Pixel-Graustufenbild sein, das als Alpha-Nachschlagetabelle verwendet wird undalphapro Eingabe-Pixel-Graustufenwert moduliert. Wird nach derrgb_channel-Extraktion angewendet.hintist eine logische ODER-Verknüpfung der Flags:image.AREA: Verwendet Flächenskalierung beim Herunterskalieren anstelle der Standardeinstellung Nearest-Neighbor.image.BILINEAR: Verwendet bilineare Skalierung anstelle der Standard-Nearest-Neighbor-Skalierung.image.BICUBIC: Verwendet bikubische Skalierung anstelle der Standard-Nearest-Neighbor-Skalierung.image.CENTER: Zentriert das auf dem Display gezeichnete Bild. Dies wird nach der Skalierung angewendet.image.HMIRROR: Spiegelt das Bild horizontal.image.VFLIP: Spiegelt das Bild vertikal.image.TRANSPOSE: Transponiert das Bild (vertauscht x/y).image.EXTRACT_RGB_CHANNEL_FIRST: Führt die rgb_channel-Extraktion vor der Skalierung durch.image.APPLY_COLOR_PALETTE_FIRST: Wendet die Farbpalette vor der Skalierung an.image.SCALE_ASPECT_KEEP: Skaliert das gezeichnete Bild so, dass es in das Display passt.image.SCALE_ASPECT_EXPAND: Skaliert das gezeichnete Bild so, dass es das Display ausfüllt (führt zu Zuschneiden).image.SCALE_ASPECT_IGNORE: Skaliert das gezeichnete Bild so, dass es das Display ausfüllt (führt zu Verzerrung).image.ROTATE_90: Dreht das Bild um 90 Grad (dies ist einfach VFLIP | TRANSPOSE).image.ROTATE_180: Dreht das Bild um 180 Grad (dies ist einfach HMIRROR | VFLIP).image.ROTATE_270: Dreht das Bild um 270 Grad (dies ist einfach HMIRROR | TRANSPOSE).
- clear(display_off: bool = False) None¶
Setzt den LCD-Framebuffer auf Schwarz zurück.
display_offschaltet 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- oderPWMBacklight-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
cmdan das Display.argsist eine optionale Ganzzahl oder ein Puffer mit Befehlsparametern.dcssendet bei True den Befehl als DCS-Paket (Display Command Set).