25 Star 88 Fork 258

openEuler/yocto-meta-openeuler

嵌入式图形栈引入流程进展和已知问题

已完成
版本
创建于  
2022-08-17 17:46

嵌入式图形栈大致架构

嵌入式图形栈

相对于上图传统的桌面图形栈, 嵌入式图形栈必然会受到各种嵌入式软硬件功能的限制, 部分核心图形软件包的精简定制是一方面,老旧且笨重的图形软件包的舍弃是另一方面.

具体到树莓派 4B 而言, 其 GPU VideoCore VI 支持 OpenGL 2.1, OpenGL ES 3.1 以及最近才支持的 Vulkan 1.1. 目前在 yocto-meta-openeuler 上利用 Mesa 21.1.3 已经通过 kmscube 验证了 OpenGL 正常功能.

从底层图形显示驱动而言, DRM/KMS 是目前主流的选择, 相比老旧的, 鲜有人维护的 linux framebuffer, 因其 API 更现代, 操作模式精细, 多屏幕显示支持友好等特性, 在桌面和嵌入式上都广泛使用. 大致的详细介绍可参见 ST wiki

上层的图形栈选用 Qt5 + Wayland 的组合, 避免了大量的传统 x11 软件包, 软件依赖相对清晰, 同时兼具拓展性, 今后可通过已有的 Qt 应用和桌面环境, 比如 LXQt 上进行特性拓展和持续优化.

Wayland 狭义上讲只是一种显示协议, 可以不依赖于任何具体的 CPU/GPU 架构, 但具体的显示功能是由 Wayland Compositor 的实现而定, 比如官方的参考实现 Weston, GNOME 的 Mutter, KDE 的 Kwin, Qt 的 Qt Wayland Compositor.

DRM 驱动

树莓派4B GPU VideoCore 6 的 DRM 驱动目前是部分闭源的,有些需要依赖于树莓派闭源固件:Github rpi firmware
目前最新的 openeuler kernel 5.10 与树莓派固件不兼容,导致没有 /dev/dri/card*,此问题发生频繁,比如 Ubuntu 也发生过。详细问题可参见之前的 issue: rpi firmware issue
DRM 驱动未来应该会开源,并推送到 linux 主线,详见 DRM V3D phoronix 在内核设置中 CONFIG_DRM_V3D=m CONFIG_DRM_VC4=m 是默认的。在 /boot/config.txt 中,添加了 dtoverlay=vc4-fkms-v3d, 并且在 /boot/overlays 有一些 dtb 文件是必要的。

需要的图形软件包编译流程以及已知问题

Qtbase

需要在 bblayer.conf 里加入 openembedded coremeta-qt5
然后添加默认存在的 Python 依赖.

vi /usr1/openeuler/src/yocto-meta-openeuler/meta-openeuler/conf/distro/include/openeuler_hosttools.inc
ASSUME_PROVIDED += "python3-native python3-mako-native"

shadow 4.8.1 install 阶段报错

install: cannot stat '/usr1/build/tmp/work/cortexa72-openeuler-linux/shadow/4.9-r0/login.defs': No such file or directory

可以用 touch /usr1/build/tmp/work/cortexa72-openeuler-linux/shadow/4.9-r0/login.defs 临时解决.

libgcc-external do_package 阶段报错

Exception: FileExistsError: [Errno 17] File exists: './../../lib64/gcc/aarch64-openeuler-linux-gnu/10.3.1/crtendS.o' -> '/usr1/build/tmp/work/cortexa72-openeuler-linux/libgcc-external/10.3.1-10.3.1-r0/packages-split/libgcc-external-dev/./../../lib64/gcc/aarch64-openeuler-linux-gnu/10.3.1/crtendS.o'

ERROR: Logfile of failure stored in: /usr1/build/tmp/work/cortexa72-openeuler-linux/libgcc-external/10.3.1-10.3.1-r0/temp/log.do_package.736791
ERROR: Task (/usr1/openeuler/src/yocto-poky/../yocto-meta-openeuler/meta-openeuler/recipes-external/gcc/libgcc-external.bb:do_package) failed with exit code '1'

可以用 rm /usr1/build/tmp/work/cortexa72-openeuler-linux/libgcc-external/10.3.1-10.3.1-r0/packages-split/libgcc-external-dev/./../../lib64/gcc/aarch64-openeuler-linux-gnu/10.3.1/crtendS.o 临时解决.

需要协助解决编译问题的软件包

  • gobject-introspection 在 configure 阶段会报找不到 glib-2.0, 删除 ASSUME_PROVIDED 中 glib-2.0-native 后能找到 glib-2.0, 但 Python.h 找不到, 因为 docker 21.03 的 SDK 里并没有带. 手动从 docker 安装 python3-devel 并拷贝其软件库后, libffi.so.8 找不到, 手动从源码编译 libffi-3.4.2, 把 libffi.so.8 拷贝到 SDK 里后找得到. 然而之后编译错误提示 | /usr1/build/tmp/work/cortexa72-openeuler-linux/gobject-introspection/1.66.1-r0/build/g-ir-scanner-qemuwrapper: line 6: qemu-aarch64: command not found 需要 qemu, 源码编译 qemu 7.0 后, 依然有不明情况的编译错误

  • glib-2.0, 单独编译并没有问题, 但是有软件依然找不到 glib-2.0, 考虑保留编译 glib-2.0-native.

评论 (23)

YanqiXu 创建了版本 3年前
openeuler-ci-bot 添加了
 
sig/sig-Yocto
标签
3年前

主线能验证图形能力吗?

可以通过 kmscube 来验证 OpenGL 和 DRM 的图形功能, 目前正准备引入主线. 目前可以直接用 poky 现有的 libdrm, mesa, kmscube 来实现.

如何在工程里编译出来drm mesa等?我看了下show-repices显示这些库都是skipped

单独编译软件包可以用 bitbake libdrm mesa.
如果想临时加入到 image 可以在 /usr1/build/conf/local.confIMAGE_INSTALL_append =" mesa libdrm kmscube", 注意前引号后有空格.

您好,我目前并不能编译xorgproto,mesa,meson呢。
我在local.conf 中添加了IMAGE_INSTALL_append =" mesa libdrm kmscube"
编译mesa
还是报这个错呢:

输入图片说明

报错中间有句 OECORE_NATIVE_SYSROOT not set; are you in a Yocto SDK environment?
说明这个问题应该是 Yocto SDK 没有被找到或者没有下载。推荐用 docker,启动容器后 SDK 会自动下载在 /opt/buildtools 中,安装 docker 请参考文档 容器环境下的快速构建指导

您好,在docker容器中验证也是出现同样的问题:
输入图片说明
输入图片说明
输入图片说明
临时解决方法:
将/opt/buildtools/nativesdk/sysroots/x86_64-pokysdk-linux/usr/lib/python3.9/site-packages/目录下的meson-0.57.1-py3.9.egg-info 和mesonbuild
复制到build目录下可以解决错误:
/usr1/build/tmp/work/aarch64-openeuler-linux/xorgproto/2021.5-r0/recipe-sysroot-native/usr/lib/python3.9/site-packages
请问,怎样才可以彻底解决这个错误呢?

好的,我联系一下,非常感谢

请问目前已经引入并成功构建了哪些软件包?
能否提供下软件包和版本,我们也在做相似工作。

src-openeuler 上有 mesa 21.3.1, libdrm 2.4.109, xorgproto 2021.05 kmscube 编译运行能通过。
poky 分支 hardknott 3.3.6 上的 mesa, libdrm, xorgproto 的版本也能编译运行,就是需要从外网来下载,速度较慢。

Qt 的版本是 meta-qt5 分支是 hardknott 3.3.6 上所指定的,也能编译运行。

目前 yocto-openembedded master 分支只引入了 libdrm, 因为 Qt 上的跑的应用 demo 还有些问题,正在调试。

bitbake qtbase报错如下,帮看下:
ERROR: pointercal-0.0-r11 do_install: ExecutionError('/usr1/build2/tmp/work/raspberrypi4_64-openeuler-linux/pointercal/0.0-r11/temp/run.do_install.1791694', 1, None, None)
ERROR: Logfile of failure stored in: /usr1/build2/tmp/work/raspberrypi4_64-openeuler-linux/pointercal/0.0-r11/temp/log.do_install.1791694
ERROR: Task (/usr1/openeuler/src/meta-openembedded/meta-oe/recipes-bsp/pointercal/pointercal_0.0.bb:do_install) failed with exit code '1'
ERROR: xkeyboard-config-2.32-r0 do_configure: configure failed
ERROR: xkeyboard-config-2.32-r0 do_configure: ExecutionError('/usr1/build2/tmp/work/cortexa72-openeuler-linux/xkeyboard-config/2.32-r0/temp/run.do_configure.1791394', 1, None, None)
ERROR: Logfile of failure stored in: /usr1/build2/tmp/work/cortexa72-openeuler-linux/xkeyboard-config/2.32-r0/temp/log.do_configure.1791394
ERROR: Task (/usr1/openeuler/src/yocto-poky/meta/recipes-graphics/xorg-lib/xkeyboard-config_2.32.bb:do_configure) failed with exit code '1'

报错是说python3 版本没有大于3.0。这个路径下我看了,不存在;
已经做了ASSUME_PROVIDED += "python3-native python3-mako-native"

有些软件的 Python 检测机制不太兼容 SDK 中的 Python3,临时可以通过 ln -s 来修改

mkdir -p /usr1/build2/tmp/work/cortexa72-openeuler-linux/xkeyboard-config/2.32-r0/recipe-sysroot-native/usr/bin/python3-native/
ln -s /usr/bin/python3 /usr1/build2/tmp/work/cortexa72-openeuler-linux/xkeyboard-config/2.32-r0/recipe-sysroot-native/usr/bin/python3-native/python3

缺少 meson, 在 docker 里用 root 用户 dnf install meson 再切换回 openeuler 用户,需要再执行以下命令

cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
. /opt/buildtools/nativesdk/environment-setup-x86_64-pokysdk-linux
source compile.sh aarch64-std /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le

在 openeuler 用户 用 bitbake -c clean xorgproto 之后再试下 bitbake xorgproto
下面是我的编译 log, 没有什么问题.

[openeuler@debian build]$ bitbake xorgproto
Loading cache: 100% |#############################################################################| Time: 0:00:00
Loaded 2693 entries from dependency cache.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "1.50.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "openeuler-21.03"
TARGET_SYS           = "aarch64-openeuler-linux"
MACHINE              = "raspberrypi4-64"
DISTRO               = "openeuler"
DISTRO_VERSION       = "22.03-LTS"
TUNE_FEATURES        = "aarch64 armv8a crc crypto cortexa72"
TARGET_FPU           = ""
EXTERNAL_TOOLCHAIN   = "/usr1/openeuler/gcc/openeuler_gcc_arm64le"
EXTERNAL_TARGET_SYS  = "aarch64-openeuler-linux-gnu"
GCC_VERSION          = "10.3.1"
OPENEULER_TOOLCHAIN_VERSION = "10.3.1"
meta                 
meta-poky            
meta-yocto-bsp       = "openEuler-22.03-LTS:d0a649349c4b60f85502989175d8d0ec8112fb4f"
meta-openeuler       
meta-raspberrypi     
meta-openeuler-bsp   = "master:c5d028a1bd4ee9b4d7a3f565c2a32e7053afd1a7"
meta-qt5             = "hardknott:43f8f539d40070a70fe89136db89bf5bb1dfe7ed"
meta-oe              = "hardknott:786d3aa313e31a718acc9611ba3adb60573ec458"

Initialising tasks: 100% |########################################################################| Time: 0:00:01
Sstate summary: Wanted 11 Local 11 Network 0 Missed 0 Current 18 (100% match, 100% complete)
NOTE: Executing Tasks
NOTE: Tasks Summary: Attempted 78 tasks of which 77 didn't need to be rerun and all succeeded.
[openeuler@debian build]$ which meson
/usr/bin/meson
[openeuler@debian build]$ meson --version
0.54.3

我是在编译qtbase,最新的docker镜像 + master代码

上面应是 xorgproto configure 阶段的报错, 可以先单独试 xorgproto, 来排除其他的软件配置原因.
可以重启 docker, sudo docker restart <CONTAINER ID> 再执行

su openeuler
cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
. /opt/buildtools/nativesdk/environment-setup-x86_64-pokysdk-linux
source compile.sh aarch64-std /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le
bitbake xorgproto
YanqiXu 修改了描述 3年前

方法都试过了,还是一样的搞错;
bitbake xorgproto 这个是能编译通过的,但是bitbake qtbase就是上面那些报错

lixiaoyong 通过合并 Pull Request !697: 树莓派systemd镜像支持qtwayland任务状态待办的 修改为已完成 3年前

登录 后才可以发表评论

状态
负责人
项目
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
预计工期 (小时)
开始日期   -   截止日期
-
置顶选项
优先级
里程碑
分支
参与者(6)
5329419 openeuler ci bot 1632792936 syncam-syncam YanqiXu-xyq_d48b lizimian-lizimian yanansong-yanansong 7470717 wx 8f8551b11c 1587317416
1
https://gitee.com/openeuler/yocto-meta-openeuler.git
git@gitee.com:openeuler/yocto-meta-openeuler.git
openeuler
yocto-meta-openeuler
yocto-meta-openeuler

搜索帮助