ЗАО «ЗЭО»
Техническая поддержка пользователей => ОС Linux, U-Boot => Тема начата: scad от 20 Августа, 2009, 14:20:02
-
В последнем кратере от Cirrus включен пакет directFB, правда почему-то при сборке он не копирует библиотеки в КФС, но не страшно - скопировал руками. при запуске arm-linux-dfbinfo получаю следующее:
(*) DirectFB/Core: Single Application Core. (2006-10-16 09:23) [ DEBUG ]
(*) Direct/Thread: Running 'VT Switcher' (CRITICAL, 449)...
(*) DirectFB/Graphics: Generic Software Rasterizer 0.6 (convergence integrated media GmbH)
(!) DirectFB/FBDev: No supported modes found in /etc/fb.modes and current mode not supported!
(!) DirectFB/FBDev: Current mode's pixelformat: rgba 5/11, 6/5, 5/0, 0/0 (16bit)
(!) DirectFB/Core/layers: Failed to initialize layer 0!
--> Initialization error!
(!) DirectFB/Core: Could not initialize 'layers' core!
--> Initialization error!
testdfb.c <42>:
(#) DirectFBError [DirectFBCreate (&dfb)]: Initialization error!
кто-нибудь пробовал directfb на тионе? или ТИОН все это не поддерживает?
-
Нужно смотреть чего именно хочет и не получает directfb
-
Скорее всего Direct FB хочет поставить свои настройки для видеорежима, а соотвествующий ioctl в драйвере ep93xx не реализован :( См. пост про смену разрешения...
fbset "vmode_name" дает ошибку
при вызове функции fb_set_var в драйвере ep93xxfb.c Invalid argument
-
проблема решилась следующим образом - выбрал в драйвере ядра DEFAULT_MODE 11 и DEFAULT_OUT CRT_OUT вместо LCD_OUT. Теперь можно менять режимы командой fbset и заработал directfb 1.0.0 идущий с crater_ом. Жаль что все в 16битах...
PS Qt 4.5.2 с directfb запускается но появляются какие-то артефакты на экране в виде черных прямоугольников. прицеплю скоро картинку.
-
Продолжаем битву с DirectFB. Тот который идет в linux-crater-1.0.3 (последний релиз сборки cirrus) не содержит gfx драйвера для процессоров циррус ??? Взял патч из вот этой сборки: http://arm.cirrus.com/files/linux/heelrod/crater.tar.bz2 (http://arm.cirrus.com/files/linux/heelrod/crater.tar.bz2) положил в директорию packages/directfb и пересобрал все. Теперь аппаратное ускорение работает, но при инициализации directfb ругается на
unsupported video mode
и
pixel clock error
И картинка "блеклая" с неверными цветами и очень сильно моргает.
Напомню, что все это происходит на ТИОНЕ-ПРО с подключенным через VGA-адаптер 19" TFT мониторе. При этом в драйвере видео в ядре установлен vout CRT_OUT,потому что только если стоит CRT_OUT запускается DirectFB.
А при этом еще существует проблема с цветами - 16 бит есть, но полярность не та :(
asv писал:
> потому что картинка в opie какая-то блеклая была по сравнению со штатной
Не та полярность pixclk:
Для VGA сейчас: EDGE_FALLING, POL_LOW, POL_LOW, POL_LOW,
Вы ставили 6ой: EDGE_RISING, POL_LOW, POL_LOW, POL_LOW,
Так вот поставил EDGE_FALLING, POL_LOW, POL_LOW, POL_LOW ничего не изменилось. Меняешь вывод на LCD_OUT - все ок, но не работает DirectFB.
Понятно что дело в корректных настройках видео режимов - подскажите куда копать.
-
Картинка выглядит как здесь: http://arm.cirrus.com/forum/pub/bad-photo-clip_149.jpg (http://arm.cirrus.com/forum/pub/bad-photo-clip_149.jpg)
-
Почему-то при использовании vout=0 (CRT) полярность pixclk (по крайней мере) берётся не указанная в структуре.
То есть для VGA
video=ep93xxfb:vout=1,vmode=16 -- нормальное изображение
video=ep93xxfb:vout=0,vmode=16 -- неверная полярность
Это еще не переходя к 800x600.
Надо будет разобраться как такое происходит, скорее всего это же причина того, что в 800x600 в вашем случае такой мусор на экране.
PS. Но это будет не в ближайшее время.
-
Пытаюсь собрать DirectFB в linux-crater-1.0.3 и патч скопировал из http://arm.cirrus.com/files/linux/heelrod/crater.tar.bz2 (http://arm.cirrus.com/files/linux/heelrod/crater.tar.bz2) в packages/directfb, но собираться не хочет
make: *** Нет правила для сборки цели `linux_fusion', требуемой для `directfb'. Останов.
Как быть? Может подскажете
Или может кто знает как собрать без кратера
-
Если не хотите разрешать зависимотси, то проще сразу собирать в
heelrod/crater.tar.bz2
-
Спасибо! Собралось, однако при запуске получаю примера получаю
./sprite
=======================| DirectFB 1.0.0 |=======================
(c) 2001-2007 The DirectFB Organization (directfb.org)
(c) 2000-2004 Convergence (integrated media) GmbH
------------------------------------------------------------
(*) DirectFB/Core: Multi Application Core. (2009-09-03 04:46)
(*) Fusion/SHM: Using MADV_REMOVE (2.6.20.4 >= 2.6.19.2)
(!) Fusion/Init: Could not enter world '0'!
--> Inappropriate ioctl for device
sprite.c <93>:
(#) DirectFBError [DirectFBCreate (&dfb)]: Initialization error!
в модуле ядра ничего не менял, менял только аргументы загрузки ядра на vout=0,vmode=7
заметил еще что scad собирал без fusion
-
to Snar 1. Какой у Вас ТИОН и какой монитор?
2. Собирал без fusion потому что мне не нужно запускать несколько приложений directfb одновременно :)
3. У вас не запускается потому что не загружен модуль fusion.ko и не созданы файлы устройств для него.
-
у меня тион про2, использую TFT экран 5.7' + подключил монитор LCD 19'
без fusion у меня тоже запустился пример, вот только не знаю как будет работать мое приложение(qt4) в нем 2 окна
fusion.ko подгружал через insmod результат прежний
теперь вот такое
./sprite
=======================| DirectFB 1.0.0 |=======================
(c) 2001-2007 The DirectFB Organization (directfb.org)
(c) 2000-2004 Convergence (integrated media) GmbH
------------------------------------------------------------
(*) DirectFB/Core: Single Application Core. (2009-09-03 09:37)
(*) Direct/Thread: Running 'VT Switcher' (CRITICAL, 323)...
(*) Direct/Modules: suppress module 'tslib'
(*) Direct/Thread: Running 'Keyboard Input' (INPUT, 324)...
(*) DirectFB/Input: Keyboard 0.9 (directfb.org)
(*) DirectFB/Graphics: cirruslogic edb93xx 0.1 (cirruslogic)
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - pixel clock error 100000000
ep93xxfb_check_var - pixel clock error 109998000
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - pixel clock error 100000000
ep93xxfb_check_var - pixel clock error 109998000
ep93xxfb_check_var - pixel clock error 109998000
ep93xxfb_check_var - pixel clock error 125643000
ep93xxfb_check_var - pixel clock error 125643000
ep93xxfb_check_var - memory error
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - unsupported video mode
ep93xxfb_check_var - pixel clock error 107991000
ep93xxfb_check_var - pixel clock error 125992000
ep93xxfb_check_var - pixel clock error 134989000
ep93xxfb_check_var - pixel clock error 134879000
ep93xxfb_check_var - pixel clock error 155981000
ep93xxfb_check_var - pixel clock error 171998000
ep93xxfb_check_var - pixel clock error 197980000
(*) DirectFB/Core/WM: UniQuE 0.4 (Denis Oliver Kropp)
-
То есть заработало? ;)
qt должно нормально работать если второе окно из первого открываешь... А вот если это два разных приложения - тогда будут проблемы
-
заработало, картинка конечно....теперь бы все это заставить работать с TFT 5.7 а потом уж qt4 собрать с directfb
-
Почему-то при использовании vout=0 (CRT) полярность pixclk (по крайней мере) берётся не указанная в структуре.
То есть для VGA
video=ep93xxfb:vout=1,vmode=16 -- нормальное изображение
video=ep93xxfb:vout=0,vmode=16 -- неверная полярность
Это еще не переходя к 800x600.
Надо будет разобраться как такое происходит, скорее всего это же причина того, что в 800x600 в вашем случае такой мусор на экране.
PS. Но это будет не в ближайшее время.
Вроде разобрался в чем проблема. Смотрим видеодрайвер ядра 2.6.20.4 из сборки crater-1.0.0_svn741.
ep93xxfb.c:
static int ep93xxfb_set_par(struct fb_info *info)
...
999: #ifdef CONFIG_EP93XX_SDC3
1000: attribs|=3 << VIDEO_ATTRIBS_SDSEL_SHIFT
1001: #endif
1002: attribs |= VIDEOATTRIBS_INVCLK
БИНГО !!!!
attribs |= VIDEOATTRIBS_INVCLK
получается EDGE_RISING ставится ВСЕГДА при вызове функции ep93xxfb_set_par(struct fb_info *info), а эта функция вызывается во ВСЕХ случаях, когда мы вызываем fbset. Когда модуль инициализируется, то вызывается функция
ep93xxfb_config(struct fb_info *info)
где происходит корректное задание видеорежима:
#ifdef CONFIG_EP93XX_SDC3
attribs|=3 << VIDEO_ATTRIBS_SDSEL_SHIFT
#endif
if(epinfo.clk_edge == EDGE_RISING)
attribs |= VIDEOATTRIBS_INVCLK
...
В итоге патч следующий добавляем строчку if(epinfo.clk_edge == EDGE_RISING)
между 1001 и 1002 строками.
Получаем:
999: #ifdef CONFIG_EP93XX_SDC3
1000: attribs|=3 << VIDEO_ATTRIBS_SDSEL_SHIFT
1001: #endif
1002: if(epinfo.clk_edge == EDGE_RISING)
1003: attribs |= VIDEOATTRIBS_INVCLK
З.Ы. Классический патч не шлю - руки не дошли сделать, потому что мой ep93xxfb.c отличается не только на эту строку от исходного ;), а сейчас завал на работе... :(
-
Браво :). Уже отлично! QT4 не пробовал собирать с directfb? У меня не выходит - все время The DirectFB screen driver functionality test failed!
You might need to modify the include and library search paths by editing
QT_CFLAGS_DIRECTFB and QT_LIBS_DIRECTFB in
qt-embedded-linux-opensource-src-4.5.2/mkspecs/qws/linux-arm-g++
-
Зайдите и после вывода этого сообщения в директорию config.tests/qws/directfb и наберите make. Потом ошибки в студию ;)
-
linking directfb
directfb.o: In function `main':
directfb.cpp:(.text+0xc): undefined reference to `DirectFBInit'
collect2: ld returned 1 exit status
make: *** [directfb] Ошибка 1
вот такой конфиг
./configure -prefix /fs/qt4.5-linuxfb -embedded arm -armfpa -little-endian -qt-mouse-tslib -pch -I/home/snar/downloads/dev/host/include/directfb -I/home/snar/downloads/dev/host/include -L/home/snar/downloads/dev/host/lib -no-cups -no-qdbus -qt-freetype -qt-gfx-linuxfb -plugin-gfx-directfb -qt-kbd-qvfb -no-glib -no-webkit -silent -qt-zlib -qt-libtiff -qt-libpng -qt-libmng-qt-libjpeg -silent -xplatform qws/linux-arm-g++
/qws/linux-arm-g++/qmake.conf
#
# qmake configuration for building with arm-linux-g++
#
include(../../common/g++.conf)
include(../../common/linux.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC = arm-linux-gcc
QMAKE_CXX = arm-linux-g++
QMAKE_LINK = arm-linux-g++
QMAKE_LINK_SHLIB = arm-linux-g++
# modifications to linux.conf
QMAKE_AR = arm-linux-ar cqs
QMAKE_OBJCOPY = arm-linux-objcopy
QMAKE_STRIP = arm-linux-strip
QT_CFLAGS_DIRECTFB += -I/home/snar/downloads/dev/build/DirectFB-1.0.0/include
QT_LIBS_DIRECTFB += -L/home/snar/downloads/dev/build/root/lib -ldirect -ldirectfb -lfusion -lz
load(qt_config)
-
Редактирование файла qws/linux-arm-g++/qmake.conf не дало результатов
зато собирается и работает вот так
export QT_LIBS_DIRECTFB="-ldirect -ldirectfb -lfusion -lz"
ну и в конфиге не забываем -I/путь к кратеру/host/include/directfb
однако осталось еще это
ep93xxfb_check_var - pixel clock error 125643000
ep93xxfb_check_var - memory error
ep93xxfb_check_var - unsupported video mode
как с ним быть?
-
Я так понимаю, что directfb перед запуском проверяет все видеорежимы описанные в /etc/fb.modes, поскольку был взят файл fb.modes по умолчанию - там есть режимы которые ep93xxfb не поддерживает, о чем и сообщает всему миру :) Но те которые поддерживаются проходят без сообщений... Я считаю, что это нормально - и не стал редактировать fb.modes, хотя для "боевой" системы лучше оставить всего один режим в fb.modes - тот в котором работаем - быстрее грузиться будет
-
скажите с использованием diretcfb вы заметили ускорение вывода графики? спрашиваю потому что сам визуально особой разницы не наблюдаю, а думаю что должна быть в разы
-
Честно говоря не особо... :-[ Мне кажется что дело в том, что Qt не использует все возможности directfb. в особенности по копированию изображений. Наверное надо писать свой драйвер под Qt4. ???
to Snar: На сколько я понимаю ты уже пробовал это делать?
-
вобщем по умолчанию directfb сконфигурирован так что не использует BLIT ни cfb_blit ни ep93xxblit
#define EDB93XX_SUPPORTED_BLITTINGFLAGS (DSBLIT_NOFX)
+
+#define EDB93XX_SUPPORTED_BLITTINGFUNCTIONS (DFXL_NONE)
используется только fill, но если посмотреть вызовы этой функции ядра то она используется крайне редко - т.е. ускориться ничего не может :-(
зато если +#define EDB93XX_SUPPORTED_BLITTINGFUNCTIONS (DFXL_BLIT) то картина совсем другая - более активно используется fill + вызывается blit в модуле ядра, cfb_blit тут не работает - его надо либо переписывать либо использовать аппаратный.С аппаратным тоже не все просто потому что, вроде бы directfb или qt4 использует активно палитры, а как их прикрутить к аппаратному blit я не знаю. Вобщем пока на экране каша
-
#define EDB93XX_SUPPORTED_BLITTINGFUNCTIONS (DFXL_BLIT)
Где ее объявлять? Тоже хочу попробовать :)
-
cirrus_porting.patch тут смотри
-
to Scad есть ли какие успехи?
-
А какой всё таки у этого топика был финал - никто не в курсе ? : ) есть предположение, что тема здесь поднимаемая (DirectFB) как-то связана с решением моей проблемы, описываемой здесь: http://www.zao-zeo.ru/forum/index.php?topic=360.0 (http://www.zao-zeo.ru/forum/index.php?topic=360.0). Может DirectFB помочь с проблемами задержек при изменении цвета текста кнопки QT-4 при её нажатии/ускорении отрисовки картинки во весь экран ?
-
> Может DirectFB помочь с проблемами задержек при изменении цвета текста кнопки QT-4
Мне кажется, что пока Qt4 (4.5) с DirectFB работает медленнее чем с /dev/fb, в Интернет тоже можете найти подобные заключения.