Openharmony之GPU Mesa3D移植二(render 新框架)
目录
1、下载源码
2、编译mesa 3D库
3、修改内核配置
1)修改内核dtb
2)修改device/hihope/rk3568/kernel/build_kernel.sh
3)修改内核config
4、修改openharmony代码
1)修改base/startup/init_lite/ueventd/etc/ueventd.config
2)修改device/hihope/hardware/display/src/display_gralloc/display_gralloc_gbm.c
3)修改foundation/ace/ace_engine/adapter/ohos/build/product_config.gni
4)修改 foundation/graphic/standard/graphic_config.gni
5)修改 foundation/graphic/standard/BUILD.gn
6)修改device/hihope/hardware/gpu/BUILD.gn
7)修改device/hihope/rk3568/BUILD.gn
5、编译
6、刷机
7、问题
1)编译mesa库的时候报错ld.lld: error: unable to find library -lexpat
2)编译mesa库的时候报错如下:
3)编译mesa库的时候报错如下:
4)编译问题
5)刷机后,能进系统,但是图形起不来
本文主要介绍在OpenHarmony上,基于RK3568移植开源GPU Mesa3D图形驱动,使用openharmony v3.1-Release 版本,该版本使用了新框架,内核使用了kernel 5.10.79版本,并使用render_service替换了Weston。
1、下载源码
创建编译openharmony的docker,安装依赖,下载源码
创建docker:
mkdir oh31re
cd oh31re/podman run --name hm-31re -it -v ./:/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker-standard:0.0.9 /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/openharmony/manifest.git -b refs/tags/OpenHarmony-v3.1-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
bash build/prebuilts_download.sh
./build.sh --ccache --product-name rk3568
编译成功,刷机后,能进入系统,也能进入图形,当前版本使用的是闭源GPU驱动,所以使用起来也是很流畅的。
2、编译mesa 3D库
进入容器:
podman exec -it hm-31re bash
下载源码:
git clone https://gitee.com/openharmony-sig/third_party_mesa3d.git
安装依赖:
apt-get install -y meson cmake llvm
python3 -m pip install meson==0.62.0
python -m pip install --upgrade pip
pip install mako atomic markupsafe编译依赖库expat:
./build.sh --ccache --product-name rk3568 --build-target expat
编译mesa 3D:
cd third_party_mesa3d/python ohos/build_ohos.py /home/openharmony/ rk3568 /home/openharmony/third_party_mesa3d/
拷贝库文件到device/hihope/hardware/gpu
cp build-ohos/src/egl/libEGL.so.1.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libGLESv1_CM.so.1.1.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libGLESv2.so.2.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libgbm.so.1.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/install/lib/libglapi.so.0.0.0 ../device/hihope/hardware/gpu/
cp build-ohos/src/gallium/targets/dri/libgallium_dri.so ../device/hihope/hardware/gpu/cp build-ohos/install/lib/dri/panfrost_dri.so ../device/hihope/hardware/gpu/
注意,使用编译mesa库需要把third_party_mesa3d放到openharmony源码中。
3、修改内核配置
1)修改内核dtb
修改out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi适配开源panfrost,如下:
--- arch/arm64/boot/dts/rockchip/rk3568.dtsi-bak 2022-02-15 01:39:52.169152789 +0000 +++ arch/arm64/boot/dts/rockchip/rk3568.dtsi 2022-02-15 02:02:42.096047298 +0000 @@ -1169,36 +1169,23 @@ }; gpu: gpu@fde60000 { - compatible = "arm,mali-bifrost"; - reg = ; + compatible = "rockchip, rk3568-mali", "arm,mali-bifrost"; + reg = ; - interrupts = , + interrupts = , , - ; - interrupt-names = "GPU", "MMU", "JOB"; - - upthreshold = ; - downdifferential = ; - + ; + interrupt-names = "job", "mmu", "gpu"; clocks = , ; - clock-names = "clk_mali", "clk_gpu"; - power-domains = ; - #cooling-cells = ; + clock-names = "core", "bus"; operating-points-v2 = ; + #cooling-cells = ; + power-domains = ; status = "disabled"; - gpu_power_model: power-model { - compatible = "simple-power-model"; - leakage-range= ; - ls = ; - static-coefficient = ; - dynamic-coefficient = ; - ts = ; - thermal-zone = "gpu-thermal"; - }; }; - gpu_opp_table: opp-table2 { + gpu_opp_table: gpu-opp-table { compatible = "operating-points-v2"; mbist-vmin = ; @@ -1227,7 +1214,7 @@ }; opp-800000000 { opp-hz = /bits/ 64 ; - opp-microvolt = ; + opp-microvolt = ; }; };
并拷贝到device/hihope/rk3568/目录下:
cp out/kernel/src_tmp/linux-5.10/arch/arm64/boot/dts/rockchip/rk3568.dtsi device/hihope/rk3568/rk3568.dtsi
2)修改device/hihope/rk3568/kernel/build_kernel.sh
--- build_kernel-bak.sh 2022-04-18 15:53:50.467219678 +0800+++ build_kernel.sh 2022-04-18 15:56:05.243998200 +0800@@ -43,6 +43,8 @@ #config cp -rf ${KERNEL_CONFIG_FILE} ${KERNEL_SRC_TMP_PATH}/arch/arm64/configs/rockchip_linux_defconfig +cp -rf ${3}/rk3568.dtsi ${KERNEL_SRC_TMP_PATH}/arch/arm64/boot/dts/rockchip/+ # if [ "enable_ramdisk" == "${6}" ]; then ./make-ohos.sh TB-RK3568X0 enable_ramdisk
3)修改内核config
修改kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig
diff --git a/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig b/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig index ac005b8..55475c5 100644--- a/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig+++ b/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig@@ -3579,7 +3579,7 @@ CONFIG_DVB_SP2=m # # CONFIG_VGA_ARB is not set CONFIG_DRM=y-CONFIG_DRM_IGNORE_IOTCL_PERMIT=y+# CONFIG_DRM_IGNORE_IOTCL_PERMIT is not set CONFIG_DRM_MIPI_DSI=y # CONFIG_DRM_DP_AUX_CHARDEV is not set # CONFIG_DRM_DEBUG_MM is not set@@ -3593,6 +3593,8 @@ CONFIG_DRM_FBDEV_OVERALLOC=100 CONFIG_DRM_LOAD_EDID_FIRMWARE=y # CONFIG_DRM_DP_CEC is not set CONFIG_DRM_GEM_CMA_HELPER=y+CONFIG_DRM_GEM_SHMEM_HELPER=y+CONFIG_DRM_SCHED=y # # I2C encoder or helper chips@@ -3750,7 +3752,7 @@ CONFIG_DRM_DW_MIPI_DSI=y # CONFIG_TINYDRM_ST7735R is not set # CONFIG_DRM_PL111 is not set # CONFIG_DRM_LIMA is not set-# CONFIG_DRM_PANFROST is not set+CONFIG_DRM_PANFROST=y # CONFIG_DRM_TIDSS is not set # CONFIG_DRM_LEGACY is not set CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
4、修改openharmony代码
1)修改base/startup/init_lite/ueventd/etc/ueventd.config
增加card1和rendD129的权限,在该文件中加上:
/dev/dri/card1 0666 0 1003/dev/dri/renderD129 0666 0 1003
2)修改device/hihope/hardware/display/src/display_gralloc/display_gralloc_gbm.c
diff --git a/hardware/display/src/display_gralloc/display_gralloc_gbm.c b/hardware/display/src/display_gralloc/display_gralloc_gbm.c index 2dad8c1..1445819 100644--- a/hardware/display/src/display_gralloc/display_gralloc_gbm.c+++ b/hardware/display/src/display_gralloc/display_gralloc_gbm.c@@ -34,7 +34,7 @@ #include "display_gralloc_private.h" #include "display_common.h"-const char *g_drmFileNode = "/dev/dri/renderD128";+const char *g_drmFileNode = "/dev/dri/card0"; static GrallocManager *g_grallocManager = NULL; static pthread_mutex_t g_lock;
3)修改foundation/ace/ace_engine/adapter/ohos/build/product_config.gni
diff --git a/adapter/ohos/build/product_config.gni b/adapter/ohos/build/product_config.gni index 3d29a14c..c5d095aa 100644--- a/adapter/ohos/build/product_config.gni+++ b/adapter/ohos/build/product_config.gni@@ -14,3 +14,5 @@ enable_accessibility_product_list = [ "rk3568" ] enable_web_product_list = [ "rk3568", "m40" ]++gpu_block_product_list = [ "rk3568" ]
4)修改 foundation/graphic/standard/graphic_config.gni
diff --git a/graphic_config.gni b/graphic_config.gniindex 1e4f66c..178bfe3 100644--- a/graphic_config.gni+++ b/graphic_config.gni@@ -20,7 +20,8 @@ if ("${product_name}" == "watchos" || "${product_name}" == "Hi3516DV300" || } else if ("${product_name}" == "rk3566" || "${product_name}" == "rk3568") { gpu_defines = [ "ACE_ENABLE_GL" ] ace_enable_gpu = true- libgl = [ "//device/hihope/hardware/gpu:mali-bifrost-g52-g2p0-ohos" ]+ #libgl = [ "//device/hihope/hardware/gpu:mali-bifrost-g52-g2p0-ohos" ]+ libgl = [ "//device/hihope/hardware/gpu:mesa-gpu-libs" ] } else { gpu_defines = [ "ACE_ENABLE_GL" ] ace_enable_gpu = true
5)修改 foundation/graphic/standard/BUILD.gn
diff --git a/BUILD.gn b/BUILD.gnindex 1af1af9..36c22ac 100755--- a/BUILD.gn+++ b/BUILD.gn@@ -69,7 +69,7 @@ wmlayout_scss("default.scss") { group("libsurface") { public_deps = [ "frameworks/surface:surface" ] if (ace_enable_gpu) {- public_deps += [ "frameworks/surfaceimage:libsurfaceimage" ]+ #public_deps += [ "frameworks/surfaceimage:libsurfaceimage" ] } }
6)修改device/hihope/hardware/gpu/BUILD.gn
diff --git a/hardware/gpu/BUILD.gn b/hardware/gpu/BUILD.gnindex 7ffc13d..6a5aa20 100755--- a/hardware/gpu/BUILD.gn+++ b/hardware/gpu/BUILD.gn@@ -14,33 +14,84 @@ import("//build/ohos.gni") import("//build/ohos/ndk/ndk.gni")-config("libmali-bifrost-g52-g2p0-ohos") {- include_dirs = [ "include" ]- cflags = [- "-Wno-incompatible-pointer-types",- "-Werror",- "-Wimplicit-function-declaration",- "-Wno-error=unused-variable",- ]- cflags = []-}-ohos_prebuilt_shared_library("mali-bifrost-g52-g2p0-ohos") {- if (target_cpu == "arm") {- source = "lib/libmali-bifrost-g52-g2p0-ohos.so"- } else if (target_cpu == "arm64") {- source = "lib64/libmali-bifrost-g52-g2p0-wayland.so"- }- install_images = [ system_base_dir ]+ohos_prebuilt_shared_library("mesa_gbm") {+ source = "libgbm.so.1.0.0"+ install_enable = true subsystem_name = "hdf" part_name = "display_device_driver"+ symlink_target_name = [+ "libgbm.so.1",+ "libgbm.so",+ ]+}+ohos_prebuilt_shared_library("mesa_egl") {+ source = "libEGL.so.1.0.0" install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver" symlink_target_name = [+ "libEGL.so.1", "libEGL.so",- "libGLESv1.so",+ ]+}+ohos_prebuilt_shared_library("mesa_glapi") {+ source = "libglapi.so.0.0.0"+ install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver"+ symlink_target_name = [+ "libglapi.so.0",+ "libglapi.so",+ ]+}+ohos_prebuilt_shared_library("mesa_glesv1") {+ source = "libGLESv1_CM.so.1.1.0"+ install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver"+ symlink_target_name = [+ "libGLESv1_CM.so.1",+ "libGLESv1_CM.so",+ ]+}+ohos_prebuilt_shared_library("mesa_glesv2") {+ source = "libGLESv2.so.2.0.0"+ install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver"+ symlink_target_name = [+ "libGLESv2.so.2", "libGLESv2.so",- "libGLESv3.so",- "libmali.so.0",- "libmali.so.1",+ ]+}+ohos_prebuilt_shared_library("libgallium_dri") {+ source = "libgallium_dri.so"+ install_images = [ chipset_base_dir ]+ install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver"+ symlink_target_name = [+ "libgallium_dri.so",+ #"rockchip_dri.so",+ ]+}+ohos_prebuilt_shared_library("panfrost_dri") {+ source = "panfrost_dri.so"+ install_enable = true+ subsystem_name = "hdf"+ part_name = "display_device_driver"+ symlink_target_name = [+ "rockchip_dri.so",+ ]+}+group("mesa-gpu-libs") {+ public_deps = [+ ":mesa_gbm",+ ":mesa_egl",+ ":mesa_glapi",+ ":mesa_glesv1",+ ":mesa_glesv2",+ ":panfrost_dri", ] }
7)修改device/hihope/rk3568/BUILD.gn
diff --git a/rk3568/BUILD.gn b/rk3568/BUILD.gnindex f7a3770..00f760d 100755--- a/rk3568/BUILD.gn+++ b/rk3568/BUILD.gn@@ -20,6 +20,7 @@ group("rk3568_group") { "build/rootfs:init_configs", "distributedhardware:distributedhardware", "kernel:kernel",- "system_hap:hap"+ "system_hap:hap",+ "//device/hihope/hardware/gpu:libgallium_dri" ] }
5、编译
./build.sh --ccache --product-name rk3568
6、刷机
刷机后,render_service正常起来了,图形也正常启动,panfrost驱动也正常,点击界面,流畅不卡顿。
7、问题
1)编译mesa库的时候报错ld.lld: error: unable to find library -lexpat
解决办法:
该问题是缺少依赖expat,需要编译expat
./build.sh --ccache --product-name rk3568 --build-target expat
2)编译mesa库的时候报错如下:
解决办法:
该问题是meson版本过低导致,升级该版本解决问题
python3 -m pip install meson==0.62.0
3)编译mesa库的时候报错如下:
解决办法:
该问题是缺少mako依赖,安装该包即可,具体如下:
python -m pip install --upgrade pip
pip install markupsafe
pip install mako
4)编译问题
移植完mesa驱动后,编译报错如下:
解决办法:
该问题原因主要是mesa3d库的软连接导致的,需要修改gn让软连接实体so,并且添加上so的软连接,具体参考第4节中6)修改device/hihope/hardware/gpu/BUILD.gn。
5)刷机后,能进系统,但是图形起不来
解决办法:
ps命令查看发现render_service 服务没有起来,判断是该服务导致的,
该问题是mesa3d库有问题,可能是使用的mesa3d库是ohos/build_wayland_and_gbm.py编译出来的,即使用老框架支持的,在新框架中需要使用ohos/build_ohos.py编译的mesa3d库,具体编译方法请参考第2节编译mesa 3D库。
参考文献:
OpenHarmony适配开源图形驱动(新框架)---RK3568