Я давно носил идею проверки HDMI на платах Zynq, и вот наконец-то дошли руки до этого интересного топика. В этой статье я покажу, что вывод изображения через HDMI достаточно прост, но ограничусь только рассмотрением вывода изображения из baremetal-приложений, а вопросы про Linux оставлю для следующей статьи. В первую очередь изучим возможность простого вывода изображения в HDMI из генератора тестовых изображений с использованием Test Pattern Generator в PL-логике, а затем коснёмся применения AXI Video DMA.
Всем интересующимся добро пожаловать под кат!
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 1 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 1](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal.png)
Важно! Перед началом повествования, хотелось бы заранее оговориться, что основная цель, которую я преследую при написании этой статьи — рассказать о своем опыте, с чего можно начать при изучении отладочных плат на базе Zynq. Я не являюсь профессиональным разработчиком под ПЛИС и SoC Zynq, не являюсь системным программистом под Linux и могу допускать какие-либо ошибки в использовании терминологии, использовать не самые оптимальные пути решения задач, etc. Но отмечу, что любая конструктивная и аргументированная критика только приветствуется. Что ж, поехали…
❯ Концепция проекта и постановка задачи
Основная задача, которая стоит перед нами — запустить вывод HDMI-изображения на отладочной плате Zynq Mini.
Если разделить задачу на подпункты, то нам необходимо:
-
Подготовить проект в Xilinx Vivado и проверить работоспособность HDMI c Test Pattern Generator;
-
Создать baremetal-проект для запуска Test Pattern Generator в Vitis;
-
Создать проект для вывода изображения с использованием AXI Video DMA в Vivado;
-
Создать baremetal-проект для вывода изображения с использованием AXI Video DMA в Vitis.
Задача, в целом, не сложная и ниже я опишу как её решал. Приступим.
❯ Вывод HDMI на плате ZynqMini
Для начала разберёмся что такое HDMI. Как пишут в Wiki — HDMI aka High Definition Multimedia Interface — это стандартный интерфейс передачи видео в высоком разрешении с возможностью передачи аудио.
Стандартный разъём HMDI имеет 19 контактов, 8 из которых используются для передачи информации по 4 дифференциальным парам по протоколу TMDS (Transition-Minimized Differential Signaling) видеоинформации:
-
TMDS Clock+/Clock-;
-
TMDS Data0+/Data0-;
-
TMDS Data1+/Data1-;
-
TMDS Data2+/Data2-.
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 2 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 2](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-2.png)
Для вывода видеоданных из ПЛИС мы будем использовать 8 пинов, которые сконфигурируем как 4 дифференциальных TDMS выхода. Но об этом позже.
Общий принцип передачи данных может быть изображён так:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 3 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 3](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-3.png)
Протокол TMDS кодирует 8 битные каналы в 10 бит. Подробнее рассказано в этом видео. После формирования исходные данные проходят сериализацию и отправляются получателю, который выполняет обратное преобразование для декодирования данных.
Общая схема подключения разъёма HDMI на плате ZynqMini выглядит так:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 4 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 4](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-4.png)
Со стороны Zynq-7000 распиновка следующая:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 5 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 5](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-5.png)
Таким образом получаем следующую схему подключения сигналов HDMI к Zynq-7000:
-
HDMI_CLK_P - к H16;
-
HDMI_CLK_N - к H17;
-
HDMI_DATA0_P - к D19;
-
HDMI_DATA0_N - к D20;
-
HDMI_DATA1_P - к C20;
-
HDMI_DATA1_N - к B20;
-
HDMI_DATA2_P - к B19;
-
HDMI_DATA2_N - к A20;
-
HDMI_OUT_EN - к H18.
Поскольку все эти сигналы по полярности соответствуют тому, что предлагает Pin Planner в Vivado — инвертировать ничего не потребуется, идём дальше. Сверимся позже, когда будем формировать constraints-файл:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 6 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 6](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-6.png)
Чтобы подготовить и отправить данные в HDMI разъём, мы будем использовать IP-ядро, которое любезно предоставляет компания Digilent RGB2DVI. Общая блок-схема данного IP-ядра выглядит следующим образом:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 7 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 7](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-7.png)
Данный блок принимает на вход сигнал тактирования, 24-битные данные RGB, HSYNC, VSYNC и сигнал валидности полученных данных VDE.
Входная тактовая частота должна быть в 5 раз выше тактовой частоты PixelClk, потому что для каждого пикселя мы кодируем 10 бит данных и данные тактируются по нарастающему и нисходящему фронту тактового сигнала.
Сигнал VDE — это сигнал валидности данных, который выставляется в высокий уровень когда отправлена очередная порция данных.
Для рассмотрения дальнейших шагов создадим новый проект в Vivado.
❯ Подготовка проекта Vivado для запуска Test Pattern Generator
Начинаем подготовку со стандартного проекта Vivado. В этот раз я взял за основу версию 2024.1.1. Запускаем Vivado и создаём новый проект:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 8 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 8](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-8.png)
Называем наш проект 1.HDMI_TPG и указываем директорию, в которой сохраним проект:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 9 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 9](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-9.png)
Выбираем пункт RTL Project и ставим галочку Do not specify sources at this time:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 10 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 10](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-10.png)
В следующем меню выбираем xc7z020clg400-2. Да, на плате Zynq Mini c 7020 используется чип 2 speed grade:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 11 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 11](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-11.png)
Идём дальше и нажимаем Finish:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 12 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 12](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-12.png)
Итак, исходный проект создан.
❯ Кастомные IP-ядра
Теперь необходимо добавить в проект IP-ядро RGB2DVI. Так как в составе Xilinx Vivado он отсутствует, его необходимо добавить вручную. Для этого клонируем репозиторий и добавляем IP-ядро в проект:
git clone https://github.com/Digilent/vivado-library
После добавляем новый репозиторий IP-ядер через настройки:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 13 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 13](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-13.png)
И указываем путь к директории, в которую мы склонировали репозиторий:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 14 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 14](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-14.png)
❯ Hardware PL Design
Теперь создадим наш проект с Test Pattern Generator. Добавим новый Block Design в проект:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 15 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 15](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-15.png)
Назовём его top_design:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 16 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 16](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-16.png)
Теперь добавим в Block Design модуль процессорной системы:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 17 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 17](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-17.png)
В списке находим ZYNQ7 Processing System и добавляем его:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 18 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 18](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-18.png)
На Block Design будет добавлен модуль, через который можно сконфигурировать PS-систему. После будет предложено запустить автоматизацию:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 19 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 19](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-19.png)
Запускаем мастер и нажимаем Ok, оставив значения по умолчанию:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 20 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 20](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-20.png)
Далее необходимо настроить модуль PS-системы. Делаем двойной клик по нему — откроется меню конфигурации:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 21 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 21](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-21.png)
Переходим в меню MIO Configuration. Выбираем для Bank 1 I/O Voltage в значение LVCMOS 1.8V:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 22 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 22](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-22.png)
Мотаем ещё ниже и выбираем UART1 с пинами MIO 48 .. 49:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 23 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 23](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-23.png)
Далее переходим в меню Clock Configuration и выставляем так как это указано на скриншоте, изменив частоты тактирования FCLK_CLK0:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 24 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 24](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-24.png)
Переходим в меню DDR Configuration. Выбираем чип MT41J256M16 RE-125 и 16-битный режим:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 25 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 25](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-25.png)
Остальные блоки с настройками оставляем как есть и нажимаем Ok. Получится следующее:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 26 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 26](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-26.png)
Следующий элемент, который необходимо добавить в дизайн — Test Pattern Generator:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 27 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 27](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-27.png)
Далее нам предлагают автоматизацию, давайте сделаем её сразу и оставим выбранные опции по умолчанию:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 28 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 28](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-28.png)
Получится следующая схема:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 29 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 29](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-29.png)
Далее, необходимо преобразовать сигнал AXI Stream в Native Video. Для этого добавим IP-блок AXI Stream to Video Out:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 30 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 30](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-30.png)
К нему в пару необходим Video Timing Controller, который определяет формат выводимого изображения:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 31 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 31](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-31.png)
Предлагаемую автоматизацию не выполняем. Вместо этого откроем настройки и отключим интерфейс AXI. Детектирование таймингов также отключаем, нам их нужно только сгенерировать:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 32 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 32](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-32.png)
Далее, переходим на вкладку Default/Constant и выставляем режим вывода изображения в 1080p:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 33 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 33](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-33.png)
После, начинаем соединять сигналы. Подключаем vtiming_out к vtiming_in:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 34 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 34](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-34.png)
Сигнал vtg_ce соединяем с gen_clken:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 35 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 35](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-35.png)
Подключаем тактовые сигналы clk, aclk к основному тактовому сигналу M_AXI_GP0_ACLK:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 36 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 36](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-36.png)
И сигналы сброса к resetn, aresetn к peripheral_aresetn:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 37 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 37](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-37.png)
Далее сигнал с генератора тестовых паттернов m_axis_video подключаем к video_in:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 38 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 38](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-38.png)
Параллельный видеосигнал и набор синхросигналов передаём на преобразователь интерфейса. Для этого необходимо добавить в дизайн RGB to DVI Video Encoder:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 39 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 39](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-39.png)
Заходим в настройки данного блока и снимаем галочку Reset active high потому что везде используется Reset Active Low, все остальное не трогаем:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 40 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 40](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-40.png)
После соединяем сигналы RGB и vid_io_out:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 41 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 41](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-41.png)
Подключаем сигнал сброса aRst_n к общему сигналу сброса:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 42 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 42](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-42.png)
И подключаем сигнал тактирования PixelClk к общему сигналу тактирования:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 43 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 43](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-43.png)
Выходной интерфейс необходимо вытащить наружу через клик правой кнопкой Make External:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 44 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 44](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-44.png)
Добавляем Constant-блок для формирования сигнала HDMI_EN:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 45 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 45](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-45.png)
Нажимаем F6 для проверки полученного дизайна и получаем сообщение, что всё получилось:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 46 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 46](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-46.png)
Получаем вот такой дизайн:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 47 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 47](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-47.png)
Следующим шагом создаем HDL Wrapper с управлением Vivado. Для этого перейдём в меню навигатора Sources и по top_design кликаем правой кнопкой. Затем выбираем пункт Create HDL Wrapper:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 48 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 48](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-48.png)
Нажимаем Ok выбрав пункт Let Vivado manage wrapper and auto-update:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 49 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 49](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-49.png)
После этого запускаем синтез и дожидаемся его окончания. После этого выбираем в меню Open Synthesized Design:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 50 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 50](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-50.png)
Чтобы ускорить процесс синтеза, устанавливайте Number of jobs в максимальное значение:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 51 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 51](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-51.png)
Будет запущен процесс синтеза. Дожидаемся успешного его окончания и выбираем Open Synthesized Design:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 52 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 52](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-52.png)
Жмем в главном меню Window - I/O Ports. Откроется меню в котором нужно назначить пины в соответствии со схематиком:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 53 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 53](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-53.png)
Остальные сигналы дифференциальных пар будут назначены автоматически. Сохраняем проект, именуем файл constraints и перезапускаем синтез.
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 54 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 54](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-54.png)
После этого необходимо перезапустить синтез и запустить генерацию битстрима через Generate Bitstream и дождаться окончания:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 55 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 55](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-55.png)
Экспортируем BSP-сырцы для работы с ними в Vivado и не забываем включить bitstream-файл. Переходим в меню File - Export - Export Hardware, нажимаем Next. Выбираем Include bitstream:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 56 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 56](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-56.png)
Оставляем по умолчанию меню Files:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 57 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 57](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-57.png)
Нажимаем Finish:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 58 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 58](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-58.png)
Всё. На этом подготовка проекта в Vivado закончена.
❯ Сборка baremetal-приложения для запуска Test Pattern Generator
Теперь можем переходить в Vitis для создания baremetal-приложения, которое запустит генератор тестовых паттернов. Нажимаем Tools - Launch Vitis IDE — запустится Vitis.
Первым шагом в директории проекта создадим каталог для Workspace:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 59 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 59](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-59.png)
Создаём каталог и нажимаем Ok:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 60 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 60](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-60.png)
После необходимо создать проект платформы:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 61 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 61](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-61.png)
Назовем платформу zynqmini_tpg:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 62 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 62](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-62.png)
Указываем путь к xsa-архиву в корне проекта:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 63 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 63](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-63.png)
Оставляем опции по умолчанию:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 64 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 64](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-64.png)
И нажимаем Finish:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 65 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 65](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-65.png)
После будет создан проект с boot-артефактами. Запускам его сборку через кнопку Build и дожидаемся окончания компиляции:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 66 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 66](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-66.png)
Далее из примеров создадим проект Hello World:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 67 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 67](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-67.png)
Назовем проект tpg и нажимаем Next:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 68 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 68](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-68.png)
Выбираем аппаратную платформу, которую добавили до этого:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 69 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 69](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-69.png)
Выбираем процессорное ядро и нажимаем Next:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 70 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 70](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-70.png)
В следующем меню нажимаем Finish:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 71 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 71](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-71.png)
В структуре созданного проекта открываем файл helloworld.c:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 72 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 72](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-72.png)
Вставляем в него следующее содержимое:
#include "stdint.h"
#include "stdbool.h"
#include "xv_tpg.h"
#include "sleep.h"
#include "xparameters.h"
XV_tpg tpg;
int main()
{
XV_tpg_Initialize(&tpg, 0);
XV_tpg_Set_width(&tpg, 1920);
XV_tpg_Set_height(&tpg, 1080);
XV_tpg_Set_ZplateHorContDelta(&tpg, 2);
XV_tpg_Set_ZplateHorContStart(&tpg, 2);
XV_tpg_Set_ZplateVerContDelta(&tpg, 2);
XV_tpg_Set_ZplateVerContStart(&tpg, 2);
XV_tpg_Set_motionSpeed(&tpg, 2);
XV_tpg_Set_motionEn(&tpg, 1);
XV_tpg_EnableAutoRestart(&tpg);
XV_tpg_Start(&tpg);
int pattern = 1;
print("Successfully ran TPG application");
while(true)
{
XV_tpg_Set_bckgndId(&tpg, pattern);
if(++pattern > 19)
{
pattern = 1;
}
usleep(5000000);
print("Change pattern");
}
return 0;
}
И запускаем компиляцию через кнопку Build:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 73 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 73](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-73.png)
После этого, если плата подключена к ПК, можно запустить проект через кнопку Run. Подключаем HDMI монитор, и видим как меняются тестовые паттерны. Первая часть задачи выполнена.
❯ HDMI и Video DMA
Следующим этапом попробуем вывести изображение через Video DMA с использованием baremetal-приложения. Общий принцип вывода HDMI-картинки c использованием VDMA я изобразил следующим образом:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 74 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 74](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-74.png)
Для реализации этой задумки создадим новый проект, так же как делали в первом проекте. Этот этап я описывать не буду. Сделайте до этапа создания Block Design.
Теперь добавляем на дизайн Zynq Processing System и делаем предложенную автоматизацию, чтобы получить следующую картину:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 75 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 75](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-75.png)
Открываем его настройки. В первую очередь настроим DDR память так же как мы делали это в прошлом проекте:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 76 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 76](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-76.png)
Для отладочного вывода сконфигурируем UART. Выбираем UART1 с пинами MIO 48 .. 49:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 77 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 77](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-77.png)
Далее необходимо добавить несколько AXI-интерфейсов в дизайн. В настройках PS-PL Configuration включаем Master AXI GP0 interface и Slave AXI HP0 interface:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 78 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 78](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-78.png)
Первый будет использован для подключения AXI Interconnect, через который будет идти управление Timing контроллером и Dynamic Clock Generator, а второй для подключения AXI SmartConnect и AXI Video Direct Memory Access, чтобы отправлять данные из видеобуфера:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 79 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 79](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-79.png)
Далее необходимо включить сигналы прерывания в PS часть, которые будут генерироваться от тайминг контроллера и AXI VDMA:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 80 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 80](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-80.png)
Теперь выведем тактовые сигналы с PS части:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 81 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 81](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-81.png)
На этом нажимаем Ок и получаем следующую картину:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 82 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 82](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-82.png)
Следующим шагом добавим два блока сброса и сразу их переименуем. Первый будет использоваться для сброса периферии которая работает на частоте 148.5 МГц, а второй для всего остального:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 83 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 83](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-83.png)
Подключаем сигнал сброса к каждому из них от FCLK_RESET0_N к ext_reset_n каждого из этих блоков:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 84 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 84](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-84.png)
Подключаем тактирование соответственно 100МГц и 148МГц к сигналу slowest_sync_clk:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 85 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 85](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-85.png)
После накидаем все необходимое для работы AXI Video DMA. Добавим блок AXI SmartConnect, подключаем все необходимые сигналы и включаем один Slave-интерфейс в настройках:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 86 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 86](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-86.png)
Добавим в дизайн AXI Video Direct Memory Access и сразу настроим его:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 87 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 87](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-87.png)
И на следующей вкладке:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 88 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 88](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-88.png)
Теперь соединяем сигналы данных, тактирования и сброса:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 89 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 89](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-89.png)
Затем добавляем в дизайн AXI Interconnect c 3-мя Master интерфейсами и соединяем сигналы данных, тактирования и сброса:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 90 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 90](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-90.png)
Выполним предложенную автоматизацию:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 91 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 91](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-91.png)
Теперь необходимо добавить блоки, которые управляют таймингами и динамический генератор тактового сигнала. Добавляем Video Timing Controller и Dynamic Clock Generator.
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 92 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 92](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-92.png)
Для начала сконфигурируем Video Timing Controller:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 93 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 93](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-93.png)
Выставляем режим видео в 1080p:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 94 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 94](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-94.png)
Подключаем к нему сигналы данных, сброса и тактирования:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 95 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 95](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-95.png)
После этого можно добавить сигналы прерываний в PS-часть:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 96 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 96](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-96.png)
Подключаем сигналы Dynamic Clock Generator:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 97 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 97](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-97.png)
Теперь необходимо добавить блоки, которые будут отвечать за подготовку и вывод видео данных. Это преобразователь сигналов AXI в Native Video AXI4-Stream to Video Out и энкодер RGB to DVI. Перейдем к настройкам AXI4-Stream to Video Out:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 98 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 98](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-98.png)
Подключаем его сигналы следующим образом:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 99 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 99](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-99.png)
Настроим так же энкодер:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 100 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 100](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-100.png)
Подключим его сигналы тоже:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 101 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 101](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-101.png)
И добавим сигнал HDMI_EN в дизайн:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 102 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 102](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-102.png)
Получится следующая картина:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 103 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 103](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-103.png)
Проверяем, что адреса в памяти назначены:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 104 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 104](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-104.png)
Запускаем дизайн, назначаем пины и генерируем битстрим, выгрузив XSA-архив. На этом подготовка дизайна в Vivado заканчивается и мы переходим к созданию проекта в Vitis.
❯ Создание проекта в Vitis
По примеру из первой части статьи создаем воркспейс, аппаратную платформу и проект Hello World. После этого в проект необходимо добавить несколько важных компонентов. Каждый их них в содержании оснащен избыточным количеством комментариев и в объяснении не нуждается. Не буду приводить здесь длинных листингов программ, а снабжу текст ссылками на мой репозиторий.
Итак. Опишу основные компоненты проекта.
-
Основной текст программы, который нужно вставить в файл helloworld.c;
-
Файл изображения pic_800_600.h, которое будет выведено на экран;
-
Файл объявляющий основные функции dispay_demo.h;
-
Компонент, который производит инициализацию Dynamic Clock Generator: dynclk;
-
Компонент для управления дисплеем: display_ctrl.
Добавьте все эти файлы в структуру проекта:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 105 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 105](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-105.png)
После этого необходимо добавить директории в проект, чтобы при компиляции все файлы были доступны:
![Проверьте настройки запуска и нажмите кнопку Run: Проверьте настройки запуска и нажмите кнопку Run:](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-106.png)
Проверьте настройки запуска и нажмите кнопку Run:
![Zynq 7000. HDMI для платы Zynq Mini для baremetal - 107 Zynq 7000. HDMI для платы Zynq Mini для baremetal - 107](https://www.pvsm.ru/images/2024/10/13/Zynq-7000-HDMI-dlya-platy-Zynq-Mini-dlya-baremetal-107.png)
Подключите плату по HDMI и вы увидите очень интересную картинку. А какую — узнаете когда соберете проект =)
❯ Заключение
Вот таким нехитрым образом можно вывести изображение в HDMI. Для более подробного объяснения рекомендую обратиться к документации на каждое из IP ядер и собрать всё воедино. Если расписывать весь pipeline формирования изображения, то статья вышла бы длиной раз в 10 больше этой. Поэтому всем интересующимся предлагаю изучить вопрос самостоятельно, я лишь привел пример как быстро реализовать работоспособный проект. А вот в следующей статье я хотел бы раскрыть вопрос более подробно, но уже в разрезе организации вывода фреймбуфера из Linux.
До встречи в следующих статьях =)
Автор: megalloid