LINUX.ORG.RU

Экспериментальная видеокарта. vlc + framebuffer

 , ,


0

2

Доброго времени суток!

Разбираюсь с одним дизайном. По факту оно должно работать как видеокарта. Тестовое приложение от производителя вроде даже как-то выводит видео на экран через эту платку через HDMI, но там настолько все через одно место, что приходится постоянно править скрипты.

Сейчас стоит задача вывести видео через vlc на экран через эту карточку. Для этого, судя по всему, надо было пересобрать vlc и запустить файлик util/run_vlc.sh. он не работает. Стал разбираться, че не так. Вот вывод vlc:

$ LD_LIBRARY_PATH="/usr/local/lib" /usr/local/bin/vlc --config ./vlcrc_64 --fbdev /dev/fb1 -I dummy --control dbus ./output.avi 
VLC media player 2.0.9 Twoflower (revision 2.0.8a-20-g902dc4c)
[0x1176268] main xml reader error: XML reader not found
[0x117caf8] dummy interface: using the dummy interface module...
[0x7fcc54014128] fb vout display error: cannot open /dev/fb1 (No such file or directory)
[0x7fcc70c08c28] main video output error: video output creation failed
[0x7fcc68c02a68] main decoder error: failed to create video output

Отсюда вопрос:

Как мне создать это устройство (/dev/fb1) и связать его с карточкой? За работу карты отвечают три файла в деве: /dev/xraw_data0, /dev/xraw_data1, /dev/xdma_stat. Смысл их пока таинственен, так как доков на тот код нету, а структура такова - есть три драйвера по одному на каждый из вышеперечисленных файлов, есть libjni, которое общается с теми драйверами, для приложения на яве. Не все функции работают из коробки. Так что искать что на что там завязано - отдельный большой геморрой.

напрямую вывести в те устройства не выходит, так как:

$ LD_LIBRARY_PATH="/usr/local/lib" /usr/local/bin/vlc --config ./vlcrc_64 --fbde/dev/xraw_data0 -I dummy --control dbus ./output.avi 
VLC media player 2.0.9 Twoflower (revision 2.0.8a-20-g902dc4c)
[0xb1f268] main xml reader error: XML reader not found
[0xb25af8] dummy interface: using the dummy interface module...
[0x7f01cc003b88] fb vout display error: cannot get fb info (Inappropriate ioctl for device)
[0x7f01f0c08c28] main video output error: video output creation failed
[0x7f01e8c02a68] main decoder error: failed to create video output

★★

Попробовал вот так:

# mknod /dev/fb1 c 29 1
# fbset -fb /dev/fb1 1920x1080-60
open /dev/fb1: No such device

говорят, что еще драйвер карты надо связать с устройством. как?

aido ★★
() автор топика

В тему пока не вчитался, возможно, позже вникну и отвечу. У вас живой экземпляр железки, или всё в эмуляции?

Andrey_Utkin ★★
()
Ответ на: комментарий от aido

Так точно не заработает :). fb1 это framebuffer device. Нужен драйвер для видеокарты чтобы оно появилось.

Я подозреваю, тебе надо сделать insmod/modprobe . Дай прямую ссылку на дрова, я не люблю играть в испорченный телефон.

true_admin ★★★★★
()

если карточка работает через FB, тебе драйвер должен был создать устройство. если он этого не делает, ну - у тебя с ним что-то не так, очевидно

другое дело, что работать через FB она не обязана. покажи код тестового приложения, что ли

jtootf ★★★★★
()

/dev/xraw_data0, /dev/xraw_data1, /dev/xdma_stat

Судя по всему, этот проект нихрена не видеокартой и не фреймбуфером прикидывается. Просто какой-то самописный велосипед, гоняющий видеопоток через PCIe. Какие-нибудь дополнительные дрова на хост ставил?

Смысл их пока таинственен, так как доков на тот код нету, а структура такова - есть три драйвера по одному на каждый из вышеперечисленных файлов, есть libjni, которое общается с теми драйверами, для приложения на яве. Не все функции работают из коробки. Так что искать что на что там завязано - отдельный большой геморрой.

А вот и сам велосипед.

Сейчас стоит задача вывести видео через vlc на экран через эту карточку. Для этого, судя по всему, надо было пересобрать vlc и запустить файлик util/run_vlc.sh. он не работает.

Так ты его пересобрал? Может они для vlc написали плагин вывода через эти /dev/xraw*

А может быть где-нибудь в пакете есть драйвер фреймбуфера для хоста. Мне неохота 200 метров с зайлинкса вытягивать...

Kosyak ★★★★
()
Ответ на: комментарий от jtootf

ну драйвер пересобрал, fb1 появился. Видео на экран не выводится все равно. Проверил в dmesg-e: fbi (хоть что-то простое, что умеет обращаться к фб) устройство открывает корректно, но на экране ничего не появляется все равно. vlc --fbdev /dev/fb1 video.avi даже не собирается открывать это устройство - создает окно на обычном мониторе и туда пишет, в дмесге ни намека на то, что к устройству обращались.

aido ★★
() автор топика
Ответ на: комментарий от Kosyak

vlc и собирал по их инструкции, и из репов ставил. не работает ни одно, ни другое.

Вот ссылка на драйвер

aido ★★
() автор топика
Ответ на: комментарий от Dead

очень закрученный. проще весь пример с xilinx скачать.

aido ★★
() автор топика
Ответ на: комментарий от aido

Посмотрел драйвер.

xrawdata0/xil_fb.c - нужный драйвер фреймбуфера. Причем в xrawdata0/Makefile есть интересные строчки:

ifeq ($(VIDEO_DESIGN),1)
obj-m := sguser.c
obj-m := xrawdata0.o
xrawdata0-objs :=  sguser.o 
endif
ifeq ($(VIDEO_DESIGN),2)
obj-m := xil_fb.c
obj-m := xrawdata0.o
xrawdata0-objs :=  xil_fb.o 
endif
Т.е. драйвер фреймбуфера собирается только когда $(VIDEO_DESIGN) = 2

Это в свою очередь устанавливается в главном Makefile:

ifeq ($(DRIVER_MODE),$(filter $(DRIVER_MODE),PERFORMANCE ))
export VIDEO_DESIGN=1
endif
ifeq ($(DRIVER_MODE),$(filter $(DRIVER_MODE),VIDEOSTREAM ))
export VIDEO_DESIGN=2
endif
Т.е. ему надо сказать что DRIVER_MODE=VIDEOSTREAM, например при сборке дров:
make DRIVER_MODE=VIDEOSTREAM

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

я так и делаю. Включил еще полный вербоз. Не знаю, может ли это чем-то помочь, но логи примерно такие (их много, поэтому тут только отрывок).

[17931.460482] [0]: active=[2]1000000000, wait=[2]1000000000, comp bytes=[2]0, sw=0
[17931.460485] [1]: active=[2]1000000000, wait=[2]1000000000, comp bytes=[2]0, sw=0
[17931.460488] [32]: active=[2]1000000000, wait=[2]1000000000, comp bytes=[2]0, sw=0
[17931.460491] [33]: active=[2]1000000000, wait=[2]1000000000, comp bytes=[2]0, sw=0
[17931.460505] VCCINT=0
[17931.460505] VCCAUX=0
[17931.460506] VCC3V3=0
[17931.460506] MGT_AVCC=0
[17931.460506] MGT_AVTT=0
[17931.460507] VCCAUX_IO=0
[17931.460507] VCCBRAM=0
[17931.460508] DIE_TEMP=0
[17932.036384] For engine 0, TestMode 108200
[17932.036385] Reached mySetState with privdata 54545454
[17932.036387] TestMode: 1081856
[17932.046324] ZYNQ_PS_REGISTER OFFSET value is 1
[17932.046325] Zynq PS ready. Starting the test 1 val
[17932.046325] SetState TX with RawTestMode 108200, reg value 2
[17932.046326] Raw Data 0 Driver: Disabling Sobel Filter mode 2
[17932.066197] Raw Data 0 Driver:Displaying Video on CVC 2
[17932.076143] Raw Data 0 Driver: Starting the test - mode 108200, reg 2
[17932.076144] Reg 9104 = 0
[17932.076144] ========Reg 9004 = 3
[17932.076145] DESIGN MODE 3
[17932.076145] ========Reg 9110 = 512
[17932.076146] SeqNo Wrap around 512
[17932.077140] ========Reg 9108 = 2
[17932.097012] Obtained val 1 at HOST_STATUS_OFFSET will be setting TEST START soon
[17932.449927] s2 
[17932.449932] [0]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449936] [1]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449939] [32]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449942] [33]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449956] VCCINT=0
[17932.449956] VCCAUX=0
[17932.449957] VCC3V3=0
[17932.449957] MGT_AVCC=0
[17932.449957] MGT_AVTT=0
[17932.449958] VCCAUX_IO=0
[17932.449958] VCCBRAM=0
[17932.449958] DIE_TEMP=0
[17933.439378] s2 
[17933.439383] [0]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[17933.439394] [1]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[17933.439397] [32]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[17933.439401] [33]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[17933.439415] VCCINT=0
[17933.439415] VCCAUX=0
[17933.439416] VCC3V3=0
[17933.439417] MGT_AVCC=0
[17933.439418] MGT_AVTT=0
[17933.439419] VCCAUX_IO=0
[17933.439419] VCCBRAM=0
[17933.439420] DIE_TEMP=0
[17933.691482] Reached myGetState with privdata 54545454
[17933.691485] Reached myGetState with privdata 54545456
[17933.691487] Reached myGetState with privdata 54545454
[17933.691489] Reached myGetState with privdata 54545456
[17934.428828] s2 

Однажды было вот такое:

[16489.793759] s3 
[16489.793764] [0]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[16489.793768] [1]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[16489.793771] [32]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[16489.793774] [33]: active=[0]1000000000, wait=[0]1000000000, comp bytes=[0]0, sw=0
[16489.793787] VCCINT=0
[16489.793788] VCCAUX=0
[16489.793788] VCC3V3=0
[16489.793789] MGT_AVCC=0
[16489.793789] MGT_AVTT=0
[16489.793789] VCCAUX_IO=0
[16489.793790] VCCBRAM=0
[16489.793790] DIE_TEMP=0
[16490.399785] For engine 0, TestMode 200
[16490.399787] Reached mySetState with privdata 54545454
[16490.409725] ZYNQ_PS_REGISTER OFFSET value is 1
[16490.409726] Zynq PS ready. Starting the test 1 val
[16490.409727] SetState TX with RawTestMode 200, reg value 2
[16490.409727] Raw Data 0 Driver: Disabling Sobel Filter mode 2
[16490.429599] Raw Data 0 Driver:Displaying Video on CVC 2
[16490.439535] Raw Data 0 Driver: Stopping the test, mode 2
[16490.439536] ========Reg 9108 = 2
[16490.509085] Obtained val 1 at HOST_STATUS_OFFSET will be setting TEST STOP soon

aido ★★
() автор топика
Ответ на: комментарий от aido

Что ж он такое может читать, что у него все напряжения по нулям стоят?

это же вроде данные со встроенного монитора FPGA'шки. ЕМНИП, на цинке его как-то отдельно надо заводить.

Kosyak ★★★★
()
Ответ на: комментарий от aido

Тогда совсем дурацкий вопрос - модуль xil_fb загружен?

P.S. А нет, вижу по логам загружен.

Kosyak ★★★★
()
Последнее исправление: Kosyak (всего исправлений: 1)
Ответ на: комментарий от aido

Можешь куда-нибудь полный dmesg выложить? Судя по коду драйвера, он должен прям совсем сразу при загрузке модуля создавать фреймбуфер.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

Да фб-то создается, и даже умеет открываться и закрываться. а насчет дмесга - в первом листинге в принципе все есть (к тому же там данных становится столько, что /dev/kmsg buffer overrun, some messages lost.), дальше идет много повторений вот этого:

[17932.449927] s2 
[17932.449932] [0]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449936] [1]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449939] [32]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449942] [33]: active=[3]1000000000, wait=[3]1000000000, comp bytes=[3]0, sw=0
[17932.449956] VCCINT=0
[17932.449956] VCCAUX=0
[17932.449957] VCC3V3=0
[17932.449957] MGT_AVCC=0
[17932.449957] MGT_AVTT=0
[17932.449958] VCCAUX_IO=0
[17932.449958] VCCBRAM=0
[17932.449958] DIE_TEMP=0

Судя по xpmon_be.h и строчке Raw Data 0 Driver: Starting the test - mode 108200, reg 2 этот тест запускается в loopback. Пробовал выключать loopback - тест не работает.

aido ★★
() автор топика
Последнее исправление: aido (всего исправлений: 1)

Оффтоп: не подскажешь, как редактировать DTB файлы? Какой программой? Это блобы device tree, в частности в них содержатся настройки мультиплексирования выводов. Они в бинарном виде.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

насколько помню мануалы, dtc умеет делать их в обе стороны - из текста в бинарь и наоборот.

aido ★★
() автор топика
Ответ на: комментарий от Kosyak

да и к тому же под полным вербозом комп виснет наглухо.

aido ★★
() автор топика
Ответ на: комментарий от Kosyak

забавно еще, что SetState, GetState вызываются, а в буфер никто не пишет.

aido ★★
() автор топика
Ответ на: комментарий от Kosyak

Дошло. не драйвер не работает. с драйвером все ок. в jnilib стоит заглушка на использование видеорежима.

aido ★★
() автор топика
Ответ на: комментарий от Kosyak

Правильный ответ - запускаем java-обертку в видеорежиме пофигу с каким файлом на воспроизведение - он все равно не используется. потом запускаем vlc --fbdev /dev/fb1 video.avi и наслаждаемся.

Блджад! Я три дня убил на то, чтобы разобраться, почему оно не работает, а оказалось, что поделие собрано из костылей!

aido ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.