клас DSIDisplay – Драйвер DSI-дисплея

Клас DSIDisplay керує панелями MIPI-DSI через хост-контролер DSI STM32. MIPI DSI — це пакетний послідовний протокол відображення, який використовує один тактовий лейн і один або більше інформаційних лейнів як диференційні пари, що дозволяє передавати контент високої роздільної здатності (до 1080p) значно меншою кількістю проводів, ніж 24-бітний паралельний RGB. Пікселі потокуються безпосередньо з кадрового буфера на основі SDRAM з обраною частотою оновлення, тому процесор не бере участі в оновленні.

Роздільна здатність панелі вибирається через framesize за допомогою констант у модулі display (QVGA, VGA, HD, FHD, …). Специфічні для панелі послідовності ініціалізації підключаються через аргумент ключового слова controllerST7701 охоплює звичайні панелі DSI 480x800 на основі ST7701. Команди DCS можна надсилати поза діапазоном через bus_write() / bus_read(). Яскравість підсвічування за замовчуванням керується як простий GPIO, або через DACBacklight / PWMBacklight, якщо передано як backlight.

Кадри відображаються шляхом виклику write() з image.Image. Драйвер внутрішньо обробляє перетворення RGB, масштабування, ROI, палітру та трансформації орієнтації.

Приклад — відображення зображення з камери на панелі DSI 480x800 на основі 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)

Конструктори

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 міняє місцями ширину та висоту розміру кадру.

channel віртуальний канал MIPI DSI для зв’язку з дисплеєм.

controller передайте сюди клас мікросхеми контролера для ініціалізації разом із дисплеєм. Наприклад, display.ST7701() — стандартний контролер дисплея для MIPI DSI-дисплеїв.

backlight вкажіть модуль контролера підсвічування для використання. За замовчуванням підсвічування керується через вивід GPIO.

deinit() None

Звільняє виводи вводу/виводу та RAM, що використовуються класом. Викликається автоматично під час знищення.

width() int

Повертає ширину екрана.

height() int

Повертає висоту екрана.

triple_buffer() int

Повертає, чи увімкнено потрійне буферування.

bgr() int

Повертає, чи очікує дисплей пікселів у порядку BGR.

byte_swap() int

Повертає, чи очікує дисплей пікселів із заміною байтів.

framesize() int

Повертає константу розміру кадру, з якою був ініціалізований дисплей.

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, верхній лівий кут якого починається в позиції x, y.

image може бути рядком шляху замість об’єкта зображення для автоматичного завантаження зображення з диска. Наприклад, write("test.jpg").

x_scale визначає, наскільки зображення, що відображається, масштабується у напрямку x (float). Якщо це значення від’ємне, зображення буде відображено горизонтально. Якщо y_scale не вказано, воно відповідатиме x_scale для збереження пропорцій.

y_scale визначає, наскільки зображення, що відображається, масштабується у напрямку y (float). Якщо це значення від’ємне, зображення буде перевернуто вертикально. Вертикальне перевертання вимагає triple_buffer=True. Якщо x_scale не вказано, воно відповідатиме y_scale.

roi — це кортеж прямокутника області інтересу (x, y, w, h) зображення для відображення.

rgb_channel — це канал RGB (0=R, 1=G, 2=B) для вилучення із зображення RGB565 та відображення на дисплеї у відтінках сірого. -1 вимикає вилучення. Допустимий діапазон — від -1 до 2.

alpha визначає непрозорість зображення. 255 відображає непрозоре зображення, менші значення змішують до чорного, а 0 дає повністю чорне зображення. Допустимий діапазон — від 0 до 255.

color_palette може бути перерахуванням палітри кольорів або зображенням RGB565 розміром 256 пікселів для використання як таблиці підстановки кольорів на основі значень відтінків сірого вхідного зображення. Застосовується після вилучення rgb_channel.

alpha_palette може бути зображенням у відтінках сірого розміром 256 пікселів, що використовується як таблиця підстановки альфа-значень, яка модулює 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).

clear(display_off: bool = False) None

Очищає кадровий буфер LCD до чорного кольору.

display_off якщо True, вимикає логіку дисплея замість очищення кадрового буфера.

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).

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

Зчитує len байтів з дисплея за допомогою команди DSI cmd.

args — необов’язкове ціле число або буфер, що містить параметри команди.

dcs якщо True, надсилає команду як пакет DCS (Display Command Set).

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

Надсилає специфічну для драйвера команду ioctl cmd з необов’язковим аргументом arg на дисплей. Видає ValueError, якщо дисплей не підтримує ioctl.