class DSIDisplay – Driver del Display DSI

La classe DSIDisplay pilota i pannelli MIPI-DSI tramite il controller host DSI dell’STM32. MIPI DSI e un protocollo seriale a pacchetti per display che utilizza una corsia di clock piu una o piu corsie dati come coppie differenziali, il che gli consente di trasportare contenuti ad alta risoluzione (fino a 1080p) su un numero di fili molto inferiore rispetto all’RGB parallelo a 24 bit. I pixel vengono trasmessi direttamente da un framebuffer su SDRAM alla frequenza di aggiornamento scelta, quindi la CPU non e coinvolta nell’aggiornamento.

La risoluzione del pannello viene selezionata tramite framesize utilizzando le costanti del modulo display (QVGA, VGA, HD, FHD, …). Le sequenze di inizializzazione specifiche del pannello vengono inserite tramite l’argomento keyword controllerST7701 copre i comuni pannelli DSI 480x800 basati su ST7701. I comandi DCS possono essere emessi fuori banda tramite bus_write() / bus_read(). La luminosita della retroilluminazione viene pilotata come un semplice GPIO per impostazione predefinita, oppure tramite DACBacklight / PWMBacklight se passato come backlight.

I frame vengono presentati chiamando write() con un image.Image. Il driver gestisce internamente la conversione RGB, lo scaling, la ROI, la palette e le trasformazioni di orientamento.

Esempio – riproduce la camera su un pannello DSI 480x800 basato su ST7701:

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)

Costruttori

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 Una delle risoluzioni standard supportate (ad es. display.FWVGA).

refresh Imposta la frequenza di aggiornamento dello schermo in hertz. L’intervallo valido va da 30 a 120. Questo controlla il clock dell’LCD DSI.

display_on Abilita il display.

triple_buffer Alloca tre framebuffer per consentire aggiornamenti del display senza tearing. Necessario per il ribaltamento verticale in write().

portrait Scambia la larghezza e l’altezza del framesize.

channel Il canale MIPI DSI virtuale da utilizzare per comunicare con il display.

controller Passa qui la classe del chip controller per inizializzarlo insieme al display. Ad es. display.ST7701() che e un controller di display standard per i display MIPI DSI.

backlight Specifica un modulo controller di retroilluminazione da utilizzare. Per impostazione predefinita la retroilluminazione sara controllata tramite un pin GPIO.

deinit() None

Rilascia i pin di I/O e la RAM utilizzati dalla classe. Questo viene chiamato automaticamente alla distruzione.

width() int

Restituisce la larghezza dello schermo.

height() int

Restituisce l’altezza dello schermo.

triple_buffer() int

Restituisce se il triple buffering e abilitato.

bgr() int

Restituisce se il display si aspetta pixel ordinati in BGR.

byte_swap() int

Restituisce se il display si aspetta pixel con i byte scambiati.

framesize() int

Restituisce la costante framesize con cui il display e stato inizializzato.

refresh() int

Restituisce la frequenza di aggiornamento in hertz.

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

Visualizza un”image il cui angolo superiore sinistro inizia nella posizione x, y.

image puo essere una stringa di percorso invece di un oggetto immagine per caricare automaticamente l’immagine dal disco. Ad es. write("test.jpg").

x_scale controlla di quanto l’immagine visualizzata viene scalata in direzione x (float). Se questo valore e negativo l’immagine sara ribaltata orizzontalmente. Se y_scale non e specificato corrispondera a x_scale per mantenere il rapporto d’aspetto.

y_scale controlla di quanto l’immagine visualizzata viene scalata in direzione y (float). Se questo valore e negativo l’immagine sara ribaltata verticalmente. Il ribaltamento verticale richiede triple_buffer=True. Se x_scale non e specificato corrispondera a y_scale.

roi e la tupla del rettangolo della regione di interesse (x, y, w, h) dell’immagine da visualizzare.

rgb_channel e il canale RGB (0=R, 1=G, 2=B) da estrarre da un’immagine RGB565 e da rendere sul display in scala di grigi. -1 disabilita l’estrazione. L’intervallo valido va da -1 a 2.

alpha controlla quanto e opaca l’immagine. 255 visualizza un’immagine opaca, valori inferiori la sfumano verso il nero, e 0 produce un’immagine completamente nera. L’intervallo valido va da 0 a 255.

color_palette puo essere un enum di palette di colori o un’immagine RGB565 di 256 pixel da utilizzare come tabella di lookup dei colori sul valore in scala di grigi dell’immagine di input. Applicata dopo l’estrazione di rgb_channel.

alpha_palette puo essere un’immagine in scala di grigi di 256 pixel utilizzata come tabella di lookup alpha che modula alpha per ogni valore in scala di grigi del pixel di input. Applicata dopo l’estrazione di rgb_channel.

hint e un OR logico dei flag:

clear(display_off: bool = False) None

Azzera il framebuffer dell’LCD portandolo al nero.

display_off se True spegne la logica del display invece di azzerare il framebuffer.

backlight(value: int | None = None) int

Imposta il valore di attenuazione della retroilluminazione dell’LCD, da 0 (spento) a 100 (acceso). Non passare argomenti per ottenere il valore corrente della retroilluminazione.

A meno che un controller DACBacklight o PWMBacklight non venga passato al costruttore, la retroilluminazione viene controllata come un pin GPIO e potra solo passare da 0 (spento) a un valore diverso da zero (acceso).

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

Invia il comando DSI cmd al display.

args e un intero opzionale o un buffer contenente i parametri del comando.

dcs se True invia il comando come pacchetto DCS (Display Command Set).

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

Legge len byte dal display utilizzando il comando DSI cmd.

args e un intero opzionale o un buffer contenente i parametri del comando.

dcs se True invia il comando come pacchetto DCS (Display Command Set).

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

Invia un ioctl cmd specifico del driver con un arg opzionale al display. Solleva ValueError se il display non supporta ioctl.