Здравствуйте.
Озадачился я таким вопросом: как выводить независимые изображения на разные мониторы. Имеется вывод на vga через LCD и на VGA через переходник LVDS-RGB.
По умолчанию, в тех сборках, что поставляются с платой, если включены два монитора, то они дублируются. Чтобы выводить изображения независимо, нужно добавить в строку, которую отдаёт U-boot ядру следующее:
ldb=sep1
Либо ldb=sep0, от этого, насколько я понял, зависит то, какой фрембуфер будет главным, то есть с меньшим номером (fb0).
При такой строке система загружается с одним работающим монитором, второй, который на fb3 по умолчанию остаётся blank=1, то есть пустой.
Выполняем echo 0 > /sys/class/graphics/fb2/blank и получаем изображение уже на двух монитора, и изображения разные. На основном приглашение командной строки, на втором - Tux.
Проблема в том, что изображение портится на обоих мониторах, и часть изображения с первого монитора попадает на второе. На фото видно https://www.dropbox.com/s/p6yz80fuow692ez/IMG_20150831_155026.jpg?dl=0
На iMX6S можно получать 2 канала.
На iMX6D/Q можно получать 4 канала.
Но в тонкостях настроек этого я не очень разобрался, настраивал скорее экспериментально.
Штатно, в настройках старого ядра для SK-iMX6Q включено 4 канала (HDMI, 2xLVDS, LCD), на SK-iMX6X-SODIMM включается 2 канала (см. переменные окружения uboot).
Судя по фотографии, включается Dual режим (для панелей с двумя LVDS интерфейсами), из собственного опыта - нужно еще крутить настройки IPU в боардфале ...
Причем, если правильно помню, имело значение даже какое разрешение на каком порту сидит ...
Полагаю, от версии ядра к ядру настройки так же надо пересматривать.
Добавляю описание к фото:
Правый монитор - LVDS, по умолчанию изображение идёт на него ( в силу строки, передающейся из U-Boot). На нём была запущена одна из графичесих демок OpenVG, затем демка была остановлена, но изображение осталось (это уже особенности демки, значения не имеет). После этого выполнил
echo 0 > fb2/blank, запустился монитор, который сидит на LCD.
И как видно на фото, на этот монитор ушла часть изображения с LVDS монитора, в том числе и мерцающий курсор, который "пробил" чёрную дырку на остатке изображения от демки (видно на обоих мониторах, на LCD он съехал вниз).
Попробовал собрать из этого нового buildroot - больше проблемы нет. Изображения друг на друга не накладываются.
Строка настройки выдеоустройств:
video=mxcfb0:dev=ldb,1024x768M@60,if=RGB24 video=mxcfb1:dev=lcd,1024x768M@60,if=RGB24 ldb=dul1 consoleblank=0
По идее dul1 - означает дублирование изображения на мониторах, если я не ошибаюсь, но в моём случае работает как мне надо - изображения на двух видеовыводах независимое.
При запуске работает только fb0, который на LVDS. Выполняю echo 0 > fb2/blank, и включается второй монитор, который на LCD. Не пойму, как его запускать сразу на старте системы, но так тоже пойдёт.
Дальше можно запускать различные графические демки на разных дисплеях. В качестве устройства отрисовки для OpenGL берём fbGetDisplayByIndex(N), где N - номер нужного фреймбуфера. Для fb0 берём 0, для fb1 - 1, и так далее.
Сейчас точно не скажу, но возможно также перед запуском приложения нужно выполнить
export FB_FRAMEBUFFER_0=/dev/fb0
export FB_FRAMEBUFFER_1=/dev/fb1
export FB_FRAMEBUFFER_2=/dev/fb2
export FB_FRAMEBUFFER_3=/dev/fb3
как советует i.MX_6_Programming_Framebuffer_API.pdf.
не знаю, что у вас за ядро, но, например, в 3.0.35 в файле drivers/video/mxc/mxc_ipuv3.c
есть функция mxcfb_probe
где есть подходящее для экспериментов ветвление:
ldb=dul1 задает режим работы для LVDS Bridge и влияет только на устройства вывода подключенные к LVDS
в сборке предусмотрен скрипт для тестирования экранов, можно закоментироавть строки для fb-test в скрипте и получится скрипт оживления второго экрана :)