ЗАО «ЗЭО»
Техническая поддержка пользователей => ОС Linux, U-Boot => Тема начата: scad от 03 Сентября, 2010, 13:53:39
-
Как уже обсуждалось здесь http://www.zao-zeo.ru/forum/index.php?topic=236.0 (http://www.zao-zeo.ru/forum/index.php?topic=236.0), здесь: http://www.zao-zeo.ru/forum/index.php?topic=123.0 (http://www.zao-zeo.ru/forum/index.php?topic=123.0) и еще много где на этом форуме, несмотря на наличие ускорения 2D графики в EP9315 драйвера для qt4, использующие это ускорение отсутствуют.
Я уже писал о желании написать такой драйвер - теперь выкладываю то, что получилось. Сначала немного слов.
0. Те кто хотят быстрого счастья и супер быстрого работающего драйвера - могут дальше не читать. Те кто хочет помочь, вместе разобраться с рядом трудностей и кому интересно как это все работает - добро пожаловать :)
1. Я использую eabi toolchain от faa: http://www.zao-zeo.ru/forum/index.php?topic=138.0 (http://www.zao-zeo.ru/forum/index.php?topic=138.0) gcc-4.2.4.
2. Ядро Linux 2.6.20.21 собираю отдельно, как написано здесь:http://www.zao-zeo.ru/dokuwiki/doku.php/linux#патчи_ядра (http://www.zao-zeo.ru/dokuwiki/doku.php/linux#патчи_ядра)
3. В архиве лежат файлы ep93xxfb.h и ep93xxfb.c видеодрайвера их нужно скопировать в уже пропатченное linux-2.6.20.21 в каталог drivers/video и собрать его, чтобы видео было вкомпилено в ядро, а не отдельным модулем. Я тестирую все на ТИОН-ПРО с 8'' панелью, но думаю, что и на VGA мониторе с разрешением 800x600 все пойдет.
4. Я использую qt-embedded 4.6.2 (4.5.2 тоже подойдет) собранную указанным выше тулчейном с опцией -plugin-gfx-linuxfb.
5. В архиве лежит проект dbscreen (просто лень было переименовывать, а брал за образец как раз пример dbscreen от Qt) чтобы его собрать нужно в dbscreen.pro указать верный includepath, а именно путь к исходникам Вашей библиотеки Qt.
6. После сборки драйвера - можно приступать к тестированию, не забудьте указать в вашем start скрипте -display dbscreen.
-
Снижение нагрузки на процессор заметно?
-
Заметно, но не для всех операций.
Расскажу подробнее про внутреннее устройство всего что сделано.
1. Для рисования окон используется видеопамять. Для этого используется реализация кэша из драйвера linuxfb. Размер видеопамяти объявлен в ep93xxfb.h и в настоящий момент составляет 3840000 байта. Это позволяет хранить помимо основного экрана 800х600х2 еще 3 таких же для рисования окон (backbuffer). Функция ep93xx_copy выполняет финальное копирование нарисованных окон из бэкбуферов на экран (вызывается в dbscreen::blit()). Для областей располагающихся не в видеопамяти (например картинке курсора) выполняется ep93xx_blit, копирующая изображение из буфера на экран.
2. Создан наследник QRasterPaintEngine - QEP93xxPaintEngine и перегружены некоторые функции (самые простые, типа линий и заливки - этот процесс можно продолжать). Т.к. все окна лежат в буферах видеопамяти при вызове функций QEP93xxPaintEngine вычисляется сдвиг (offset) текущего буфера относительно начала видеопамяти и передается одним из аргументов в функции рисования в ядро Linux.
3. Число реализованных функций в QEP93xxPaintEngine не велико, поэтому возможно и ускорение производительности пока не всегда ощутимо. Процесс реализации функций нужно продолжать, тем более что при различных стилях используются в большей мере различные функции, например для QWindowStyle это drawPolygon, который пока не реализован оптимизированно. Возможно стоит вообще реализовать только 2 функции drawBufferSpan и drawColorSpans, но пока у меня это не получилось.