clase DSIDisplay – Controlador de pantalla DSI

La clase DSIDisplay controla paneles MIPI-DSI a través del controlador host DSI del STM32. MIPI DSI es un protocolo de pantalla serie por paquetes que utiliza un carril de reloj más uno o más carriles de datos como pares diferenciales, lo que le permite transportar contenido de alta resolución (hasta 1080p) con muchos menos cables que el RGB paralelo de 24 bits. Los píxeles se transmiten directamente desde un búfer de fotogramas (frame buffer) respaldado por SDRAM a la frecuencia de actualización elegida, por lo que la CPU no interviene en la actualización.

La resolución del panel se selecciona mediante framesize usando las constantes del módulo display (QVGA, VGA, HD, FHD, …). Las secuencias de inicialización específicas de cada panel se conectan a través del argumento por palabra clave controller: ST7701 cubre los paneles DSI de 480x800 basados en ST7701 más comunes. Los comandos DCS pueden emitirse fuera de banda mediante bus_write() / bus_read(). El brillo de la retroiluminación se controla como un simple GPIO de forma predeterminada, o mediante DACBacklight / PWMBacklight si se pasa como backlight.

Los fotogramas se presentan llamando a write() con una image.Image. El controlador gestiona internamente la conversión RGB, el escalado, la ROI, la paleta y las transformaciones de orientación.

Ejemplo – reflejar la cámara en un panel DSI de 480x800 basado en 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)

Constructores

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 de las resoluciones estándar admitidas (p. ej. display.FWVGA).

refresh Establece la frecuencia de actualización de la pantalla en hercios. El rango válido es de 30 a 120. Controla el reloj del LCD DSI.

display_on Habilita la pantalla.

triple_buffer Asigna tres búferes de fotogramas para permitir actualizaciones de pantalla sin desgarro (tearing). Necesario para el volteo vertical en write().

portrait Intercambia el ancho y el alto del framesize.

channel El canal virtual MIPI DSI a utilizar para comunicarse con la pantalla.

controller Pase aquí la clase del chip controlador para inicializarlo junto con la pantalla. P. ej. display.ST7701(), que es un controlador de pantalla estándar para pantallas MIPI DSI.

backlight Especifica un módulo controlador de retroiluminación a utilizar. De forma predeterminada, la retroiluminación se controla mediante un pin GPIO.

deinit() None

Libera los pines de E/S y la RAM utilizados por la clase. Se llama automáticamente al destruir el objeto.

width() int

Devuelve el ancho de la pantalla.

height() int

Devuelve el alto de la pantalla.

triple_buffer() int

Devuelve si el triple búfer está habilitado.

bgr() int

Devuelve si la pantalla espera píxeles ordenados como BGR.

byte_swap() int

Devuelve si la pantalla espera píxeles con bytes intercambiados.

framesize() int

Devuelve la constante de framesize con la que se inicializó la pantalla.

refresh() int

Devuelve la frecuencia de actualización en hercios.

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

Muestra una image cuya esquina superior izquierda comienza en la ubicación x, y.

image puede ser una cadena de ruta en lugar de un objeto de imagen para cargar automáticamente la imagen desde el disco. P. ej. write("test.jpg").

x_scale controla cuánto se escala la imagen mostrada en la dirección x (float). Si este valor es negativo, la imagen se voltea horizontalmente. Si no se especifica y_scale, coincidirá con x_scale para mantener la relación de aspecto.

y_scale controla cuánto se escala la imagen mostrada en la dirección y (float). Si este valor es negativo, la imagen se voltea verticalmente. El volteo vertical requiere triple_buffer=True. Si no se especifica x_scale, coincidirá con y_scale.

roi es la tupla del rectángulo de la región de interés (x, y, w, h) de la imagen a mostrar.

rgb_channel es el canal RGB (0=R, 1=G, 2=B) a extraer de una imagen RGB565 y renderizar en la pantalla en escala de grises. -1 deshabilita la extracción. El rango válido es de -1 a 2.

alpha controla cómo de opaca es la imagen. 255 muestra una imagen opaca, los valores más bajos la mezclan hacia el negro y 0 produce una imagen completamente negra. El rango válido es de 0 a 255.

color_palette puede ser un enum de paleta de colores o una imagen RGB565 de 256 píxeles para usarla como tabla de búsqueda de color sobre el valor en escala de grises de la imagen de entrada. Se aplica después de la extracción de rgb_channel.

alpha_palette puede ser una imagen en escala de grises de 256 píxeles utilizada como tabla de búsqueda de alfa que modula alpha según el valor en escala de grises de cada píxel de entrada. Se aplica después de la extracción de rgb_channel.

hint es un OR lógico de los indicadores:

clear(display_off: bool = False) None

Borra el búfer de fotogramas del LCD a negro.

display_off si es True apaga la lógica de la pantalla en lugar de borrar el búfer de fotogramas.

backlight(value: int | None = None) int

Establece el valor de atenuación de la retroiluminación del LCD, de 0 (apagado) a 100 (encendido). No pase argumentos para obtener el valor actual de la retroiluminación.

A menos que se pase un controlador DACBacklight o PWMBacklight al constructor, la retroiluminación se controla como un pin GPIO y solo pasará de 0 (apagado) a distinto de cero (encendido).

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

Envía el comando DSI cmd a la pantalla.

args es un entero o búfer opcional que contiene los parámetros del comando.

dcs si es True envía el comando como un paquete DCS (Display Command Set).

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

Lee len bytes de la pantalla usando el comando DSI cmd.

args es un entero o búfer opcional que contiene los parámetros del comando.

dcs si es True envía el comando como un paquete DCS (Display Command Set).

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

Envía un ioctl cmd específico del controlador con un arg opcional a la pantalla. Lanza ValueError si la pantalla no admite ioctl.