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 是下列旗標的邏輯 OR:

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