микроконтроллеры от ведущих мировых производителей

Сергей Долгушин, dsa@efo.ru

В предыдущей статье «Новые графические контроллеры FTDI/Bridgetek BT81x. Работа с изображениями, что нового?» (http://mymcu.ru/articles/novie-graficheskie-kontrolleri-ftdi-bridgetek-bt81x-rabota-s-izobrazheniyami-chto-novogo.html) мы рассказали о новых функциях графических контроллеров BT81x и показали пример работы с растровыми изображениями. В настоящей статье расскажем о новых функциях для работы с анимацией и видео. В качестве рабочей платформы для демонстрации работы этих функций будем использовать дисплеи нового семейства EVE 3 и отладочные средства компании Riverdi.

Анимация изображений и проигрывание видеороликов на экране дисплея являются востребованными задачами в современных встраиваемых приложениях. Цветные дисплеи с сенсорными панелями начинают широко использоваться в качестве панелей управления в различных приложениях, например, вендинговых автоматах или лифтах. Приложения такого рода предназначены для использования широким кругом людей. Возможность работы с анимацией и работа с видео дает удобный инструмент для обеспечения удобной и эффективной работы с различными группами пользователей. Анимацию и видео можно использовать для создания наглядной инструкции по пользованию устройством, для создания более наглядной обратной связи при работе с элементами управления, а также для рекламы. Далее рассмотрим, какие инструменты предлагаются компанией FTDI/Bridgetek для решения данных задач.

В принципе, графические контроллеры FT80x и FT81x могли воспроизводить анимацию и видео (только FT81x), но на управляющий микроконтроллер ложилась задача пересылки большого объема данных. Функция прямого доступа к внешней флэш-памяти у новых контроллеров BT81x исключила эту необходимость. Теперь управляющему микроконтроллеру достаточно передать команду на отображение информации, чтобы графический контроллер начал проигрывание анимации или видео.

Как на практике реализована работа с анимацией и видео в графических контроллерах BT81x рассмотрим далее. В качестве тестовой платформы будем использовать графический модуль Riverdi RVT50AQBFWC00 нового семейства EVE 3 (рис. 1) и переходную плату Hermes Board (рис. 2).

Рисунок 1.

Дисплей Riverdi RVT50AQBFWC00

Рисунок 2.

Переходная плата Hermes Board

Модуль RVT50AQBFWC00 представляет собой 5” дисплей с разрешением 800 х 480 точек с управляющей платой, основными элементами которой являются микросхемы графического контроллера BT815 и NOR флэш-памяти объемом 64 Мбита. Для подключения дисплея используется 20-контактный FFC-разъем, на контакты которого выведены линии питания контроллера (типовое значение 3.3 В), питание подсветки дисплея (может быть в диапазоне от 2.8 В до 5.5 В, подается на повышающий инвертор на плате контроллера), сигналы интерфейса SPI/Quad SPI, аудиовыход, управляющие сигналы контроллера BT815 и его входы/выходы общего назначения GPIO. Физический интерфейс - стандартный для всех поколений дисплеев Riverdi EVE 1 (FT80x), EVE 2 (FT81x) и EVE 3 (BT81x). Весь перечень доступных моделей дисплеев семейства EVE 3 и документацию на них можно найти на сайте производителя по следующей ссылке:  https://riverdi.com/product-category/eve/?filter_graphics-controller=bt81x-eve-3 .  Использование связки графического контроллера и флэш-памяти в модулях дисплеев Riverdi фомирует полностью готовую графическую систему. В этой системе присутствует все необходимое для создания графического пользовательского интерфейса по цене, сопоставимой с дисплеями на базе контроллеров типа SSD1963. А последние требуют гораздо больших усилий при разработке аппаратной и программной частей, а также больших ресурсов управляющего микроконтроллера.

Из отладочных средств для работы будет необходима только плата Hermes Board. Она служит для подключения дисплея к ПК. Эта плата является аналогом кабеля USB-MPSSE C232HM-EDHSL-0, который мы использовали в примере, описанном в предыдущей статье. С точки зрения работы она не имеет отличий от MPSSE-кабеля, но специально разработана для работы с дисплеями серии EVE. При работе с дисплеями серии EVE 3 Hermes Board позволяет осуществлять программирование NOR флэш-памяти с помощью утилиты EVE Asset Builder, а также отлаживать графическую часть ПО с помощью Visual Studio на ПК.

Для демонстрации работы подготовим анимированные изображения и видео. В качестве изображений были взяты из сети три анимированных иконки в формате GIF. В качестве видео - один файл, идущий в примерах в составе EVE Screen Editor и один файл, снятый самостоятельно на фотоаппарат Canon S120. Эти исходные файлы необходимо сконвертировать, собрать в один файл и загрузить во флэш-память графического модуля Riverdi.

Процесс конвертации анимированных изображения практически ничем не отличается от описанного в предыдущей статье «Новые графические контроллеры FTDI/Bridgetek BT81x. Работа с изображениями, что нового?». В качестве исходного контента могут выступать анимированные GIF-изображения или набор PNG-файлов. В последнем случае файлы должны иметь имена, содержащие порядковый номер, например, «001.png», «002.png» и т.д. Окно утилиты EVE Asset Builder с выбранным для конвертирования файлом приведено на рисунке 3.

Окно утилиты EVE Asset Builder с выбранным для конвертирования файлом приведено на рисунке 3.

Рисунок 3.

Вкладка конвертирования анимации утилиты EVE Asset Builder

 

Процесс конвертации видеофайла (рис.4) еще проще. Доступных пользователю настроек три: выбор папки, куда будет помещен подготовленный материал; установки размера изображения и качества аудио, если последнее используется.

Процесс конвертации видеофайла

Рисунок 4.

Вкладка конвертирования видео утилиты EVE Asset Builder

 

Собираем все подготовленные файлы в один во вкладке Generate Flash (ри.5). Обратите внимание, что анимированные изображения в итоговой сборке (см. информационное окно Flash’s map) включают в себя два элемента: object – содержит служебную информацию и data – сам массив изображений. При вызове анимированного изображения в программе указывается адрес элемента object.

Рисунок 5.

Вкладка для создания единого файла прошивки утилиты EVE Asset Builder

 

Последний этап – загрузка сборки во флэш-память графического модуля RVT50AQBFWC00. Модуль предварительно должен быть подключен через плату Hermes Board к ПК. Загрузку осуществляем во вкладке Program Flash (рис. 6). Выбираем тип загрузочного модуля MPSSE в меню  “Select Programmer Module”, указываем путь к сборке в формате bin. Перед программирование флэш-памяти ее необходимо очистить командой Erase, после чего загружаем наш массив данных командой Write.

Рисунок 6.

Вкладка загрузки прошивки во флэш-память утилиты EVE Asset Builder

 

Теперь наш графический модуль готов к работе и можно перейти к основной цели данной статьи – демонстрации работы с анимацией и видео.

Графические контроллеры BT81x поддерживают потоковый вывод изображений в формате ASTC из внешней флэш-памяти, подключенной по специально предназначенному для этих целей дополнительному интерфейсу Quad SPI в режиме Full Speed. Одновременно контроллер может следить за состоянием 32 анимированных изображений. Для этих целей предназначены 32 канала (0-31), которые хранят информацию о начальном адресе привязанного к ним объекта и текущем кадре. По своей сути, канал – это регистр, в который перед началом вывода изображения заносится информация об адресе изображения, а затем этот адрес инкрементируется.

В графических контроллерах BT81x предусмотрено пять специализированных команд: CMD_ANIMSTART; CMD_ANIMSTOP; CMD_ANIMXY; CMD_ANIMDRAW и CMD_ANIMFRAME.

С помощью команды CMD_ANIMSTART выделяется канал для выбранного изображения, указывается его адрес во флэш-памяти и порядок воспроизведения. Порядок воспроизведения назначается с помощью флагов: ANIM_ONCE, анимация изображения проигрывается  однократно, после чего изображение не выводится на экран; ANIM_LOOP, анимация воспроизводится непрерывно; ANIM_HOLD, анимация воспроизводится однократно, после чего на экране остается последний кадр.

CMD_ANIMXY задает координаты вывода изображения на экран. Координаты привязаны к центру изображения.

CMD_ANIMDRAW осуществляет проигрывание анимации для указанных каналов или для всех каналов. Команда выполняется в цикле.

CMD_ANIMFRAME выводит заданный кадр анимированного изображения в указанные координаты.

CMD_ANIMSTOP прекращает вывод указанного анимированного изображения (или всех) на экран дисплея.

Ниже приведен пример вывода трех изображений на экран с помощью описанных выше команд:

Функция вывода кадров изображений с помощью команды CMD_ANIMFRAME:

void Static_Picture(Gpu_Hal_Context_t *phost)

{

       Gpu_CoCmd_FlashFast(phost, 0); \\ перевод флэш-памяти в режим full speed

       Gpu_CoCmd_Dlstart(phost);

      

       App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

       Gpu_CoCmd_AnimFrame(phost, 80, 73, 315264, 0); \\ вывод изображения 0 кадра первого изображения. Параметры: координаты x, y; адрес в памяти и номер кадра  

       Gpu_CoCmd_AnimFrame(phost, 245, 200, 560256, 2); \\ вывод 2 кадра второго изображения

       Gpu_CoCmd_AnimFrame(phost, 403, 77, 663616, 5); \\ вывод 5 кадра третьего изображения

 

}

Вывод анимации на экран дисплея. В функции LoadAnimation_01 задаем каналы для всех анимированных изображения и координаты вывода их на экране.

void LoadAnimation_01(Gpu_Hal_Context_t *phost)

{

 

       Gpu_CoCmd_FlashFast(phost, 0);

       Gpu_CoCmd_Dlstart(phost);

       App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

     

       Gpu_CoCmd_AnimStart(phost, 1, 315264, ANIM_ONCE);

       //Gpu_CoCmd_AnimStop(phost, 1);

       Gpu_CoCmd_AnimXY(phost, 1, DispWidth / 4, DispHeight / 2);

   

       Gpu_CoCmd_AnimStart(phost, 2, 560256, ANIM_LOOP);

       Gpu_CoCmd_AnimXY(phost, 2, DispWidth / 2, DispHeight / 2);

 

       Gpu_CoCmd_AnimStart(phost, 3, 663616, ANIM_HOLD);

       Gpu_CoCmd_AnimXY(phost, 3, DispWidth / 1.33, DispHeight / 2);

 

       App_WrCoCmd_Buffer(phost, DISPLAY());

       Gpu_CoCmd_Swap(phost);

       App_Flush_Co_Buffer(phost);

       Gpu_Hal_WaitCmdfifo_empty(phost);

   }

 

В функции DrawAnimation_01 осуществялется вызов текущих кадров каждого из изображений:

void DrawAnimation_01(Gpu_Hal_Context_t *phost)

{

       Gpu_CoCmd_Dlstart(phost);

       App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

       Gpu_CoCmd_AnimDraw(phost, 1);

       Gpu_CoCmd_AnimDraw(phost, 2);

       Gpu_CoCmd_AnimDraw(phost, 3);

       \\Gpu_CoCmd_AnimDraw(phost, -1); \\ для данного примера такая запись заменяет тройной вызов команды AnimDraw (три строчки кода выше)

       App_WrCoCmd_Buffer(phost, DISPLAY());

       Gpu_CoCmd_Swap(phost);

       App_Flush_Co_Buffer(phost);

       Gpu_Hal_WaitCmdfifo_empty(phost);

}

И основной цикл программы:

App_Common_Init(&host);

       LoadAnimation_01(&host);

       while (1)

       {

             DrawAnimation_01(&host); \\ анимация выводится в цикле

         }

 

Рисунок 7.

Результат вывода иконок на экран дисплея.

С основами работы с анимацией на этом заканчиваем и переходим к выводу на экран видео. Поддержка работы с видеофайлами была введена еще в предыдущем семействе контроллеров FTDI/Bridgetek FT81x. Для вывода видео на экран в этих контроллерах необходимо было выделить область в графической памяти RAM G для организации Media FIFO. В новом семействе EVE 3 видеофайл может выводиться на экран из внешней флэш-памяти. При этом нагрузка на управляющий микроконтроллер полностью отсутствует, графический контроллер самостоятельно осуществляет вывод видео на экран до его окончания. Кстати, в этом заключается отличие работы с видео и анимацией: при работе с последней микроконтроллер должен в цикле отправлять дисплей-лист с командой CMD_ANIMDRAW в графический контроллер, как это было показано выше.

Для автоматического проигрывания видеоизображения нам будут необходимы следующие управляющие регистры и команды: регистр REG_PLAY_CONTROL; команда CMD_PLAYVIDEO и команда CMD_FLASHSOURCE.

Управляющий регистр REG_PLAY_CONTROL определяет текущий статус воспроизведения видеофайла. Доступны три состояния: 1 – задает режим воспроизведения; 0 – режим паузы; -1 – выход из режима воспроизведения.

Команда CMD_FLASHSOURCE указывает графическому контроллеру начальный адрес видеофайла во внешней флэш-памяти.

Команда воспроизведения видео CMD_PLAYVIDEO начинает вывод видео на экран в соответствии с состоянием регистра REG_PLAY_CONTROL. Воспроизведение заканчивается по достижении конца видеофайла. Команда может сопровождаться опциями, например:

OPT_FULLSCREEN – увеличение видеокартинки на весь экран.

OPT_FLASH – указывает команде, что видеофайл находится во внешней флэш-памяти.

OPT_NOTEAR – синхронизация обновления видеокадров с бланкирующими интервалами дисплея для предотвращения тиринг-эффекта (tearing).

OPT_SOUND – разрешение декодирования звука, если присутствует.   

 

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

void PlayVideo_01(Gpu_Hal_Context_t *phost)

{

       Gpu_CoCmd_FlashFast(phost, 0);

       Gpu_Hal_Wr32(&host, REG_PLAY_CONTROL, 1);

       Gpu_CoCmd_Dlstart(phost);

       App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));

 

       Gpu_CoCmd_FlashSource(phost, 2659648);

       App_WrCoCmd_Buffer(phost, CMD_PLAYVIDEO);

       App_WrCoCmd_Buffer(phost, OPT_FULLSCREEN | OPT_FLASH | OPT_SOUND | OPT_NOTEAR);

      

       App_WrCoCmd_Buffer(phost, DISPLAY());

       Gpu_CoCmd_Swap(phost);

       App_Flush_Co_Buffer(phost);

       Gpu_Hal_WaitCmdfifo_empty(phost);

 

}

При вызове данной функции будет начато воспроизведение видеофайла на экране дисплея в полноэкранном размере. Функция завершит работу после окончания проигрывания видео.

Обратите внимание, что при работе с видео в автоматическом режиме (без участия микроконтроллера) в документации производителя в явном виде не указано, как задавать координаты вывода видео на экран. В примере выше левый верхний угол видеoизображения расположен на экране в точке с координатами 0,0. При этом данное ограничение отсутствует для покадрового вывода видео на экран. При выводе изображения по кадрам в данном примере мы не рассматривали данную возможность, координаты вывода можно задать с помощью стандартной команды Vertex.

Еще одним ограничением является относительно большой размер видеофайлов. Например, видеофайл MVI_022.avi с разрешением 580 х 334 точки (см. рис. 5) имеет размер более 5 МБ, при этом его длительность составляет 11 секунд. Кстати, данное разрешение было выбрано именно с целью экономии флэш-памяти. Если в проекте используются готовые модули Riverdi, это составляет более половины всей наличной на модуле флэш-памяти.

На этом подведем итог данной статьи. Работа с анимацией и видео не является нововведением семейства графических контроллеров EVE 3. Анимацию можно было реализовать и на контроллерах предыдущих семейств (см. статьи http://mymcu.ru/articles/graficheskie-kontrolleri-ftdi-ft8hx-animatsiya-izobrazheniy.html и http://mymcu.ru/articles/graficheskie-kontrolleri-ftdi-ft8hx-animatsiya-izobrazheniy-chast-2.html) . Но в новой серии контроллеров упрощен сам процесс работы с анимацией и существенно разгружен управляющий микроконтроллер от рутинных операций по пересылке больших массивов данных. В целом, работа с анимацией выглядит достаточно логично и удобно. При этом функция воспроизведения видео в том виде, как она реализована, не вызывает интереса. Особенно, если речь идет о встраиваемых приложениях с ограниченными ресурсами.

Проект для Visual Studio доступен по этой ссылке, файл с изображениями для прошивки во флэш-память 2.bin находится в корневом каталоге: animation_BT81X_EVE_HAL.rar

 

По техническим вопросам можно обращаться к Долгушину Сергею (dsa@efo.ru)

Напоимнаем также, что новые дисплеи Riverdi с контроллерами BT81x доступны с нашего склада по специальным ценам, информация по перечню моделей и специальные цены на них доступны по данной ссылке