LAutour / ESP32-HUB75-MatrixPanel-I2S-DMA-icn2053

Unsupported. New version ESP32-HUB75-MatrixPanel-DMA-icn2053
5 stars 0 forks source link
esp32 esp32-arduino fm6353 hub-75 icn2053 led-panels

ESP32-HUB75-MatrixPanel-I2S-DMA-icn2053

Полностью переделанная библиотека на ESP32-HUB75-MatrixPanel-I2S-DMA (взят принцип) под ICN2053 (FM6353), и в отличии от ICN2053_ESP32_LedWall (взято число тактов OE для переключения строк) не потребляет все ресурсы ядра на прямой вывод в порты GPIO. Все параметры регистров конфигурации ICN2053 выдраны из программы LEDVISION для HUB75 контроллера.

Пока поддерживаются только драйверы ICN2053 и аналоги: FM6353.

Принцип работы библиотеки: ICN2053 требует по 16 бит на каждый пиксел. С учетом что на каждые 2 бита пикселя требуется 1 слово (2 байта) DMA буфера - памяти в ESP32, если использовать полностью метод из ESP32-HUB75-MatrixPanel-I2S-DMA, то одна панель съест почти всю DMA память. Поэтому для изображения создается отдельный простой видео-буфер с нужной битностью (без необходимости поддержки DMA), а для DMA вывода выделяется буфер всего на несколько строк (1, 2 или 4). Готовность DMA канала для подготовки новых строк производится по DMA прерыванию. Так как драйвер ICN2053 уже сам по себе содержит двойной буфер строк для двух кадров, а заполнение драйвера ведется в теневой буфер, то задержки с выводом влияют только на частоту смены кадров. Переключение буферов в ICN2053 буферов произовится DMA посылкой буфера префикса, содержащего команды и значений управляющих регистров для ICN2053 (регистры последовательно чередуются с каждой новый отправкой префикса).
Каждая отправка DMA строк или префикса заканчевается зацикленной отправкой буфера суффикса, содержащего простой перебор адресов строк матрицы и наборов импульсов OE для переключения памяти строк в ICN2053. Начало перебора строк также содержится в буферах строк и префикса, поэтому их переход в суффикс происходит по смещению в последнем, чтобы перебор строк был непрерывным. Примечание: префикс и суффикс - потому-что подобным образом шли управляющие пакеты данных (в начале кадра и в конце ) у контроллера HUB75, но по факту в библиотеке prefix будет идти обычно после строк. Отправка буферов через DMA производится через наборы DMA дескрипторов. Для префикса и строк используется по одному DMA набору на буфер, буфер суффикса имеет два набора DMA дескрипторов, так как с окончания одного набора будет производится переход на вывод строк\префикса, а другой закольцовывается как конечный(и так попеременно).

Для уменьшения задержек вывода кадров (каждое заполнение DMA буфера строк из видео буфера занимает несколько милисекунд) опционально предусмотрены возможности:

  1. двойной видеобуфер - работает стандартно, рисуем в одном буфере, выводим другой
  2. двойной буфер DMA строк (следующая готовится не дожидаясь вывода предыдущей) - немного сокращает задержки на выводах суффикса, зависит от скорости отрисовки нового кадра, размера буфера DMA строк (2,4 строки), частоты шины DMA, и в каком месте суффикса заканчивается вывод строк.

Другие особенности:

P.S. С наворотами C++ не дружу, код по возможности в Паскаль-стиле, оптимизации компиляторов под микроконтроллеры не доверяю - поэтому многие базовые вещи ESP32-HUB75-MatrixPanel-I2S-DMA реализованы по другому.