相对于上图传统的桌面图形栈, 嵌入式图形栈必然会受到各种嵌入式软硬件功能的限制, 部分核心图形软件包的精简定制是一方面,老旧且笨重的图形软件包的舍弃是另一方面.
具体到树莓派 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.
树莓派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 文件是必要的。
需要在 bblayer.conf 里加入 openembedded core 和 meta-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.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
主线能验证图形能力吗?
可以通过 kmscube 来验证 OpenGL 和 DRM 的图形功能, 目前正准备引入主线. 目前可以直接用 poky 现有的 libdrm, mesa, kmscube 来实现.
单独编译软件包可以用 bitbake libdrm mesa.
如果想临时加入到 image 可以在 /usr1/build/conf/local.conf
加 IMAGE_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
上面应是 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
方法都试过了,还是一样的搞错;
bitbake xorgproto 这个是能编译通过的,但是bitbake qtbase就是上面那些报错
登录 后才可以发表评论