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是下列旗標的邏輯 OR: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)封包發送命令。