Тест LVGL

Введение в LVGL

LVGL (Light and Versatile Graphics Library) — это графическая библиотека с открытым исходным кодом для создания пользовательских интерфейсов (GUI), предназначенная для предоставления эффективных решений для графического отображения с низким потреблением ресурсов на встраиваемых устройствах. Она широко используется в маломощных встраиваемых системах с ограниченными ресурсами, поддерживает множество аппаратных платформ и предлагает богатый набор компонентов графического интерфейса и анимационных эффектов.

LVGL является полностью открытым исходным кодом, что дает несколько значительных преимуществ. Во-первых, это дает вам полный контроль над библиотекой, поскольку вы можете не только просматривать, изменять, компилировать и отлаживать исходный код, но и получать его целиком. После загрузки он принадлежит вам. Эта независимость от одного поставщика чрезвычайно ценна. Кроме того, открытый исходный код способствует сотрудничеству и обмену знаниями, поскольку разработчики со всего мира вносят свой вклад в улучшение программного обеспечения, делая его более надежным и многофункциональным для решения широкого круга реальных проблем.

LVGL выпускается под лицензией MIT, которая позволяет пользователям свободно использовать, изменять и распространять программное обеспечение без каких-либо сложных ограничений или условий. Это обеспечивает гибкость для разработчиков и компаний, позволяя им интегрировать программное обеспечение в свои проекты, в том числе в коммерческих целях, при условии сохранения указания на первоначального автора.

Введение в VDMA

AXI VDMA (сокращенно VDMA) — это программное IP-ядро, предоставляемое Xilinx, которое используется для преобразования потоков данных из формата AXI Stream в формат Memory Map или из формата Memory Map в формат AXI Stream. Другими словами, VDMA предназначен для обеспечения функциональности передачи видеоданных (чтение/запись) из домена AXI4 в домен AXI4-Stream, что позволяет осуществлять высокоскоростное перемещение данных между системной памятью (в основном DDR3) и целевыми видео-IP на базе AXI4-Stream. Его функциональность в некоторой степени схожа с AXI DMA (DMA), в основном обеспечивая высокоскоростную передачу данных между памятью на стороне PS и целевыми периферийными устройствами типа AXI4-Stream. VDMA — это усовершенствованная версия DMA, специально разработанная для приложений, связанных с видео и изображениями. По сравнению с DMA, в VDMA добавлены такие функции, как механизм кадрового буфера (Frame Buffer) и GenLock (динамическая синхронизация). VDMA интегрирует специфичные для видео функции, такие как синхронизация кадров и 2D DMA-передачи, что делает его очень подходящим для обработки изображений и видео на архитектуре ZYNQ и сокращает цикл разработки для программистов.

Сенсорный ЖК-экран

Используемый здесь ЖК-экран имеет разрешение 1024*600, интерфейс RGB888 и сенсорный чип GT911. Конкретные параметры ЖК-экрана показаны на рисунке ниже:

image-20250822102741030

Создание проекта Vivado

В данном проекте ключевой задачей процесса отображения изображения является реализация функций управления и отображения графической библиотеки LVGL на RGB LCD. Общая архитектура системы, как показано на рисунке, в основном достигается за счет совместной работы Processing System (PS) и Programmable Logic (PL).

Конкретный процесс выглядит следующим образом:

Общая структура:

image-20250805090638457

Это будет основано на ранее созданном проекте Vivado, который уже включает такие функции, как HDMI и PL_NET. Для их конфигурации вы можете обратиться к предыдущим шагам настройки. Здесь мы в основном добавим или изменим некоторые конфигурации:

Дополним конфигурации, связанные с Zynq PS:

image-20250822103808391

Здесь FCLK_CLK0 используется для LVGL, FCLK_CLK1 — для HDMI, а FCLK_CLK2 — для PL_NET1.

image-20250822104302196

Здесь HP0 используется для HDMI, а HP1 — для LVGL.

image-20250822104725441

Добавим 7 выводов GPIO через EMIO для управляющих сигналов LCD экрана и сенсорной панели.

image-20250822105528683

Добавим VDMA. Найдите и добавьте модуль VDMA, затем дважды щелкните, чтобы открыть страницу его конфигурации.

image-20250731162618441

В этом проекте используется только функция чтения VDMA, поэтому функция Enable Write Channel здесь отключена. Буфер кадров установлен на 2. Поскольку отображаемое содержимое — это RGB888 (24-битный цвет), ширина данных потока (Stream Data Width) изменена на 24. Глубина буфера строк (Line Buffer Depth) изменена на 2048, а размер пакета чтения (Read Burst Size) изменен на 64.

image-20250731162840942

Добавим модуль Video Out. Цель этого модуля — преобразовать поток данных AXI4-Stream в стандартный видеовыход, соответствующий RGB LCD экрану.

image-20250731165810614

Измените режим тактирования (Clock Mode) на Independent. Для режима синхронизации (Timing Mode): поскольку мы будем использовать модуль Video Timing Controller для предоставления видеосинхронизации позже, выберите здесь режим Slave:

image-20250731170337068

Добавим модуль Video Timing Controller: Найдите и добавьте модуль Video Timing Controller, затем дважды щелкните, чтобы открыть страницу его конфигурации.

 

image-20250731170526406

Страница первая:

image-20250731170702535

Страница вторая:

На второй странице мы устанавливаем разрешение. Здесь мы сначала установим его на 1024x600. Выберите CUSTOM и заполните остальные параметры, как показано на рисунке ниже. Эти конфигурации можно будет изменить позже через код Vitis на стороне PS.

Описание соответствующих параметров можно найти по ссылке: Серия для начинающих по видео 16: Понимание видеосинхронизации с помощью IP VTC

image-20250731170858279

Измените параметры в соответствии с рисунком ниже. Способ изменения будет описан позже.

 

Добавим модуль clk_wiz: Найдите и добавьте модуль clk_wiz, затем дважды щелкните, чтобы открыть страницу его конфигурации:

image-20250731174318633

Настройте, как показано на рисунке ниже: Необходимо включить интерфейс AXI, чтобы выходная частота могла управляться через Vitis.

image-20250731174348654

image-20250731174411056

 

На этом этапе у нас есть все необходимые модули. Следующий шаг — их соединение.

 

Щелкните левой кнопкой мыши на знак «плюс» на порту vid_io_out модуля Video Out, чтобы развернуть его содержимое. Выберите сигналы vid_active_video, vid_data, vid_hsync и vid_vsync, затем щелкните правой кнопкой мыши и выберите «Make External», чтобы вывести сигналы.

image-20250731171911618

Переименуйте эти сигналы в lcd_de, lcd_data, lcd_hsync и lcd_vsync соответственно. (Выберите сигнал и измените его имя в поле «Name» на левой панели).

image-20250731173509721

Подключите clk модуля VTC (Video Timing Controller) к пиксельному тактовому сигналу clk_out1. Поскольку этот clk и пиксельный тактовый сигнал должны быть высокосинхронизированы, clk модуля AXI4-Stream to Video Out также должен быть подключен к этому пиксельному тактовому сигналу.

image-20250731174550095

Добавьте соединение для GEN_CLKEN модуля Video Timing, как показано на рисунке ниже.

image-20250731175434383

Нажмите «Run Connection Automation», чтобы автоматически соединить оставшиеся линии.

image-20250731175455968

В появившемся диалоговом окне настроек отметьте все пункты, и система автоматически соединит оставшиеся сигнальные линии и добавит необходимые нам модули.

Добавьте модуль Constant для предоставления константы '1', которая будет использоваться для подключения сигналов разрешения ce и aclken наших различных модулей.

image-20250731175728700

image-20250731175858429

Окончательная схема соединений выглядит следующим образом: Выделенные IP-блоки — это новые, добавленные в этом проекте.

image-20250902140013062

Сохраните проект, затем нажмите Source → Design Sources. Щелкните правой кнопкой мыши на созданный нами блочный дизайн и нажмите «Create HDL Wrapper».

image-20250801090722040

Настройте назначение выводов в соответствии со схемой:

image-20250801143429974

Готовый файл .xdc:

Скомпилируйте и синтезируйте проект, сгенерируйте битстрим, затем перейдите в File → Export → Export Hardware, чтобы экспортировать файл .xsa.

Создание проекта Vitis

Создайте новый проект платформы:

image-20250730115142359

image-20250730115513634

Выберите только что экспортированный файл .xsa и измените операционную систему на freertos:

image-20250804174649206

Создайте новый проект приложения:

image-20250730115853514

image-20250730120012260

Выберите здесь пустой файл

image-20250730120108384

Добавление и изменение файлов:

Создание файла clk_wiz

Создайте папку clk_wiz в каталоге src: используется для установки выходной тактовой частоты IP-ядра.

image-20250730134515934

image-20250804091526290

Добавьте файл .c

Создание файла display_ctrl

Источник кода: https://github.com/Digilent/Zybo-hdmi-out/tree/master/sdk/displaydemo/src/display_ctrl

image-20250804094923894

В файле vga_modes.h необходимо изменить следующие параметры в соответствии с разрешением вашего экрана:

image-20250822114919485

Настройте в соответствии с приведенной выше таблицей таймингов:

Создание файла Touch

Создайте файлы touch.c и touch.h, используя сенсорный экран GT911:

image-20250804102146048

О GT911

Этот чип представляет собой драйвер емкостного сенсорного экрана, который поддерживает частоту сканирования контактов 100 Гц, 5-точечное касание и 18*10 каналов обнаружения. GT911 подключается к ПЛИС через 4 провода: SDA, SCL, RST и INT. Среди них SDA и SCL предназначены для связи по I2C, RST — это вывод сброса (активный низкий уровень), а INT — сигнал прерывания. GT911 использует стандартную связь I2C с максимальной скоростью 400 кГц. Адрес устройства I2C для GT911 может быть 0X14 или 0X5D. В течение 5 мс после сброса, если на выводе INT высокий уровень, используется адрес 0X14; в противном случае используется 0X5D. В этом проекте мы будем использовать 0xBA в качестве адреса устройства.

Код выглядит следующим образом:

Создание файлов VDMA:

Создайте vdma.c и vdma.h:

image-20250804103508171

Для конкретной реализации кода вы можете обратиться к примеру, предоставленному Xilinx.

image-20250804104355196

image-20250804104443461

image-20250804104459768

Код VDMA:

Создание файла DMA:

Аналогично VDMA, код может быть основан на примере, предоставленном Xilinx.

image-20250804105359842

Измените код на основе шаблона:

Важно отметить, что существует ограничение на длину данных, которые может передать один канал DMA (это можно найти в коде BSP DMA: xdmaps.c).

Объем данных, который необходимо передать за одну операцию, зависит от разрешения ЖК-дисплея. Например, при разрешении 1024*600 в формате RGB888 одна передача DMA требует 1024 * 600 * 3 = 1843200 байт.

При высоких разрешениях длина передаваемых данных может превышать максимальную емкость одного канала DMA. В этом случае можно либо увеличить burst size и burst len, либо разделить передачу данных на несколько каналов DMA.

Код секции DMA:

Портирование файлов LVGL

Ссылка для скачивания исходного кода LVGL_V9.2.2

Создайте две папки в каталоге src: lvgl/lvgl и lvgl/lvgl_app,

image-20250801150638056

Скопируйте lvgl-9.2.2/src и lvgl-9.2.2/examples в src/lvgl/lvgl;

Скопируйте lvgl-9.2.2/lv_version.h, lvgl-9.2.2/lv_version.h.in, lvgl-9.2.2/lvgl.h в src/lvgl/lvgl

image-20250805093929984

 

Скопируйте lvgl-9.2.2/lv_conf_template.h в src/lvgl и переименуйте его в lv_conf.h

image-20250805093950548

Измените содержимое файла lv_conf.h в соответствии со следующими изображениями:

image-20250801152055815

 

image-20250801152205535

 

image-20250801152226076

 

image-20250801152245671

Удалите все файлы и папки, кроме porting, в каталоге src/lvgl/lvgl/examples, а также удалите папку osal в файле porting

В конфигурации FreeRTOS проекта платформы установите tick_rate равным 1000, что означает один тик каждые 1 мс; установите use_tick_hook в значение true

image-20250801153442257

Добавьте следующее в main.c:

 

Измените следующие четыре файла:

Измените #if 0 на #if 1 во всех четырех файлах,

Измените файл lv_port_indev_template.c следующим образом:

В файле lv_port_disp_template.c измените ширину и высоту экрана и добавьте следующее (остальное оставьте без изменений):

Добавление main.c

image-20250730133911127

Все созданные в итоге файлы выглядят следующим образом:

image-20250801155705429

Компиляция и отладка

Подключите сенсорный экран и отладочную плату ZYNQ,

Используйте TYPE-C для подключения порта JTAG отладочной платы к компьютеру, выполните сборку и отладку, и наблюдайте за ЖК-дисплеем.

image-20250822144736415