class DSIDisplay – драйвер дисплея DSI

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

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

Кадры выводятся вызовом 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 Меняет местами ширину и высоту framesize.

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

Возвращает константу 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, левый верхний угол которого начинается в позиции 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

Очищает буфер кадра ЖК-дисплея, заполняя его чёрным.

display_off если True, выключает логику дисплея вместо очистки буфера кадра.

backlight(value: int | None = None) int

Устанавливает значение затемнения подсветки ЖК-дисплея, от 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.