完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
嵌入式平台多屏显示是比较常见的功能,在NXP iMX6上面,由于使用了基于fbdev/X11的显示接口驱动和显示服务,可以比较方便的通过framebuffer方式来实现多屏显示,Qt也提供了想eglfs或者linuxfs这样的组件来对接。而基于NXP新的iMX8平台,由于使用了DRM/KMS显示接口驱动和Wayland显示服务,多屏显示的实现思路可能有如下几种,而本文就演示基于Qtwayland 组件来实现双屏独立显示。
./ 通过底层IPU驱动来实现,主要可以比较灵活的实现如clone模式等,但难度比较大,需要对iMX8 底层IPU驱动有比较深入的了解 ./ 如果是通过iMX8 双通道LVDS,连接两个单通道的LVDS屏幕,可以通过device tree ldb节点”dual-mode”来实现clone显示 ./ iMX8默认的wayland/Weston compositor默认支持多屏扩展模式显示,但是9.0以下版本无法对应用程序窗口进行定位,9.0以后引入了Kiosk shell支持,则可以通过应用程序窗口定位到不同屏幕实现多屏独立显示的效果 ./ 使用Qtwayland组件构建wayland compositor,可以方便的实现多屏独立显示,在多屏都是同样分辨率前提下,也可以实现clone显示 |
|
|
|
准备
a) Apalis iMX8QM 4GB WB IT ARM核心版配合Ioxra 载板,连接调试串口UART1(载板X22)到开发主机方便调试。 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测试 |
|
|
|
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语言开发定制化的wayland compositor,详细说明请见这里,也提供了很多sample project供参考 b). 本文测试所使用的qtwayland compositor来自于Toradex Europe FAE Stefan Eichenberger,源代码请参考这里,这是一个用于双屏显示的qtwayland compositor c). 参考这里说明使用上面章节 3.a编译出的SDK文件配置qtcreator交叉编译环境,下载dual-screen qtwayland compositor代码后进行编译,生成dual-screen可执行二进制文件上传到Apalis iMX8系统中 d). 使用编译好的dual-screen qtwayland compositor 替换系统默认的weston compositor ./ 创建dual-screen.sh执行脚本文件 ------------------------------- # 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" ];then sed -i "8 s/event.*/$ts0/"/,/g" /etc/kms.conf fi if [ "$ts_lvds" ];then sed -i "13 s/event.*/$ts1/"/,/g" /etc/kms.conf fi # execute qtwayland compositor /usr/bin/dual-screen & ------------------------------- ./ 创建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 Environmen Environmen Environmen Environmen Environmen StandardError=journal PermissionsStartOnly=true IgnoreSIGPIPE=no ExecStart=/usr/bin/dual-screen.sh # 通过 /etc/kms.conf 文件来配置KMS显示接口设备,”touchDevice” 参数对应 3.c章节中测试的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 } ] } ------------------------------- ./ 创建新的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 KERNEL ATTRS{name} , SYMLINK SUBSYSTEM KERNEL ATTRS{name} , SYMLINKadd", SUBSYSTEM, KERNEL, TAG, ENV{SYSTEMD_WANTS} ACTION, SUBSYSTEM, KERNEL, TAG, ENV{SYSTEMD_WANTS} ------------------------------- e). 测试qtwayland compositor ------------------------------- # disable default wayland qt demo app systemd service $ systemctl disable wayland-app-launch $ reboot ------------------------------- 重启后,可以看到下面双屏显示结果,qtwayland compositor启动成功 |
|
|
|
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). 实际运行效果如下 |
|
|
|
Qt应用测试
a). 分别使用一个Qt Widget应用和一个Qt Quick应用进行测试 ./ Qt Widget应用 – 读取系统时间和cpu温度,同时调用sqlite数据库进行保存的应用,详细说明请参考这里,将编译好的可执行binary “qt-sqlite” 上传到Apalis iMX8 ./ Qt Quick 应用 – 调用qtmultimedia组件播放视频以及摄像头,详细说明请参考这里,将编译好的可执行binary “videotest” 上传到Apalis iMX8 b). 创建应用启动脚本 ------------------------------- $ 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). 创建开机自启动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 Environmen ExecStart=/usr/bin/qtwayland-app-launch.sh RestartSec=1 [Install] WantedBy=multi-user.target ------------------------------- d). enable service 并测试 ------------------------------- $ systemctl enable qtwayland-app-launch $ reboot ------------------------------- e). 重启后效果如下,两个屏幕的触摸都可以分别正常使用 |
|
|
|
只有小组成员才能发言,加入小组>>
722 浏览 0 评论
1123 浏览 1 评论
2505 浏览 5 评论
2840 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2685 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
664浏览 9评论
679浏览 7评论
682浏览 5评论
666浏览 5评论
imx6dl芯片与imx6q芯片互换启动无反应请问是什么问题呢
287浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-1 00:29 , Processed in 1.106273 second(s), Total 87, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号