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

В конце 2018 года компания FTDI начала производство нового семейства графических контроллеров BT815/816. Основным отличием микросхем этого семейства от предшественников является дополнительный интерфейс SPI для работы с NOR флэш-памятью и аппаратная поддержка формата сжатия ASTC (Adaptive Scalable Texture Compression).Эти две новых функции снимают ряд ограничений, которые были у предыдущих семейств графических контроллеров FT8xx. В данной статье расскажем о том, как эти изменения повлияли на работу с изображениями.

Прежде, чем познакомим с новым функционалом семейства BT81x напомним, что собой представляют графические контроллеры FTDI/Bridgetek. В основе этих микросхем лежит графический процессор, который самостоятельно формирует изображение для вывода на экран цветного TFT-дисплея с разрешением до 800 x 600 точек. Основной задачей управляющего микроконтроллера (МК) является формирование набора команд, т.н. дисплей-листа (ДЛ) и отправка его в графический контроллер. Последний, на основании принятого ДЛ, рассчитывает изображение и выводит его на экран. Графический контроллер поддерживает вывод текущего изображения на экран до прихода нового ДЛ. Такой подход дает ряд преимуществ перед часто используемой аппаратно-программной реализацией (например, SSD1963 + графическая библиотека или STM32 со встроенным контроллером TFT + графическая библиотека). Самое главное то, что для управления графическими контроллерами FTDI не требуются мощные МК, вполне достаточно будет и 8-разрядного МК с интерфейсом SPI. Особых требований по скорости обмена по SPI также нет, в данном случае все зависит от сложности графического приложения. Не требуется организации видеобуфера и области памяти в ОЗУ МК для расчета изображения. Например, при выборе дисплея с разрешением 800 х 480 точек и глубиной цвета 16 бит потребуется выделить под видеобуфер 768000 байт. Кроме этой памяти желательно выделять аналогичную область в ОЗУ, которая будет использоваться для расчета и подготовки изображения. Для работы с графическими контроллерами FTDI этого не требуется. Тем, кто еще не знаком с микросхемами FT8xx/BT81x рекомендуем обратиться к подборке наших статей, в которых на примерах рассмотрены принципы работы этих контроллеров (http://mymcu.ru/articles.html?prod=ftdi).

 Вернемся к предмету текущей статьи – новым микросхемам BT81x, краткий обзор которых, ссылки на техническую документацию и варианты отладочных средств приведены на данной странице (http://mymcu.ru/support/novaya-seriya-graficheskih-kontrollerov-ftdi-bridgetek-bt81x.html). Итак, одним из главных нововведений в новых микросхемах стал дополнительный интерфейс Quad SPI с максимальной тактовой частотой 72 МГц для прямого подключения флэш-памяти (под флэш-памятью далее по тексту будем понимать только память, подключенную к BT81x по интерфейсу SPI). Внешнее ПЗУ является необходимостью практически для любых графических приложений, где будут использоваться пользовательские графические элементы (например, изображения и шрифты). Прямое подключение памяти к графическому контроллеру снимает с МК задачи хранения и передачи больших массивов информации в процессе работы, а также существенно ускоряет процесс работы с графическими элементами. И благодаря этому,  в новом семействе BT81x доступна функция воспроизведения GIF-анимации и видео-файлов, о чем подробнее расскажем в следующей статье.  

     Другим нововведением стала поддержка алгоритма ASTC для сжатия растровых изображений, включая шрифты. В предыдущих семействах использовался алгоритм deflate (BT81x его также поддерживают), по сравнению с которым использование ASTC может сэкономить до 30% от объема ПЗУ при несущественном ухудшении качества изображения.

Эти две новые функции - работа с флэш-памятью и поддержка ASTC - дают новым графическим контроллерам существенное преимущество по сравнению с предыдущими семействами FT80x и FT81x. Графические элементы, сжатые в формате ASTC и размещенные во внешней флэш-памяти, обрабатываются графическим контроллером «на лету», т.е. их не надо предварительно загружать в область памяти RAM G, как в случае использования алгоритма deflate или изображений в формате JPEG/PNG. Напомним, что RAM G представляет собой область оперативной памяти графических контроллеров (256 кбайт у FT80x и 1 Мбайт у FT81x и BT81x) для хранения растровых изображений (включая пользовательские шрифты) и участков кода ДЛ (из характерных примеров – рисование шкалы индикатора на основе графических примитивов (http://mymcu.ru/content/articles/FTDI/APP_EFO_FT800_Indikator.pdf)).

На примере изображения (рис.1) покажем некоторые отличия в работе новых контроллеров BT81x с изображениями в формате deflate и Jpeg, если они находятся во внешней флэш-памяти, а также работу с изображением в формате ASTC.

Рисунок 1. Исходное тестовое изображение в формате JPEG

На рис.2 изображен скриншот утилиты Screen Editor. Данная утилита удобна для первого знакомства с контроллерами FTDI, их набором команд и принципами работы. Вместе с утилитой даются готовые примеры по использованию некоторых функций. Мы же воспользуемся ее функцией экспорта, чтобы создать шаблон приложения Visual Studio для нового контроллера BT816. Шаблон проекта создается через меню Export->EVE HAL 2.0 Projects -> VM816C50A_MPSSE, т.к. в описываемом примере мы используем следующий комплект: модуль FTDI  VM816C50A-N + переходной кабель FTDI USB-MPSSE C232HM-EDHSL-0 + дисплей Riverdi RVT50AQTFWR00.

Рисунок 2. Скриншот утилиты Screen Editor с загруженным тестовым изображением

Для работы с семейством BT81x нужна последняя версия данной утилиты, которую можно скачать с официального сайта (сейчас доступна версия 3.1.2). Новая версия SE устанавливается отдельно, а не заменяет собой предыдущую. Если планируется продолжение работы со старыми семействами FT80x и FT81x, рекомендуем пока не удалять старую версию SE.

Кроме создания шаблона приложения, с помощью Screen Editor можно увидеть все необходимые параметры нашего изображения. В поле Information приведены размеры преобразованного растрового изображения в формате ARGB1555 (форматы представления ARGB1555 и RGB565 дают максимальное качество итогового изображения) в сжатом и распакованном видах. Соответственно, для работы с данным изображением потребуется выделить место в памяти RAM G графического контроллера, равное размеру растрового изображения в распакованном виде. Размер в сжатом виде показывает, сколько памяти требуется для хранения этого изображения в ПЗУ МК и внешней флэш-памяти. Стандартный порядок работы с изображением (JPEG, PNG, сжатым по алгоритму deflate или несжатым) заключается в том, что изображение должно быть предварительно загружено в RAM G перед его вызовом в ДЛ. Сжатые изображения (JPEG, PNG, deflate) в процессе загрузки их в RAM G распаковываются, и в памяти RAM G они размещаются в несжатом виде. Т.е. использование сжатых изображений в контроллерах FT80x и FT81x экономит объем ПЗУ и сокращает время загрузки их в RAM G.

В новых контроллерах BT81x полностью сохранен данный алгоритм работы с изображениями JPEG, PNG и с растровыми изображениями в несжатом и сжатом видах. Но при этом слегка упрощен процесс их загрузки, если они будут храниться во флэш-памяти. И, как говорилось выше, введен новый формат хранения растровых изображений ASTC. Главным плюсом этого формата является возможность прямого доступа к изображению во флэш-памяти. Изображение в формате ASTC не требуется предварительно распаковывать в память RAM G, что снимает ограничение по количеству и размеру пользовательских графических элементов, которые можно использовать в одном ДЛ.

Переходим к принципам работы новых контроллеров с изображениями в форматах JPEG, сжатом deflate и новом ASTC. Для этого подготовим три представления одного изображения:(рис.1) в исходном виде в формате JPEG, в сжатом виде в формате ARGB1555 и в формате ASTC. Конвертацию исходного изображения можно сделать в SE через выпадающий список Format в поле Image Settings (рис.2). Файлы преобразованного изображения будут доступны в папке Images при экспорте проекта.

Преобразование изображения можно также делать в новой утилите EVE Asset Builder (AB) (рис.3). Данная утилита предназначена для преобразования изображений, шрифтов, анимации, видео и аудио-файлов в требуемые для работы с графическими контроллерами форматы. Также, с помощью этой утилиты все подготовленные ресурсы упаковываются в один файл, который и загружается во флэш-память.

Рисунок 3. Вкладка Image converter утилиты Asset Builder 

На базе исходного изображения в формате JPEG подготовим с помощью AB два варианта: файл в формате ASTC 12 х 12 (12 х 12 - максимальное сжатие, 4 х 4 - минимальное) и файл ARGB1555. Преобразование делается во вкладке Image Converter, назначение полей и кнопок в ней достаточно очевидно, чтобы не останавливаться на их описании. На следующем шаге создаем файл для загрузки во флэш-память, это делается во вкладке Generate Flash (рис. 4).

Рисунок 4. Вкладка Generate Flash утилиты Asset Builder

Добавление элементов в общий файл осуществляется нажатием кнопки под номером 1 (см. рис.4). В нашем примере во флэш-память будут записаны три варианта одного изображения, исходное JPEG, ASTC 12x12 (raw) и сжатое ARGB1555 (bin). Добавив все элементы, нажимаем кнопку Generate и получаем один общий файл output.bin, в который входят четыре файла, перечисленные в поле Flash’s map утилиты. В этом поле указаны начальные адреса каждого отдельного элемента и их размеры (Размеры на рис. 4 выделены рамкой под номером 2. Если сравнить размеры всех вариантов изображения , то разница показательна. Размер изображения в формате ASTC в 10 раз меньше исходного варианта в JPEG.). Кроме наших изображений в файл output.bin автоматически был добавлен служебный файл с расширением blob, который всегда размещается по нулевому адресу и имеет размер 4096 байт. Данный файл нужен для корректной работы контроллера с флэш-памятью. Запись во флэш-память осуществляется в этой же вкладке утилиты AB. Для работы выбираем режим MPSSE, т.к. мы используем кабель USB-MPSSE C232HM-EDHSL-0 для управления платой контроллера VM816, указываем путь к файлу output.bin, предварительно очищаем флэш-память нажатием кнопки Erase и, наконец, записываем output.bin нажатием кнопки Write. 

Переходим к проекту в Visual studio, ниже представлены функции вывода на экран всех трех вариантов изображения. Как данный процесс был реализован в контроллерах FT80x и FT81x, рассказывается в статье “Графические контроллеры FT8xx. Работа с пользовательскими шрифтами и растровыми изображениями” (http://mymcu.ru/storage/content/devtools/FTDI/09_1792.pdf), поэтому ниже рассмотрим только новые функции семейства BT81x.

 

Листинг 1: 

void Skeleton_02(Gpu_Hal_Context_t *phost)

{

       //перевод флэш-памяти в режим максимальной скорости, обязательное условие 

       Gpu_CoCmd_FlashFast(phost, 0);

       Gpu_CoCmd_Dlstart(phost);

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

       //указание адреса сжатого ARGB1555 изображения

       Gpu_CoCmd_FlashSource(phost, 4096);

       //вызов команды для распаковки изображения в RAM G

       Gpu_CoCmd_Inflate2(phost, 0, OPT_FLASH);

       //передача графическому контроллеру параметров изображения

       Gpu_CoCmd_SetBitmap(phost, 0, ARGB1555, 799, 480);

       //вывод изображения

       App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));

       App_WrCoCmd_Buffer(phost, VERTEX2II(0, 0, 0, 0));

       App_WrCoCmd_Buffer(phost, END());

       Gpu_CoCmd_Text(phost, 0, 30, 28, 0, "Picture 3, deflate");

}

void Skeleton_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_FlashSource(phost, 1092736);

       //вызов команды для распаковки JPEG изображения в память RAM G (итоговый формат RGB565)

       Gpu_CoCmd_LoadImage(phost, 0, OPT_FLASH);

       App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));

       App_WrCoCmd_Buffer(phost, VERTEX2II(0, 0, 0, 0));

       App_WrCoCmd_Buffer(phost, END());

       Gpu_CoCmd_Text(phost, 0, 30, 28, 0, "Picture 2, jpeg");

}

void Skeleton(Gpu_Hal_Context_t *phost)

{

      Gpu_CoCmd_FlashFast(phost, 0);

       Gpu_CoCmd_Dlstart(phost);

       //указание графическому контроллеру адреса изображения ASTC в флэш-памяти (в данном случае адрес указывается в едином адресном пространстве графического контроллера), и передача параметров изображения

       Gpu_CoCmd_SetBitmap(phost, (0x800000 | 1217088 / 32), COMPRESSED_RGBA_ASTC_12x12_KHR, 804, 480);

      

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

       App_WrCoCmd_Buffer(phost, BEGIN(BITMAPS));

       App_WrCoCmd_Buffer(phost, VERTEX2II(0, 0, 0, 0));

       App_WrCoCmd_Buffer(phost, END());

       Gpu_CoCmd_Text(phost, 0, 30, 28, 0, "Picture 1, format ASTC");

       }

 

Для работы со сжатыми изображениями в BT81x введена новая команда Inflate2. Ее отличием от общей для всех контроллеров команды Inflate является дополнительный параметр. Если указан параметр OPT_FLASH (см. функцию Sceleton_02 в листинге), то изображение автоматически загружается из флэш-памяти в RAM G. МК в этом процессе не участвует. Для тех, кто работал только с первым семейство графических контроллеров будет в новинку и команда SetBitmap, которая была введена во втором семействе. SetBitmap является упрощенным способом передачи информации графическому контроллеру о параметрах изображения и заменяет собой набор команд Bitmap Source, Bitmap Layout и Bitmap Size (см. статью выше). Контроллеры FT81x и BT81x поддерживают оба варианта. Поддержка параметра OPT_FLASH введена и в команду LoadImage для работы с изображениями JPEG и PNG. При указании данного параметра команда берет изображение из флэш-памяти, распаковывает и размещает в RAM G. При этом для JPEG и PNG не требуется использовать команду SetBitmap, т.к. по умолчанию изображение преобразуется в RGB565, а размеры присутствуют в самом файле изображения и контроллер берет их из него. Начальный адрес изображения во флэш-памяти для обеих команд Inflate2 и LoadImage указывается командой FlashSource перед их вызовом.

Вызов изображения в формате ASTC отличается тем, что нам не требуется загружать его в RAM G. В итоге, при передаче параметров изображения контроллеру командой SetBitmap в этой команде мы указываем адрес изображения во флэш-памяти (в формате единого адресного пространства), а не адрес в RAM G, как в предыдущих вариантах. Остальные параметры команды аналогичны, это формат хранения и размеры.

Результат работы данного примера приведен на рисунках 5-7. На глаз сложно различить разницу в них. При этом было использовано максимальное сжатие для варианта в формате ASCT. Таким образом, новые контроллеры в связке с флэш-памятью действительно дают дополнительные возможности для создания более сложных графических интерфейсов с большим количеством пользовательских элементов, по сравнению с предыдущими семействами. Немаловажным является и то, что эти возможности не повышают требований к управляющему МК, в некоторых случаях даже снижают их. Это касается встроенной ПЗУ МК, объем которой уже не важен. В первую очередь это относится к тем проектам, где планируется использование новых дисплеев Riverdi на базе BT81x, на которых флэш-память будет уже установлена. А также, существенного влияния не окажет на производительность графической части проекта и скорость обмена по SPI между МК и графическим контроллером.   

Рисунок 5. Изображение в формате ASTC

Рисунок 6. Изображение в формате JPEG

Рисунок 6. Изображение в формате ARGB1555

В следующей статье мы планируем рассказать о работе с GIF-анимацией и проигрыванием видео. Архив с описанным проектом можно скачать по данной ссылке.    

Все компоненты - модуль FTDI  VM816C50A-N, переходной кабель FTDI USB-MPSSE C232HM-EDHSL-0 и дисплей Riverdi RVT50AQTFWR00 (под разъем на плате VM816 также подойдут дисплеи Riverdi 4,3”), которые используются в данном примере, имеются в наличии на нашем складе.  Просим учитывать, что с середины 2018 мы не имеем возможности работать с частными лицами, заказы принимаются только от организаций. 

Рисунок 8. Плата контроллера VM816C50A-N,переходной кабель FTDI USB-MPSSE C232HM-EDHSL-0 и дисплей Riverdi RVT50AQTFWR00