class DSIDisplay -- DSI 显示驱动¶
DSIDisplay 类通过 STM32 DSI 主机控制器驱动 MIPI-DSI 面板。MIPI DSI 是一种分包式串行显示协议,使用一条时钟通道加上一条或多条以差分对形式存在的数据通道,这使其能够以远少于 24 位并行 RGB 的线缆数量传输高分辨率内容(最高 1080p)。像素以所选的刷新率从 SDRAM 支持的帧缓冲区直接流出,因此 CPU 不参与刷新。
面板分辨率通过 framesize 使用 display 模块中的常量(QVGA、VGA、HD、FHD ……)来选择。面板专用的初始化序列通过 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 引脚控制。- 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,其左上角从位置x、y开始。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是以下标志的逻辑或:image.AREA:在缩小时使用面积缩放,而非默认的最近邻缩放。image.BILINEAR:使用双线性缩放,而非默认的最近邻缩放。image.BICUBIC:使用双三次缩放,而非默认的最近邻缩放。image.CENTER:将正在绘制的图像在显示器上居中。此项在缩放之后应用。image.HMIRROR:水平镜像图像。image.VFLIP:垂直翻转图像。image.TRANSPOSE:转置图像(交换 x/y)。image.EXTRACT_RGB_CHANNEL_FIRST:在缩放之前进行 rgb_channel 提取。image.APPLY_COLOR_PALETTE_FIRST:在缩放之前应用颜色调色板。image.SCALE_ASPECT_KEEP:缩放正在绘制的图像以适配显示器内部。image.SCALE_ASPECT_EXPAND:缩放正在绘制的图像以填满显示器(会导致裁剪)。image.SCALE_ASPECT_IGNORE:缩放正在绘制的图像以填满显示器(会导致拉伸)。image.ROTATE_90:将图像旋转 90 度(这只是 VFLIP | TRANSPOSE)。image.ROTATE_180:将图像旋转 180 度(这只是 HMIRROR | VFLIP)。image.ROTATE_270:将图像旋转 270 度(这只是 HMIRROR | TRANSPOSE)。
- backlight(value: int | None = None) int¶
设置 LCD 背光调光值,0(关)到 100(开)。不传参数则获取当前背光值。
除非向构造函数传入了
DACBacklight或PWMBacklight控制器,否则背光将作为 GPIO 引脚控制,只能在 0(关)和非零(开)之间切换。
- bus_write(cmd: int, args: int | bytes | None = None, *, dcs: bool = False) None¶
向显示器发送 DSI 命令
cmd。args是一个可选的整数或包含命令参数的缓冲区。dcs如果为 True,则将该命令作为 DCS(Display Command Set,显示命令集)数据包发送。