class DSIDisplay -- DSI 显示驱动

DSIDisplay 类通过 STM32 DSI 主机控制器驱动 MIPI-DSI 面板。MIPI DSI 是一种分包式串行显示协议,使用一条时钟通道加上一条或多条以差分对形式存在的数据通道,这使其能够以远少于 24 位并行 RGB 的线缆数量传输高分辨率内容(最高 1080p)。像素以所选的刷新率从 SDRAM 支持的帧缓冲区直接流出,因此 CPU 不参与刷新。

面板分辨率通过 framesize 使用 display 模块中的常量(QVGAVGAHDFHD ……)来选择。面板专用的初始化序列通过 controller 关键字参数接入——ST7701 覆盖了常见的基于 ST7701 的 480x800 DSI 面板。DCS 命令可以通过 bus_write() / bus_read() 带外发出。背光亮度默认作为简单的 GPIO 驱动,或者在作为 backlight 传入时由 DACBacklight / PWMBacklight 驱动。

通过以 image.Image 调用 write() 来呈现帧。驱动会在内部处理 RGB 转换、缩放、ROI、调色板和方向变换。

示例——将摄像头画面镜像到基于 ST7701 的 480x800 DSI 面板上::

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)

构造函数

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 标准支持的分辨率之一(例如 display.FWVGA)。

refresh 设置屏幕刷新率,单位为赫兹。有效范围为 30 到 120。它控制 DSI LCD 时钟。

display_on 启用显示器。

triple_buffer 分配三个帧缓冲区以实现无撕裂的显示更新。在 write() 中进行垂直翻转时需要此项。

portrait 交换 framesize 的宽度和高度。

channel 用于与显示器通信的虚拟 MIPI DSI 通道。

controller 在此处传入控制器芯片类,以便随显示器一起初始化它。例如 display.ST7701(),它是 MIPI DSI 显示器的标准显示控制器。

backlight 指定要使用的背光控制器模块。默认情况下,背光将通过一个 GPIO 引脚控制。

deinit() None

释放该类所使用的 I/O 引脚和 RAM。在销毁时会自动调用此方法。

width() int

返回屏幕的宽度。

height() int

返回屏幕的高度。

triple_buffer() int

返回是否启用了三缓冲。

bgr() int

返回显示器是否期望 BGR 顺序的像素。

byte_swap() int

返回显示器是否期望字节交换的像素。

framesize() int

返回显示器初始化时所用的 framesize 常量。

refresh() int

返回刷新率,单位为赫兹。

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

显示一个 image,其左上角从位置 xy 开始。

image 可以是路径字符串而非图像对象,以便自动从磁盘加载图像。例如 write("test.jpg")

x_scale 控制所显示图像在 x 方向上的缩放倍数(浮点数)。如果此值为负,图像将被水平翻转。如果未指定 y_scale,则它将与 x_scale 匹配以保持纵横比。

y_scale 控制所显示图像在 y 方向上的缩放倍数(浮点数)。如果此值为负,图像将被垂直翻转。垂直翻转需要 triple_buffer=True。如果未指定 x_scale,则它将与 y_scale 匹配。

roi 是要显示图像的感兴趣区域矩形元组 (x, y, w, h)。

rgb_channel 是要从 RGB565 图像中提取并以灰度形式在显示器上渲染的 RGB 通道(0=R,1=G,2=B)。-1 表示禁用提取。有效范围为 -1 到 2。

alpha 控制图像的不透明度。255 显示不透明图像,较低的值会向黑色混合,0 则产生完全黑色的图像。有效范围为 0 到 255。

color_palette 可以是颜色调色板枚举,或一个 256 像素的 RGB565 图像,用作输入图像灰度值的颜色查找表。在 rgb_channel 提取之后应用。

alpha_palette 可以是一个 256 像素的灰度图像,用作 alpha 查找表,根据每个输入像素的灰度值调制 alpha。在 rgb_channel 提取之后应用。

hint 是以下标志的逻辑或:

clear(display_off: bool = False) None

将 LCD 帧缓冲区清空为黑色。

display_off 如果为 True,则关闭显示逻辑而非清空帧缓冲区。

backlight(value: int | None = None) int

设置 LCD 背光调光值,0(关)到 100(开)。不传参数则获取当前背光值。

除非向构造函数传入了 DACBacklightPWMBacklight 控制器,否则背光将作为 GPIO 引脚控制,只能在 0(关)和非零(开)之间切换。

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

向显示器发送 DSI 命令 cmd

args 是一个可选的整数或包含命令参数的缓冲区。

dcs 如果为 True,则将该命令作为 DCS(Display Command Set,显示命令集)数据包发送。

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

使用 DSI 命令 cmd 从显示器读取 len 个字节。

args 是一个可选的整数或包含命令参数的缓冲区。

dcs 如果为 True,则将该命令作为 DCS(Display Command Set,显示命令集)数据包发送。

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

向显示器发送一个驱动专用的 ioctl cmd,并附带可选的 arg。如果显示器不支持 ioctl,则抛出 ValueError