LINUX.ORG.RU

запуск QT приложений без графической оболочки на LVDS дисплее

 


0

1

Есть промышленная плата архитектуры X86, с графическим чипом от SIS Z9. К плате прицеплен LVDS дисплей с разрешением 640х480. Под эту плату скомпилировано ядро и КФС. Все вроде работает и система до консоли грузится. Работает как VGA так LVDS дисплеи. Все вроде ОК.

Теперь надо сделать QT приложение которое работает без графической оболочки. В КФС (через Buildroot) добавляю QT 4.8, компилирую пример. запускаю: ./test -qws

Сейчас добился такого состояния что на VGA дисплее все видно и все ОК. LVDS дисплей тухнет и нечего не видно. Запущен модуль sisfb (виртуальный буфер для чипов SIS), и есть устройство fb0 По моему уразумению VGA через мост конвертируется в LVDS. При загрузке sisfb про мост ничего не пишется. В тоже время в текстовом режиме (консоль) картинка правильно выдается на LVDS

Как сделать изображение на LVDS, куда копать?

где это всё происходит?

rogerw
()

интересная к вас работа )

rogerw
()

А другие графические приложения отображаются на этом дисплее?

Просто самому Qt вообще плевать что у вас за дисплей. Это не его дело. Думаю проблема на уровне драйверов или настроек системы.

upd.

Вообще можно сделать несколько экземпляров QWS_Server и задать им разные дисплеи (по-умолчанию он рисует на дефолтном дисплее)

RiseOfDeath ★★★★
()
Последнее исправление: RiseOfDeath (всего исправлений: 2)

тебе оба дисплея надо?
у нас была схожая проблема - ядру передали video=VGA-1:d video=DVI-D-1:1024x768, отключив vga-1, а встроенный DVI-D-1 был как раз интегрированным дисплеем. (тоже кутешные проги гоняем)

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

Вопрос у меня два дисплея или один дублированный? Консоль параллельно выводится на оба дисплея.

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

отключай ненужный через параметры ядра - будет тебе счастье :)
посмотреть названия можно, кажется, через xrandr.

у меня уж той железки на руках нет, чтобы на ней уточнить.

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

Важное дополнение: Взял загрузочный диск с Puppy linux 4.2.Пытаюсь загрузится дохожу до настройки видео (пока идет текстовый режим), там предлагается два варианта: 1.Xorg - при его выборе картина аналогична как у меня с QT - на VGA видно на LVDS при переходе в графический дисплей он тухнет. 2. VESA - там все работает !!!! оба дисплея работают и показывают одинаковую картинку.

Скорее всего vesa драйвер поддерживает мое железо. Вопрос как vesa драйвер прикрутить к QT, какие параметры передавать ядру, и какие флаги поставить в buildroot

pav2000
() автор топика

Графической оболочки как таковой нет. Есть консоль.

Показательный эксперимент. Есть плата, к ней подключены дисплей по LVDS и по VGA (или один из них - картина не меняется).

Загрузились, появилась консоль.

Что видим по команде #ls /dev/f* /dev/fd /dev/full /dev/fuse

Начинаем подключать графику. #insmod /lib/modules/3.14.20vortex86dx/kernel/drivers/video/cfbfillrect.ko #insmod /lib/modules/3.14.20vortex86dx/kernel/drivers/video/cfbcopyarea.ko #insmod /lib/modules/3.14.20vortex86dx/kernel/drivers/video/cfbimgblt.ko

И наконец, #insmod /lib/modules/3.14.20vortex86dx/kernel/drivers/video/sis/sisfb.ko Отладочная консоль:

[ 79.731473] sisfb: Video ROM not found [ 79.735409] sisfb 0000:00:03.0: Z9 detected [ 79.743411] sisfb: Video RAM at 0xf8000000, mapped to 0xd0980000, size 32768k [ 79.750683] sisfb: MMIO at 0xfefc0000, mapped to 0xd2a00000, size 256k [ 79.757281] sisfb: Memory heap starting at 32544K, size 32K [ 79.862704] sisfb: CRT1 DDC supported [ 79.866448] sisfb: CRT1 DDC level: 2 [ 80.101898] sisfb: Monitor range H 30-83KHz, V 56-76Hz, Max. dotclock 170MHz [ 80.109035] sisfb: Default mode is 800x600x8 (60Hz) [ 80.127534] sisfb: 2D acceleration is enabled, y-panning enabled (auto-max) [ 80.134660] fb0: XGI Z7 frame buffer device version 1.8.9 [ 80.140155] sisfb: Copyright (C) 2001-2005 Thomas Winischhofer

Смотрим, что появилось в устройствах: #ls /dev/f* /dev/fb0 /dev/fd /dev/full /dev/fuse

Смотрим режим #fbset

mode «800x600-60» # D: 40.000 MHz, H: 37.879 kHz, V: 60.317 Hz geometry 800 600 800 32767 8 timings 25000 88 40 23 1 128 4 accel true rgba 8/0,8/0,8/0,0/0 endmode

Пробуем запустить Qt приложение: #/usr/HelloWorld -qws В ответ получаем ошибку.

QLinuxFbScreen::connect: Invalid argument Error: failed to map framebuffer device to memory. : driver cannot connect Aborted

Пока что работают оба дисплея. #fbset -g 800 600 800 32768 8 Гаснет дисплей по LVDS и больше не включается. #fbset -g 800 600 800 32767 8

Пробуем запустить приложение. /usr/HelloWorld -qws

Работает, но только на экране VGA.

Сам экран LVDS 640x480, но установка этих параметров работе LVDS дисплея не помогает, а вот для VGA не подходит соотношение сторон и подследний гаснет пока не будет установлено подходящее ему разрешение.

qazx
()
Ответ на: комментарий от pav2000

2. VESA - там все работает !!!!

по-моему тебе надо просто явно указать параметры фреймбуфера (-geometry ?)

http://qt-project.org/doc/qt-4.8/qt-embedded-running.html

К плате прицеплен LVDS дисплей с разрешением 640х480

скорей всего драйвер считывает режимы EDID из VGA дисплея и выставляет разрешение больше чем поддерживает подключенная по LVDS LCD панель

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

Если vga дисплей не подключать (не считывать параметры edid) то ничего не меняется. параметры дисплея указывал явно в параметрах ядра, когда sisfb был в ядре. Не помогло.

Как настроить разрешение для qt?

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

по-моему тебе надо просто явно указать параметры фреймбуфера (-geometry ?)

Пробовал. fbset -g 640 480 640 32767 8 == выставляется, но не работает

скорей всего драйвер считывает режимы EDID из VGA дисплея и выставляет разрешение больше чем поддерживает подключенная по LVDS LCD панель

Пробовал подключать по-разному: только vga, vga+lvds, только lvds. Разницы никакой не заметил.

Пробовал перед запуском export QWS_SIZE=640x480 /usr/HelloWorld -qws

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

Пробовал. fbset -g 640 480 640 32767 8 == выставляется, но не работает

это конечно не совсем правильный режим

--geometry, -g ... set all geometry parameters at once in the order <xres> <yres> <vxres> <vyres> <depth>

Пробовал подключать по-разному: только vga, vga+lvds, только lvds. Разницы никакой не заметил

это говорит о моем ложном предположении :) посмотри - есть ли в sysfs какая-нибуть информация о фреймбуфере

ls /sys/class/graphics/fb0

mode например

cat /sys/class/graphics/fb0/mode

и какое значение они имеют после запуска приложения Qt.

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

#cat /sys/class/graphics/fb0/mode пусто; cat /sys/class/graphics/fb0/modes U:800x600p-80

это конечно не совсем правильный режим

Пробовал установить такой: #fbset -g 640 480 640 480 8 #fbset mode «640x480-88» # D: 40.000 MHz, H: 44.643 kHz, V: 87.880 Hz geometry 640 480 640 32767 8 timings 25000 88 40 23 1 128 4 accel true rgba 8/0,8/0,8/0,0/0 endmode

#cat /sys/class/graphics/fb0/mode пусто; cat /sys/class/graphics/fb0/modes U:800x600p-80 U:640x480p-87

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

Я ничего не понял из твоего лога - мог бы хоть как разделить строки, с чего такая хрень

D: 40.000 MHz - говорит что частота 40 МГц

timings 25000 - говорит что частота 25 МГц

640 32767 - это вообще бред, vxres х vyres = общий размер видеопамяти доступная драйверу фреймбуфера, обычно она кратна размеру видимой части буфера и уж точно не влияет на тайминги. Что там еще есть в ls /sys/class/graphics/fb0 ?

cat /sys/class/graphics/fb0/modes U:800x600p-80 U:640x480p-87

без подключенного монитора тоже самое ? на панели LVDS есть i2c интерфейс (DDC) ?

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

Это я ввобще к тому что далеко не все панели смогут работать на частоте чуть не в два раза (40 МГц) превышающей номинал - 25 МГц для стандартногоо VESA 640х480.

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

Все параметры указаны при подключении только LVDS экрана, после того как он погас, работаю через отладочную консоль на COM порту.

#fbset

mode «640x480-88»

# D: 40.000 MHz, H: 44.643 kHz, V: 87.880 Hz

geometry 640 480 640 32767 8

timings 25000 88 40 23 1 128 4

accel true

rgba 8/0,8/0,8/0,0/0

endmode

qazx
()
Ответ на: комментарий от anonymous

Список и в [] значение соответствующего параметра.

ls /sys/class/graphics/fb0/

bits_per_pixel [8]

blank []

console []

cursor []

dev [29:0]

device/ *[is_a_dir]

mode []

modes [U:800x600p-80 U:640x480p-87]

name [XGI Z7]

pan [0,0]

power/ *[is_a_dir]

rotate [0]

state [0]

stride [640]

subsystem/ *[is_a_dir]

uevent [MAJOR=29 MINOR=0 DEVNAME=fb0]

virtual_size [640,32767]

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

Да - это мой фейл :)

timings 25000 - это период в пикосекундах, частота 40 МГц и это слишком много для твоей панели. Я так понимаю на панели нет микросхемы eeprom с i2c интерфейсом для хранения допустимых параметров, отсюда и такие фантастические частоты и скорей всего поэтому не работает. Тебе надо как-то сообщить драйверу полные параметры VESA 640х480

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

Работал ведь как-то до переключения режима с помощью fbset.

Мысль показалась здравой. Но попробовал увеличить pixclock #fbset -pixclock 50000 [set the length of one pixel (in picoseconds). Note that the frame buffer device may only support some pixel lengths ]

#fbset

mode «640x480-47»

# D: 20.000 MHz, H: 24.038 kHz, V: 47.227 Hz

geometry 640 480 640 32767 8

timings 50000 80 56 25 1 56 3

accel true

rgba 8/0,8/0,8/0,0/0

endmode

qazx
()
Ответ на: комментарий от anonymous

Частоту уменьшил, не помогло. i2c интерфейса нет, есть только LVDS и PWM управление подсветкой.

Тебе надо как-то сообщить драйверу полные параметры VESA 640х480

Понять бы еще какие и куда их сообщить. Меня напрягает цифра 32767 в виртуальном разрешении по вертикали. Вполне возможно, что сам экран и работает, а чернота на дисплее объясняется отсутствием изображения (в том числе и консоли) на области виртуальной памяти. Пробовал играть с отступами, но результат нулевой.

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

Меня напрягает цифра 32767 в виртуальном разрешении по вертикали. Вполне возможно, что сам экран и работает, а чернота на дисплее объясняется отсутствием изображения (в том числе и консоли) на области виртуальной памяти.

я хз сколько вас там, но тот что топик создал написал

Сейчас добился такого состояния что на VGA дисплее все видно и все ОК. LVDS дисплей тухнет и нечего не видно.

если fb один - то оба енкодера и VGA и LVDS показывают одну и ту же часть видеопамяти, так что явно что-то не так с настройками. Я уже предлагал - посмотри через fbset тогда, если mode в sysfs нет, парметры до запуска приложения Qt и после запуска.

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

fb один (/dev/fb0). Пробовали подключать одновременно два дисплея: один по VGA, второй по LVDS интерфейсу. Сам запуск приложения Qt на эти настройки никак не влияет. Но Qt не запускается, пока хоть один раз не были изменены параметры с помощью fbset. А при любом изменении настроек сбрасывается экран по LVDS, хотя VGA по-прежнему показывает.Почему так, пока остается непонятным.

Подробно очередность действий описывал в запуск QT приложений без графической оболочки на LVDS дисплее (комментарий)

qazx
()
Ответ на: комментарий от anonymous

Привожу целиком кусок лога из консоли.

#fbset

mode «800x600-60»

# D: 40.000 MHz, H: 37.879 kHz, V: 60.317 Hz

geometry 800 600 800 32767 8

timings 25000 88 40 23 1 128 4

accel true

rgba 8/0,8/0,8/0,0/0

endmode

#/usr/HelloWorld -qws

QLinuxFbScreen::connect: Invalid argument

Error: failed to map framebuffer device to memory.

: driver cannot connect

Aborted

#fbset -g 800 600 800 32766 8
#fbset

mode «800x600-60»

# D: 40.000 MHz, H: 37.879 kHz, V: 60.317 Hz

geometry 800 600 800 32767 8

timings 25000 88 40 23 1 128 4

accel true

rgba 8/0,8/0,8/0,0/0

endmode

#/usr/HelloWorld -qws

Экран LVDS не показывает ничего, VGA работает. Причем видно, что даже команда на изменение параметров их не изменила. А вот приложение почему-то запустилось.

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

BIOS есть у этой платы ? посмотри в настройках - можно ли там указать параметры LCD панели, не у всех панелей бывает DDC и там должно быть это предусмотрено.

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

Уже смотрел, разрешения экрана там нигде найдено не было. Производитель отправил для 640х480 отдельную прошивку биоса. Как раз с ней работаю сейчас. Загрузочный экран нормально, работает похоже именно в этом разрешении (со стандартной прошивкой изображение было обрезано по горизонтали и дублировано по вертикали).

А вот драйвер при запуске модуля все равно пишет, что Default mode is 800x600x8 (60Hz)

qazx
()

Проблема решена отказом от драйвера SiS/XGI, перекомпиляцией файловой системы с поддержкой VESA VGA graphics support (vesafb) и запуском ядра с параметрами video=vesafb vga=0x312

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