跳转到主要内容

【工程师分享】在MPSoC ZCU106单板的HDMI-Tx上基于eglfs_kms的运行QT应用程序

作者:HankFu,本文转载自:<span id="profileBt"><a href="https://www.cnblogs.com/hankfu/p/15294077.html">博客园</a></span&gt;

按照<a href="https://www.cnblogs.com/hankfu/p/14131732.html&quot; target="_blank">在MPSoC上运行基于eglfs_kms的QT应用程序</a>, 可以在MPSoC ZCU106单板的DP上基于eglfs_kms的运行QT应用程序。按照<a href="https://www.cnblogs.com/hankfu/p/13589203.html&quot; target="_blank">在VCUTRD 2020.1 里设置HDMI-TX显示QT界面</a>, 可以在MPSoC ZCU106单板的HDMI-Tx上基于X11的运行QT应用程序。在HDMI-Tx上,基于eglfs_kms的运行QT应用程序,遇到了下列两个错误。

错误1
<pre>QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/var/volatile/tmp/runtime-root'
Setting framebuffer size is only available with DRM atomic API
Attribute Qt::AA_ShareOpenGLContexts must be set before QCoreApplication is created.
Could not queue DRM page flip on screen HDMI1 (Invalid argument)
Could not queue DRM page flip on screen HDMI1 (Invalid argument)</pre>

错误2
<pre>QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/var/volatile/tmp/runtime-root'
Framebuffer size format is invalid.
Attribute Qt::AA_ShareOpenGLContexts must be set before QCoreApplication is created.
Failed to commit atomic request (code=-22)</pre>

基于在VCUTRD 2020.1 里设置HDMI-TX显示QT界面做更改后,执行下列命令,可以在MPSoC ZCU106单板的DP上基于eglfs_kms的运行QT应用程序。其中的$display_device和$connector_id,需要根据单板更改。display_device一般是类似a0070000.v_mix的格式,可以通过“dmesg | grep v_mix”查到。$connector_id,可以在“modetest -D $display_device”的输出里查找, 也可以根据检查Linux DRM显示设备ID的脚本 得到。
<pre>update-alternatives --install /usr/lib/libMali.so.9.0 libmali /usr/lib/wayland/libMali.so.9.0 90

echo Y &gt; /sys/module/xlnx_mixer/parameters/mixer_primary_enable

modetest -D $display_device -s $connector_id:1920x1080-60@AR24

killall Xorg
cat /run/kms.conf

export QT_QPA_PLATFORM="eglfs"
export QT_QPA_EGLFS_KMS_ATOMIC=1
export QT_QPA_EGLFS_INTEGRATION="eglfs_kms"
export QT_QPA_EGLFS_KMS_CONFIG="/run/kms.conf"
export QT_QPA_EGLFS_DEBUG="1"
export QT_QPA_EGLFS_FORCE888=1

# chmod +x /run/qt5everywheredemo-1.0/QtDemo
# /run/qt5everywheredemo-1.0/QtDemo

ls -l /usr/share/examples/opengl/
/usr/share/examples/opengl/cube/cube
/usr/share/examples/opengl/textures/textures</pre>

如果运行失败,有时执行“ctrl+c”还不能退出QT应用程序cube和textures,还需要执行命令“kill -9 ”, 或者“killall -9 cube”,才能让其退出。

上述的/run/kms.conf内容如下:
<pre>{
"device": "/dev/dri/card1",
"hwcursor": false,
"pbuffers": true,
"outputs": [
{
"name": "HDMI",
"mode": "1920x1080"
}
]
}</pre>