NXP iMX8基于Qtwayland配置雙屏顯示

By Toradex秦海

1).?簡介

嵌入式平臺多屏顯示是比較常見的功能赴捞,在NXP iMX6上面,由于使用了基于fbdev/X11的顯示接口驅動和顯示服務,可以比較方便的通過framebuffer方式來實現多屏顯示蒜田,Qt也提供了想eglfs或者linuxfs這樣的組件來對接。而基于NXP新的iMX8平臺选泻,由于使用了DRM/KMS顯示接口驅動和Wayland顯示服務冲粤,多屏顯示的實現思路可能有如下幾種,而本文就演示基于Qtwayland?組件來實現雙屏獨立顯示页眯。

./?通過底層IPU驅動來實現梯捕,主要可以比較靈活的實現如clone模式等,但難度比較大窝撵,需要對iMX8?底層IPU驅動有比較深入的了解

./?如果是通過iMX8?雙通道LVDS傀顾,連接兩個單通道的LVDS屏幕,可以通過device tree ldb節(jié)點”dual-mode”來實現clone顯示

./ iMX8默認的wayland/Weston compositor默認支持多屏擴展模式顯示忿族,但是9.0以下版本無法對應用程序窗口進行定位锣笨,9.0以后引入了Kiosk shell支持,則可以通過應用程序窗口定位到不同屏幕實現多屏獨立顯示的效果

./?使用Qtwayland組件構建wayland compositor道批,可以方便的實現多屏獨立顯示错英,在多屏都是同樣分辨率前提下,也可以實現clone顯示


本文所使用的ARM嵌入式平臺來自于Toradex?基于NXP最新的iMX8 SoC(基于Cortex-A72+A53和Coretex-M4架構)的ARM計算機模塊Apalis iMX8QM 4GB WB IT隆豹。



2).?準備

a).?Apalis iMX8QM?4GB WB IT ARM核心版配合Ioxra?載板椭岩,連接調試串口UART1(載板X22)到開發(fā)主機方便調試。


b). Apalis iMX8支持HDMI和LVDS顯示接口璃赡,分別連接如下兩個屏幕

./ 13.3 inch HDMI panel?顯示屏判哥,分辨率1920x1080,支持USB接口電容式觸摸碉考,將觸摸接口連接到Ixora?載板USB接口

./ 10.1 inch?LVDS?顯示屏塌计,分辨率1280x800,支持I2C接口電容式觸摸侯谁,將觸摸接口連接到Ixora載板X24連接器


c). USB UVC標準攝像頭連接到Ixora載板用于Gstreamer測試



3). Apalis iMX8 Ycoto Linux?編譯部署以及配置

a). Apalis iMX8 Ycoto Linux?通過Ycoto/Openembedded?框架編譯锌仅,具體的配置方法請參考這里,參考如下修改后編譯Reference-Multimedia image鏡像

-------------------------------

# local.conf墙贱,增加eglfs和kms支持

+ PACKAGECONFIG_append_pn-qtbase = " sql-sqlite eglfs kms"

+ PACKAGECONFIG_append_pn-qtmultimedia = " gstreamer"

+ ACCEPT_FSL_EULA = "1"


# layers/meta-toradex-demos/recipes-images/images/tdx-reference-multimedia-image.bb热芹,增加SDK populate

+ inherit populate_sdk populate_sdk_qt5


# compile Reference-Multimedia image

$ bitbake bitbake tdx-reference-multimedia-image


# compile SDK

bitbake tdx-reference-multimedia-image -c populate_sdk

-------------------------------


b). Ycoto Linux image部署

參考這里通過Toradex Easy installer將上面編譯好的image更新部署到模塊,版本為目前最新的Ycoto Linux V5.1


c).?顯示配置

./ HDMI默認即可正常顯示惨撇,如果有顯示器EDID讀取問題不能成功顯示伊脓,可以通過下面方法通過軟件firmware方式手動加載EDID,更多關于顯示的配置請參考這里

-------------------------------

# cp EDID binary file to rootfs

$ mkdir /lib/firmware/edid

$ cp 1920x1080.bin /lib/firmware/edid


# set uboot kernel command line

# setenv defargs ‘pci=nomsi drm.edid_firmware=HDMI-A-1:edid/1920x1080.bin’

# saveenv && reset

-------------------------------


./ LVDS?顯示魁衙,Ycoto Linux V5.1默認device tree下LVDS是disable的报腔,需要通過下面方式加載對應device tree overlay來enable株搔,device tree overlay的更多說明請參考這里

-------------------------------

# overlay files path

root@apalis-imx8:~# ls /media/mmcblk0p1/overlays/

apalis-imx8_atmel-mxt_overlay.dtbo????????? apalis-imx8x_parallel-rgb_overlay.dtbo

apalis-imx8_lvds_overlay.dtbo?????????????? display-edt5.7_overlay.dtbo

apalis-imx8x_ad7879_overlay.dtbo??????????? display-edt7_overlay.dtbo

apalis-imx8x_atmel-mxt_overlay.dtbo???????? display-fullhd_overlay.dtbo

apalis-imx8x_display-lt161010_overlay.dtbo? display-lt161010_overlay.dtbo

apalis-imx8x_display-lt170410_overlay.dtbo? display-lt170410_overlay.dtbo


# add lvds and i2c touch(atmel) related overlay file to /media/mmcblk0p1/overlays.txt

fdt_overlays=overlays/apalis-imx8_lvds_overlay.dtbo overlays/display-lt170410_overlay.dtbo overlays/apalis-imx8_atmel-mxt_overlay.dtbo

-------------------------------


./?觸摸設備測試,通過”evetst”命令

-------------------------------

# list all devices

root@apalis-imx8:~# evtest

No device specified, trying to scan all of /dev/input/event*

Available devices:

/dev/input/event0:????? sc-powerkey

/dev/input/event1:????? gpio-keys

/dev/input/event2:????? HID 27c0:0818

/dev/input/event3:????? USB 2.0 Camera: HD USB Camera

/dev/input/event4:????? Atmel maXTouch Touchscreen


# from above output

./ event2 is HDMI display USB HID capacitive touch device

./ event4 is LVDS display I2C capacitive touch device

-------------------------------



4). Qtwayland compositor?編譯部署

a). Qt Qtwayland組件可以非常方便的使用QML語言開發(fā)定制化的wayland compositor榄笙,詳細說明請見這里邪狞,也提供了很多sample project供參考


b).?本文測試所使用的qtwayland compositor來自于Toradex Europe FAE Stefan Eichenberger,源代碼請參考這里茅撞,這是一個用于雙屏顯示的qtwayland compositor


c).?參考這里說明使用上面章節(jié)?3.a編譯出的SDK文件配置qtcreator交叉編譯環(huán)境,下載dual-screen qtwayland compositor代碼后進行編譯巨朦,生成dual-screen可執(zhí)行二進制文件上傳到Apalis iMX8系統中


d).?使用編譯好的dual-screen qtwayland compositor?替換系統默認的weston compositor

./?創(chuàng)建dual-screen.sh執(zhí)行腳本文件

-------------------------------

# copy dual-screen binary to /usr/bin

$ cp dual-screen /usr/bin/


# create dual-screen.sh script, detailed content in below

$ vi /usr/bin/dual-screen.sh


# add executable permission

$ chmod +x dual-screen.sh

-------------------------------


./ dual-screen.sh –?由于系統包含三個input設備米丘,兩個觸摸設備和一個USB攝像頭,在啟動過程中糊啡,其對應的event?號碼可能會變化拄查,因此腳本前面先對?“kms.conf”?文件里面的設置和系統啟動后的設備event進行比對,如果一致則直接啟動compositor棚蓄,如不一致則需要先修改?”kms.conf”?文件后再啟動compositor堕扶。這里使用的ts0/ts1 symbol?鏈接則是在下面udev rule文件中定義的。

-------------------------------

# get system touch device event number


while [ ! -e /dev/input/ts0 ]

do

sleep 0.1

done

ts0=$(readlink /dev/input/ts0)


while [ ! -e /dev/input/ts1 ]

do

sleep 0.1

done

ts1=$(readlink /dev/input/ts1)


# compare with kms.conf settings

while [ ! -e /etc/kms.conf ]

do

sleep 0.1

done

ts_hdmi=$(sed -n 8p /etc/kms.conf|cut -d '"' -f4|cut -d '/' -f4)

ts_lvds=$(sed -n 13p /etc/kms.conf|cut -d '"' -f4|cut -d '/' -f4)


# modify kms.conf if seetings is not consistent with system event

if [ "$ts_hdmi"!="$ts0" ];then

sed -i "8 s/event.*/$ts0\"\,/g" /etc/kms.conf

fi


if [ "$ts_lvds"!="$ts1" ];then

sed -i "13 s/event.*/$ts1\"\,/g" /etc/kms.conf

fi


# execute qtwayland compositor

/usr/bin/dual-screen &

-------------------------------


./?創(chuàng)建systemd service?文件

-------------------------------

# /lib/systemd/system/qtwayland@.service

[Unit]

Description=Qt Wayland Compositor???

RequiresMountsFor=/run

Conflicts=plymouth-quit.service

After=systemd-user-sessions.service plymouth-quit-wait.service


[Service]

User=%i

PAMName=login

Environment="QT_QPA_EGLFS_KMS_CONFIG=/etc/kms.conf"

Environment="QT_QPA_EGLFS_INTEGRATION=eglfs_kms"

Environment="QT_QPA_PLATFORM=eglfs"

Environment="QT_QPA_EGLFS_KMS_ATOMIC=1"

Environment="QT_QPA_EGLFS_NO_LIBINPUT=1"

StandardError=journal

PermissionsStartOnly=true

IgnoreSIGPIPE=no


ExecStart=/usr/bin/dual-screen.sh


#?通過?/etc/kms.conf?文件來配置KMS顯示接口設備梭依,”touchDevice”?參數對應?3.c章節(jié)中測試的event稍算,更多關于Qt eglfs DRM/KMS的配置說明請參考這里

$ vi /etc/kms.conf

{

? "device": "/dev/dri/card0",

? "hwcursor": true,

? "pbuffers": false,

? "outputs": [

????? { "name": "HDMI1",

??????? "mode": "1920x1080",

??????? "touchDevice": "/dev/input/event2",

??????? "virtualIndex": 0, "primary": true

????? },

????? { "name": "LVDS1",

??????? "mode": "1280x800",

??????? "touchDevice": "/dev/input/event4",

??????? "virtualIndex": 1

????? }

? ]

}

-------------------------------

./?創(chuàng)建新的udev rule替換系統默認的weston udev rule

-------------------------------

# remove default weston udev rule

$ rm /etc/udev/rules.d/71-weston-drm.rules

# add qtwayland rule

$ vi /etc/udev/rules.d/71-qtwayland-drm.rules

# connect HDMI HID touchscreen and LVDS I2C touchscreen with fix symlink

SUBSYSTEM=="input" KERNEL=="event*" ATTRS{name} =="HID 27c0:0818",?????? SYMLINK+="input/ts0"

SUBSYSTEM=="input" KERNEL=="event*" ATTRS{name} =="Atmel maXTouch Touchscreen",?????? SYMLINK+="input/ts1

# start qtwayland compositor

ACTION=="add", SUBSYSTEM=="graphics", KERNEL=="fb0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="qtwayland@root.service"

ACTION=="add", SUBSYSTEM=="drm", KERNEL=="card0", TAG+="systemd", ENV{SYSTEMD_WANTS}+="qtwayland@root.service"

-------------------------------


e).?測試qtwayland compositor

-------------------------------

# disable default wayland qt demo app systemd service

$ systemctl disable wayland-app-launch

$ reboot

-------------------------------


重啟后役拴,可以看到下面雙屏顯示結果糊探,qtwayland compositor啟動成功




5). Gstreamer測試

a).?分別運行兩個gstreamer pipeline,然后qtwayland compositor會將第一個運行的pipeline顯示在HDMI顯示器上面河闰,第二個運行的顯示在LVDS顯示器上面


b). Gstreamer pipeline 1 - USB攝像頭播放科平,關于gstreamer使用的更多說明請參考這里

-------------------------------

$ gst-launch-1.0 v4l2src device=/dev/video2 ! 'image/jpeg,width=1920,height=1080,frame

rate=30/1' ! jpegdec ! videoconvert ! waylandsink fullscreen=1 sync=false &

-------------------------------


c). Gstreamer pipeline 2 – gstreamer?測試pipeline

-------------------------------

$ gst-launch-1.0 videotestsrc ! waylandsink fullscreen=1

-------------------------------


d).?實際運行效果如下



6). Qt應用測試

a).?分別使用一個Qt Widget應用和一個Qt Quick應用進行測試

./ Qt Widget應用?–?讀取系統時間和CPU溫度,同時調用sqlite數據庫進行保存的應用姜性,詳細說明請參考這里瞪慧,將編譯好的可執(zhí)行binary “qt-sqlite”?上傳到Apalis iMX8

./ Qt Quick?應用?–?調用qtmultimedia組件播放視頻以及攝像頭,詳細說明請參考這里部念,將編譯好的可執(zhí)行binary “videotest”?上傳到Apalis iMX8


b).?創(chuàng)建應用啟動腳本

-------------------------------

$ vi /usr/bin/qtwayland-app-launch.sh

#!/bin/sh

if test -z "$XDG_RUNTIME_DIR"; then

??? export XDG_RUNTIME_DIR=/run/user/`id -u`

??? if ! test -d "$XDG_RUNTIME_DIR"; then

??????? mkdir --parents $XDG_RUNTIME_DIR

??????? chmod 0700 $XDG_RUNTIME_DIR

??? fi

fi


# wait for qtwayland

while [ ! -e? $XDG_RUNTIME_DIR/wayland-0 ] ; do sleep 0.1; done

sleep 1


/home/root/videotest -url file:///home/root/ready-player-one-trailer-2_h720p.mov &

sleep 1

/home/root/qt-sqlite &

-------------------------------


c).?創(chuàng)建開機自啟動systemd service文件

-------------------------------

$ vi /lib/systemd/system/qtwayland-app-launch.service

[Unit]

Description=Start a Qt wayland application

After=qtwayland@root.service

Requires=qtwayland@root.service


[Service]

Restart=on-failure

Type=forking

Environment="QT_QPA_PLATFORM=wayland"

ExecStart=/usr/bin/qtwayland-app-launch.sh

RestartSec=1


[Install]

WantedBy=multi-user.target

-------------------------------


d). enable service?并測試

-------------------------------

$ systemctl enable qtwayland-app-launch

$ reboot

-------------------------------


e).?重啟后效果如下弃酌,兩個屏幕的觸摸都可以分別正常使用



5).?總結

本文在iMX8嵌入式平臺下使用Qtwayland工具測試了HDMI/LVDS雙屏獨立顯示功能。



參考文檔

https://developer.toradex.cn/knowledge-base/display-output-resolution-and-timings-linux

https://doc.qt.io/qt-5/embedded-linux.html#embedded-eglfs

https://github.com/eichenberger/qt-dual-screen-compositor?

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末印机,一起剝皮案震驚了整個濱河市矢腻,隨后出現的幾起案子,更是在濱河造成了極大的恐慌射赛,老刑警劉巖多柑,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異楣责,居然都是意外死亡竣灌,警方通過查閱死者的電腦和手機聂沙,發(fā)現死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來初嘹,“玉大人及汉,你說我怎么就攤上這事⊥头常” “怎么了坷随?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長驻龟。 經常有香客問我温眉,道長,這世上最難降的妖魔是什么翁狐? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任类溢,我火速辦了婚禮,結果婚禮上露懒,老公的妹妹穿的比我還像新娘闯冷。我一直安慰自己,他們只是感情好懈词,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布蛇耀。 她就那樣靜靜地躺著,像睡著了一般钦睡。 火紅的嫁衣襯著肌膚如雪蒂窒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天荞怒,我揣著相機與錄音洒琢,去河邊找鬼。 笑死褐桌,一個胖子當著我的面吹牛衰抑,可吹牛的內容都是我干的。 我是一名探鬼主播荧嵌,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼呛踊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了啦撮?” 一聲冷哼從身側響起谭网,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赃春,沒想到半個月后愉择,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年锥涕,在試婚紗的時候發(fā)現自己被綠了衷戈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡层坠,死狀恐怖殖妇,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情破花,我是刑警寧澤谦趣,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站座每,受9級特大地震影響蔚润,放射性物質發(fā)生泄漏。R本人自食惡果不足惜尺栖,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烦租。 院中可真熱鬧延赌,春花似錦、人聲如沸叉橱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窃祝。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間馆衔,已是汗流浹背贡歧。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留探膊,地道東北人杠愧。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像逞壁,于是被迫代替她去往敵國和親流济。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內容