Zynq 7000. HDMI для платы Zynq Mini для baremetal

в 8:05, , рубрики: axi video dma, Baremetal, DMA, hdmi, test pattern generator, timeweb_статьи, tmds, tutorial, zynq, zynq-7000

Я давно носил идею проверки HDMI на платах Zynq, и вот наконец-то дошли руки до этого интересного топика. В этой статье я покажу, что вывод изображения через HDMI достаточно прост, но ограничусь только рассмотрением вывода изображения из baremetal-приложений, а вопросы про Linux оставлю для следующей статьи. В первую очередь изучим возможность простого вывода изображения в HDMI из генератора тестовых изображений с использованием Test Pattern Generator в PL-логике, а затем коснёмся применения AXI Video DMA.

Всем интересующимся добро пожаловать под кат!

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 1

Важно! Перед началом повествования, хотелось бы заранее оговориться, что основная цель, которую я преследую при написании этой статьи — рассказать о своем опыте, с чего можно начать при изучении отладочных плат на базе Zynq. Я не являюсь профессиональным разработчиком под ПЛИС и SoC Zynq, не являюсь системным программистом под Linux и могу допускать какие-либо ошибки в использовании терминологии, использовать не самые оптимальные пути решения задач, etc. Но отмечу, что любая конструктивная и аргументированная критика только приветствуется. Что ж, поехали…

❯ Концепция проекта и постановка задачи

Основная задача, которая стоит перед нами — запустить вывод HDMI-изображения на отладочной плате Zynq Mini.

Если разделить задачу на подпункты, то нам необходимо:

  1. Подготовить проект в Xilinx Vivado и проверить работоспособность HDMI c Test Pattern Generator;

  2. Создать baremetal-проект для запуска Test Pattern Generator в Vitis;

  3. Создать проект для вывода изображения с использованием AXI Video DMA в Vivado;

  4. Создать 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

Для вывода видеоданных из ПЛИС мы будем использовать 8 пинов, которые сконфигурируем как 4 дифференциальных TDMS выхода. Но об этом позже. 

Общий принцип передачи данных может быть изображён так:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 3

Протокол TMDS кодирует 8 битные каналы в 10 бит. Подробнее рассказано в этом видео. После формирования исходные данные проходят сериализацию и отправляются получателю, который выполняет обратное преобразование для декодирования данных. 

Общая схема подключения разъёма HDMI на плате ZynqMini выглядит так:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 4

Со стороны Zynq-7000 распиновка следующая:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 5

Таким образом получаем следующую схему подключения сигналов 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

Чтобы подготовить и отправить данные в HDMI разъём, мы будем использовать IP-ядро, которое любезно предоставляет компания Digilent RGB2DVI. Общая блок-схема данного IP-ядра выглядит следующим образом:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 7

Данный блок принимает на вход сигнал тактирования, 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

Называем наш проект 1.HDMI_TPG и указываем директорию, в которой сохраним проект:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 9

Выбираем пункт RTL Project и ставим галочку Do not specify sources at this time:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 10

В следующем меню выбираем xc7z020clg400-2. Да, на плате Zynq Mini c 7020 используется чип 2 speed grade:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 11

Идём дальше и нажимаем Finish:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 12

Итак, исходный проект создан.

❯ Кастомные 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 - 14

❯ Hardware PL Design

Теперь создадим наш проект с Test Pattern Generator. Добавим новый Block Design в проект:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 15

Назовём его top_design:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 16

Теперь добавим в Block Design модуль процессорной системы:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 17

В списке находим ZYNQ7 Processing System и добавляем его:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 18

На Block Design будет добавлен модуль, через который можно сконфигурировать PS-систему. После будет предложено запустить автоматизацию:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 19

Запускаем мастер и нажимаем Ok, оставив значения по умолчанию:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 20

Далее необходимо настроить модуль PS-системы. Делаем двойной клик по нему — откроется меню конфигурации:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 21

Переходим в меню MIO Configuration. Выбираем для Bank 1 I/O Voltage в значение LVCMOS 1.8V:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 22

Мотаем ещё ниже и выбираем UART1 с пинами MIO 48 .. 49:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 23

Далее переходим в меню Clock Configuration и выставляем так как это указано на скриншоте, изменив частоты тактирования FCLK_CLK0:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 24

Переходим в меню DDR Configuration. Выбираем чип MT41J256M16 RE-125 и 16-битный режим:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 25

Остальные блоки с настройками оставляем как есть и нажимаем Ok. Получится следующее:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 26

Следующий элемент, который необходимо добавить в дизайн — Test Pattern Generator:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 27

Далее нам предлагают автоматизацию, давайте сделаем её сразу и оставим выбранные опции по умолчанию:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 28

Получится следующая схема:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 29

Далее, необходимо преобразовать сигнал AXI Stream в Native Video. Для этого добавим IP-блок AXI Stream to Video Out:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 30

К нему в пару необходим Video Timing Controller, который определяет формат выводимого изображения:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 31

Предлагаемую автоматизацию не выполняем. Вместо этого откроем настройки и отключим интерфейс AXI. Детектирование таймингов также отключаем, нам их нужно только сгенерировать:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 32

Далее, переходим на вкладку Default/Constant и выставляем режим вывода изображения в 1080p:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 33

После, начинаем соединять сигналы. Подключаем vtiming_out к vtiming_in:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 34

Сигнал vtg_ce соединяем с gen_clken:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 35

Подключаем тактовые сигналы clk, aclk к основному тактовому сигналу M_AXI_GP0_ACLK:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 36

И сигналы сброса к resetn, aresetn к peripheral_aresetn:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 37

Далее сигнал с генератора тестовых паттернов m_axis_video подключаем к video_in:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 38

Параллельный видеосигнал и набор синхросигналов передаём на преобразователь интерфейса. Для этого необходимо добавить в дизайн RGB to DVI Video Encoder:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 39

Заходим в настройки данного блока и снимаем галочку Reset active high потому что везде используется Reset Active Low, все остальное не трогаем:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 40

После соединяем сигналы RGB и vid_io_out:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 41

Подключаем сигнал сброса aRst_n к общему сигналу сброса:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 42

И подключаем сигнал тактирования PixelClk к общему сигналу тактирования:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 43

Выходной интерфейс необходимо вытащить наружу через клик правой кнопкой Make External:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 44

Добавляем Constant-блок для формирования сигнала HDMI_EN:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 45

Нажимаем F6 для проверки полученного дизайна и получаем сообщение, что всё получилось:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 46

Получаем вот такой дизайн:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 47

Следующим шагом создаем HDL Wrapper с управлением Vivado. Для этого перейдём в меню навигатора Sources и по top_design кликаем правой кнопкой. Затем выбираем пункт Create HDL Wrapper:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 48

Нажимаем Ok выбрав пункт Let Vivado manage wrapper and auto-update:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 49

После этого запускаем синтез и дожидаемся его окончания. После этого выбираем в меню  Open Synthesized Design:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 50

Чтобы ускорить процесс синтеза, устанавливайте Number of jobs в максимальное значение:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 51

Будет запущен процесс синтеза. Дожидаемся успешного его окончания и выбираем Open Synthesized Design:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 52

Жмем в главном меню Window - I/O Ports. Откроется меню в котором нужно назначить пины в соответствии со схематиком:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 53

Остальные сигналы дифференциальных пар будут назначены автоматически. Сохраняем проект, именуем файл constraints и перезапускаем синтез.

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 54

После этого необходимо перезапустить синтез и запустить генерацию битстрима через Generate Bitstream и дождаться окончания:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 55

Экспортируем BSP-сырцы для работы с ними в Vivado и не забываем включить bitstream-файл. Переходим в меню File - Export - Export Hardware, нажимаем Next. Выбираем Include bitstream

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 56

Оставляем по умолчанию меню Files:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 57

Нажимаем Finish

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 58

Всё. На этом подготовка проекта в Vivado закончена.

❯ Сборка baremetal-приложения для запуска Test Pattern Generator

Теперь можем переходить в Vitis для создания baremetal-приложения, которое запустит генератор тестовых паттернов. Нажимаем Tools - Launch Vitis IDE — запустится Vitis.

Первым шагом в директории проекта создадим каталог для Workspace:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 59

Создаём каталог и нажимаем Ok:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 60

После необходимо создать проект платформы:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 61

Назовем платформу zynqmini_tpg:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 62

Указываем путь к xsa-архиву в корне проекта:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 63

Оставляем опции по умолчанию:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 64

И нажимаем Finish:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 65

После будет создан проект с boot-артефактами. Запускам его сборку через кнопку Build и дожидаемся окончания компиляции:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 66

Далее из примеров создадим проект Hello World:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 67

Назовем проект tpg и нажимаем Next:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 68

Выбираем аппаратную платформу, которую добавили до этого: 

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 69

Выбираем процессорное ядро и нажимаем Next:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 70

В следующем меню нажимаем Finish:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 71

В структуре созданного проекта открываем файл helloworld.c:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 72

Вставляем в него следующее содержимое:

#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

После этого, если плата подключена к ПК, можно запустить проект через кнопку Run. Подключаем HDMI монитор, и видим как меняются тестовые паттерны. Первая часть задачи выполнена.

❯ HDMI и Video DMA

Следующим этапом попробуем вывести изображение через Video DMA с использованием baremetal-приложения. Общий принцип вывода HDMI-картинки c использованием VDMA я изобразил следующим образом:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 74

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

Теперь добавляем на дизайн Zynq Processing System и делаем предложенную автоматизацию, чтобы получить следующую картину:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 75

Открываем его настройки. В первую очередь настроим DDR память так же как мы делали это в прошлом проекте:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 76

Для отладочного вывода сконфигурируем UART. Выбираем UART1 с пинами MIO 48 .. 49:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 77

Далее необходимо добавить несколько AXI-интерфейсов в дизайн. В настройках PS-PL Configuration включаем Master AXI GP0 interface и Slave AXI HP0 interface:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 78

Первый будет использован для подключения AXI Interconnect, через который будет идти управление Timing контроллером и Dynamic Clock Generator, а второй для подключения AXI SmartConnect и AXI Video Direct Memory Access, чтобы отправлять данные из видеобуфера:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 79

Далее необходимо включить сигналы прерывания в PS часть, которые будут генерироваться от тайминг контроллера и AXI VDMA:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 80

Теперь выведем тактовые сигналы с PS части:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 81

На этом нажимаем Ок и получаем следующую картину:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 82

Следующим шагом добавим два блока сброса и сразу их переименуем. Первый будет использоваться для сброса периферии которая работает на частоте 148.5 МГц, а второй для всего остального:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 83

Подключаем сигнал сброса к каждому из них от FCLK_RESET0_N к ext_reset_n каждого из этих блоков:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 84

Подключаем тактирование соответственно 100МГц и 148МГц к сигналу slowest_sync_clk:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 85

После накидаем все необходимое для работы AXI Video DMA. Добавим блок AXI SmartConnect, подключаем все необходимые сигналы и включаем один Slave-интерфейс в настройках:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 86

Добавим в дизайн AXI Video Direct Memory Access и сразу настроим его:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 87

И на следующей вкладке:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 88

Теперь соединяем сигналы данных, тактирования и сброса: 

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 89

Затем добавляем в дизайн AXI Interconnect c 3-мя Master интерфейсами и соединяем сигналы данных, тактирования и сброса:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 90

Выполним предложенную автоматизацию:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 91

Теперь необходимо добавить блоки, которые управляют таймингами и динамический генератор тактового сигнала. Добавляем Video Timing Controller и Dynamic Clock Generator.

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 92

Для начала сконфигурируем Video Timing Controller:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 93

Выставляем режим видео в 1080p:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 94

Подключаем к нему сигналы данных, сброса и тактирования:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 95

После этого можно добавить сигналы прерываний в PS-часть:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 96

Подключаем сигналы Dynamic Clock Generator:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 97

Теперь необходимо добавить блоки, которые будут отвечать за подготовку и вывод видео данных. Это преобразователь сигналов 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 - 99

Настроим так же энкодер:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 100

Подключим его сигналы тоже:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 101

И добавим сигнал HDMI_EN в дизайн:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 102

Получится следующая картина:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 103

Проверяем, что адреса в памяти назначены:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 104

Запускаем дизайн, назначаем пины и генерируем битстрим, выгрузив XSA-архив. На этом подготовка дизайна в Vivado заканчивается и мы переходим к созданию проекта в Vitis.

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

По примеру из первой части статьи создаем воркспейс, аппаратную платформу и проект Hello World. После этого в проект необходимо добавить несколько важных компонентов. Каждый их них в содержании оснащен избыточным количеством комментариев и в объяснении не нуждается. Не буду приводить здесь длинных листингов программ, а снабжу текст ссылками на мой репозиторий.

Итак. Опишу основные компоненты проекта.

  1. Основной текст программы, который нужно вставить в файл helloworld.c;

  2. Файл изображения pic_800_600.h, которое будет выведено на экран;

  3. Файл объявляющий основные функции dispay_demo.h;

  4. Компонент, который производит инициализацию Dynamic Clock Generator: dynclk;

  5. Компонент для управления дисплеем: display_ctrl.

 Добавьте все эти файлы в структуру проекта:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 105

После этого необходимо добавить директории в проект, чтобы при компиляции все файлы были доступны:

Проверьте настройки запуска и нажмите кнопку Run:

Проверьте настройки запуска и нажмите кнопку Run:

Проверьте настройки запуска и нажмите кнопку Run:

Zynq 7000. HDMI для платы Zynq Mini для baremetal - 107

Подключите плату по HDMI и вы увидите очень интересную картинку. А какую — узнаете когда соберете проект =)

❯ Заключение

Вот таким нехитрым образом можно вывести изображение в HDMI. Для более подробного объяснения рекомендую обратиться к документации на каждое из IP ядер и собрать всё воедино. Если расписывать весь pipeline формирования изображения, то статья вышла бы длиной раз в 10 больше этой. Поэтому всем интересующимся предлагаю изучить вопрос самостоятельно, я лишь привел пример как быстро реализовать работоспособный проект. А вот в следующей статье я хотел бы раскрыть вопрос более подробно, но уже в разрезе организации вывода фреймбуфера из Linux.

До встречи в следующих статьях =)


Автор: megalloid

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js