"); //-->
By Toradex秦海
1). 简介
在前述文章中,我们介绍了如何基于 Weston Composito 实现多屏幕分别显示不同的应用,而进一步延申出的一个应用场景,就是多屏幕之一的 HDMI 屏幕需要进行热插拔,而在热插拔的同时其对应的显示应用也同时启动或者停止,以便不影响其他屏幕的显示。本文就基于前述文章同样的 NXP i.MX8MP 平台来测试如何实现这个功能场景。
本文所演示的平台来自于 Toradex Verdin i.MX8MP 嵌入式平台。
2. 准备
a). Verdin i.MX8MP ARM核心版配合Dahlia 载板,并连接调试串口用于测试。
b). Dahlia 载板分别由 DSI-HDMI 转接卡和 native HDMI 两个接口连接两台 HDMI 显示器以便于进行多屏显示测试。
3). 部署流程
a). 为了实现对于 native HDMI 接口连接的 HDMI-2 显示器热插拔动作的响应,需要通过 udev rule来捕获相应触发模块并进行动作。
./ 首先通过执行如下命令,然后操作硬件热插拔,获取被触发的 udev “KERNEL” 组件是 “card1”,”SUBSYSTEM” 是 “drm”,”Action” 是 “change”
---------------------------------------
root@verdin-imx8mp-06849028:~# udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[89.184407] change /devices/platform/display-subsystem/drm/card1 (drm)
UDEV [89.195674] change /devices/platform/display-subsystem/drm/card1 (drm)
KERNEL[98.001197] change /devices/platform/display-subsystem/drm/card1 (drm)
UDEV [98.012452] change /devices/platform/display-subsystem/drm/card1 (drm)
---------------------------------------
./ 基于上述信息生成如下 udev rules 文件 - /etc/udev/rules.d/99-hdmi-hotplug.rules,这样无论当 HDMI 显示器连接还是断开的时候都会触发这个规则,并执行 hdmi-hotplug.sh 脚本代码。
---------------------------------------
# When HDMI is attached or unattached
ACTION=="change", KERNEL=="card1", SUBSYSTEM=="drm", RUN+="/home/root/hdmi-hotplug.sh"
---------------------------------------
b). hdmi-hotplug.sh 脚本代码实现
./ native HDMI 对应系统 “/sys/class/drm/card1-HDMI-A-2” 设备,设备节点中有 “status” 项目对应当前 HDMI hotplug 状态
---------------------------------------
### HDMI attached ###
root@verdin-imx8mp-06849028:~# cat /sys/class/drm/card1-HDMI-A-2/status
connected
### HDMI unattached ###
root@verdin-imx8mp-06849028:~# cat /sys/class/drm/card1-HDMI-A-2/status
disconnected
---------------------------------------
./ 基于上述判断生成 hdmi-hotplug.sh 脚本来启动或者停止 smarthome Qt 应用(可以见章节1 提到的前述双屏显示文章)。在这里需要通过 systemd service 来启动应用,不能直接执行 smarthome 应用,否则在 hdmi-hotplug.sh 退出后应用也会同时退出。
---------------------------------------
#!/bin/bash
tty=/dev/ttymxc2
hdmistatus=$(cat /sys/class/drm/card1-HDMI-A-2/status)
if [ "$hdmistatus" = "connected" ]; then
echo "HDMI connected..." > $tty
systemctl start smarthome-app-launch
else
echo "HDMI disconnected..." > $tty
systemctl stop smarthome-app-launch
fi
---------------------------------------
./ 赋予 hdmi-hotplug.sh 脚本可执行属性
---------------------------------------
root@verdin-imx8mp-06849028:~# chmod +x hdmi-hotplug.sh
---------------------------------------
c). 部署 smarthome-app-launch service 文件
./ smarthome-app-launch service 文件 - /lib/systemd/system/smarthome-app-launch.service
---------------------------------------
[Unit]
Description=Start a wayland application
After=weston.service
Requires=weston.service
[Service]
Type=simple
User=root
PAMName=login
Environment=WAYLAND_DISPLAY=/run/wayland-0
Environment=QT_QPA_PLATFORM=wayland-egl
WorkingDirectory=/usr/share/qtsmarthome-1.0/
ExecStart=/usr/share/qtsmarthome-1.0/smarthome
Restart=on-failure
RestartSec=1
[Install]
WantedBy=graphical.target
---------------------------------------
./ 更新 systemd service 文件
---------------------------------------
root@verdin-imx8mp-06849028:~# systemctl daemon-reload
---------------------------------------
d). 参考章节1 前述双屏显示文章同样内容,修改 /etc/xdg/weston/weston.ini 文件。
---------------------------------------
--- a/etc/xdg/weston/weston.ini
+++ b/etc/xdg/weston/weston.ini
@@ -4,6 +4,7 @@
idle-time=0
xwayland=true
#enable-overlay-view=1
+shell=kiosk-shell.so
[shell]
@@ -12,13 +13,16 @@
touchscreen_calibrator=true
calibration_helper=/usr/bin/toradex-save-touchscreen-calibration
-#[output]
-#name=HDMI-A-1
-#mode=1920x1080@60
+[output]
+name=HDMI-A-1
+app-ids=Qt5_CinematicExperience
+mode=1920x1080@60
#transform=rotate-90
-#[output]
-#name=HDMI-A-2
+[output]
+name=HDMI-A-2
+app-ids=smarthome
+mode=1920x1080
#mode=off
# WIDTHxHEIGHT Resolution size width and height in pixels
# off Disables the output
---------------------------------------
e). 另外,wayland-app-launch.service 是 Toradex Yocto Multimedia BSP 默认使能用于 Qt5_CinematicExperience 应用启动的 systemd service 文件,如果之前关闭了,可以通过下面命令使能。
---------------------------------------
root@verdin-imx8mp-06849028:~# systemctl enable wayland-app-launch
---------------------------------------
f). 最后所有上述修改完成后重新启动。
4). 测试
a). 重新启动后,当两个 HDMI 显示器都连接,可以通过屏幕观察以及如下进程查询确认两个 Qt 应用都分别显示在相应的显示器上面。
-------------------------------
root@verdin-imx8mp-06849028:~# ps -aux |grep Qt5_CinematicExperience
root 522 38.3 3.8 1085948 153664 ? Ssl 06:20 0:41 /usr/share/cinematicexperienc
e-1.0/Qt5_CinematicExperience --fullscreen
root 569 0.0 0.0 2944 1280 ttymxc2 S+ 06:22 0:00 grep Qt5_CinematicExperience
root@verdin-imx8mp-06849028:~# ps -aux |grep smarthome
root 520 31.8 1.9 1007248 77160 ? Ssl 06:20 0:37 /usr/share/qtsmarthome-1.0/sm
arthome
root 571 0.0 0.0 2944 1152 ttymxc2 S+ 06:22 0:00 grep smarthome
-------------------------------
b). 当将 native HDMI 连接的 HDMI-2 屏幕断开后,对应的 smarthome 应用也同时退出
-------------------------------
root@verdin-imx8mp-06849028:~# HDMI disconnected...
root@verdin-imx8mp-06849028:~# ps -aux |grep smarthome
root 645 0.0 0.0 2944 1152 ttymxc2 S+ 06:28 0:00 grep smarthome
-------------------------------
c). 当native HDMI 连接的 HDMI-2 屏幕重新连接后,对应的 smarthome 应用也同时启动
-------------------------------
root@verdin-imx8mp-06849028:~# HDMI connected...
root@verdin-imx8mp-06849028:~# ps -aux |grep smarthome
root 650 72.3 1.8 1007248 74052 ? Ssl 06:28 0:04 /usr/share/qtsmarthome-1.0/sm
arthome
root 662 0.0 0.0 2944 1280 ttymxc2 S+ 06:28 0:00 grep smarthome
-------------------------------
5). 总结
本文基于 NXP i.MX8MP 处理器平台测试了 Yocto Linux 下HDMI 显示器热插拔情况下对应显示应用同步启动和停止。
参考文档
https://blog.csdn.net/qq_17292655/article/details/134670878
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。