
Openharmony之GPU Mesa3D移植一(weston 老框架)
本文主要介绍在OpenHarmony上,基于RK3568移植开源GPU Mesa3D图形驱动,使用的基线版本是openharmony 的RK分支+kernel4.19+Weston。
注意:weston是老版本中使用的,新版中已使用renderservice替换。
1、获取openharmony rk分支版本代码
该基线版本是RK分支的OpenHarmony版本,选用此版本的原因是,该版本使能了闭源的GPU。
创建编译openharmony的docker,安装依赖,下载源码,以及编译
创建docker:
podman run --name hm-rk -it -v /home/test/22-01-30_rk /:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.7 /bin/bash
git config --global user.name “test”
git config --global user.email “test@com.cn”
git config --global credential.helper store
安装依赖:
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
apt-get update && apt-get install -y binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g+±multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby libssl-dev
pip3 install -i https://repo.huaweicloud.com/repository/pypi/simple requests
下载源码:
repo init -u https://gitee.com/openharmonyrk/manifest -b master -m rk.xml --no-repo-verify
repo sync -c
repo forall -c ‘git lfs pull’
编译:
bash build/prebuilts_download.sh
./build.sh --product-name rk3568 --ccache
编译成功,刷机后,能进入系统,但是没有图形,注意RK版本的代码本省不能进图形是正常的。
2、编译5.10内核
Mesa3D需要高版本内核支持,而RK分支使用的是4.19的内核,所以需要升级内核,当前开源鸿蒙中2022.1.10后主干代码支持kernel5.10,因此编译kernel5.10需要使用Master 1.10以后的代码版本,具体如下:
mkdir hm-master && cd hm-master
podman run --name hm-master -it -v /home/test/hm-master/:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.7 /bin/bash
git config --global user.name “test”
git config --global user.email “test@.com.cn”
git config --global credential.helper store
curl -s https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo
chmod a+x /usr/local/bin/repo
repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify
repo sync -c
repo forall -c ‘git lfs pull’
bash build/prebuilts_download.sh
./build.sh --product-name rk3568 --ccache --build-target kernel
注意:文档中只有本小节,即编译510内核才需要使用主干1.10以后的代码版本,其它小节均使用的是RK分支版本代码。
1)修改DTS
修改out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi适配开源panfrost,如下:
2)修改config配置
cd out/kernel/src_tmp/linux-5.10
make menuconfig ARCH=arm64
在graphic support中启用panfrost,
然后在Direct Rendering Manager取消选择Ignore drm ioctl permission,然后保存退出配置。
保存配置,并退出。
使用新的.config配置覆盖rockchip_linux_defconfig配置,使用make-ohos.sh脚本编译时config才能生效,如下:
cp .config arch/arm64/configs/rockchip_linux_defconfig
3)修改drivers/gpu/drm/drm_ioctl.c
修改out/kernel/src_tmp/linux-5.10/drivers/gpu/drm/drm_ioctl.c搜索关键字DUMB,将0修改为DRM_RENDER_ALLOW, 如下:
4)编译
PRODUCT_PATH=“vendor/hihope/rk3568” ./make-ohos.sh TB-RK3568X0
5)刷机
图中所示img全部使用新版内核中编译出来的img刷机,即master部分都需要刷入编译5.10内核出来的img,
3、编译Buildroot
编译环境:ubuntu20.04
1)下载代码
git clone https://gitee.com/xfan1024/oh-buildroot-mesa3d -b rpi3b
cd oh-buildroot-mesa3d
apt-get install cpio ruby -y
2)修改配置
make mesa3d_rpi3b_defconfig
make menuconfig ARCH=arm64
修改如下:
如果需要测试glmark2,还应该选中glmaster2
选中glmark2,然后保存退出,重新编译
3)编译
make -j8
4)刷机测试
在system分区刷入buildroot编译出来rootfs.ext2镜像,刷机成功后,在终端运行glmark2-es2-wayland,验证内核panfrost驱动和用户态panfrost驱动是否可以正常工作,具体如下:
mkdir /tmp/xdg
export XDG_RUNTIME_DIR=/tmp/xdg
weston --tty 1 &
glmark2-es2-wayland
4、重新编译rk分支
1)找到编译好的二进制文件
将通过buildroot编译出来的二进制文件拷贝到rk分支的device/rockchip/hardware/gpu/中,
2)修改rk分支代码对应的编译配置项
修改device/rockchip/rk3568/BUILD.gn
修改device\rockchip\hardware\gpu\BUILD.gn为:
修改third_party/weston/libweston/renderer-gl/egl-glue.c
修改foundation/graphic/standard/frameworks/surface/src/producer_egl_surface.cpp
修改base/startup/init_lite/ueventd/etc/ueventd.config
修改third_party/wayland_standard/BUILD.gn
修改third_party/weston/BUILD.gn
修改配置foundation/graphic/standard/frameworks/animation_server/BUILD.gn
修改third_party/weston/weston.cfg 配置,
3)重新编译
./build.sh --product-name rk3568 –ccache
4)刷机
System、vendor、userdata 3个分区刷入rk分支新编译出来的img,
刷机成功后,能正常进入系统,图形也正常启动,使用中速度明显感觉快了很多,即使输入wifi密码也能成功。
5、问题
1)内核编译报错:
解决办法:
使用命令,
PRODUCT_PATH=“vendor/hihope/rk3568” ./make-ohos.sh TB-RK3568X0
2)内核刷机后进不了系统
把rk编译出来的img刷机后能进入系统,但是没有图形,把之前编译出来的rootfs.ext2和新编译出来的510内核boot_linux.img刷机后,串口显示如下:
解决办法:
有两种办法,一是把新老boot_linux.img 解压开对比
新老版中extlinux.conf对比发现都是类似的内容,唯一的区别就是有如TC031C的标识,串口输出中有找不到extlinux.conf.TC031C的打印
把old中extlinux.conf.TC031C拷贝到新版中,并复制toybrick.dtb为toybrick.dtb.TC031C
cd new
cp toybrick.dtb toybrick.dtb.TC031C
cp …/old/extlinux.conf.TC031C ./
重新刷入新的boot_linux.img,正常进入系统。
二是图中所示img全部使用新版内核中编译出来的img刷机(推荐该办法)。
3)编译buildroot报错
编译报如下:
解决办法:
删除output目录,修改编译参数重新编译
rm -rf output/
make -j8
4)编译rk报错undefined symbol: wl_egl_window_create
错误提示如下:
解决办法:
在third_party/wayland_standard/BUILD.gn中新增编译wayland-egl.c
在third_party/weston/BUILD.gn中增加对应的依赖
5)编译rk报错undefined symbol: glEnable
错误提示如下:
使用nm -D 或者 objdump -tT 确定 glEnable 在哪个库文件中定义
nm -D libGLESv2.so.2 |grep glEnable
000068fc T glEnable
00006918 T glEnableVertexAttribArray
00006934 T glEnablei
然后修改配置foundation/graphic/standard/frameworks/animation_server/BUILD.gn,增加对应的依赖,
编译成功。
6)刷机进入系统后图形起不来
在终端执行ps -ef|grep weston,如果没有weston,即weston没有起来,如下:
原因则是weston.cfg配置中没有加入export LIBGL_DRIVERS_PATH /system/lib环境变量。
如果出现如下:
最终定位到third_party/weston/weston.cfg 配置问题,weston服务启动时不能添加–use-pixman参数,如果有该参数,需要删除该参数,一下是基于RK分支代码weston的修改:
文章转载自作者:易阳天
