OpenHarmony适配开源图形驱动(旧框架)--RK3568

OpenHarmony适配开源图形驱动(旧框架)---RK3568

    • 1.刷入openharmonyrk分支版本,确保基线闭源GPU使能且屏幕能正常点亮
    • 2.修改kernel5.10内核并重新编译
      • 2.1 修改DTS
      • 2.2 启用Panfrost内核
      • 2.3 单独编译kernel5.10
    • 3.编译buildroot,启用mesa3d和panfrost驱动
      • 3.1基于xfan的代码仓对mesa进行编译
      • 3.2执行make menuconfig进行buildroot固件的编译,进行如下的配置:
    • 4.运行glmark2-es2-wayland,验证内核panfrost驱动和用户态panfrost驱动是否可以正常工作。
    • 5.将编译出来的Mesa库接入到OpenHarmony
      • 5.1 找到编译好的二进制文件:
      • 5.2 修改对应的编译配置项:
      • 5.3修改fence
    • 6. 修改rendD节点权限,使得hap有权限访问

本文主要介绍Open Harmony如何接入开源图形驱动,在OpenHarmony上使能开源GPU。我们使用的基线版本是基于openharmony的闭源驱动+kernel4.19+Weston(旧框架)。

1.刷入openharmonyrk分支版本,确保基线闭源GPU使能且屏幕能正常点亮

1)基线版本是RK分支的OpenHarmony版本,选用此版本的原因是,该版本使能了闭源的GPU。

2)拉取代码,并进行编译与烧录,确定基线版本可以正常点亮。
拉取OH代码(我使用的是Ubantu20.0.4):

$ 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'

安装依赖工具,编译器,并进行编译,

$ sudo apt-get update && sudo apt-get install 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 genext2fs liblz4-tool libtinfo5 lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby
$ sudo apt install openjdk-17-jre-headless
$ bash build/prebuilts_download.sh
$ ./build.sh --product-name rk3568 --ccache

编译完成后如下:
在这里插入图片描述

编译完成后进行烧录,生成的镜像文件在\out\ohos-arm-release\packages\phone\images,烧录时依次选择对应的固件,点击执行耐心等待下载完成即可
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第1张图片

2.修改kernel5.10内核并重新编译

由于RK分支使用的是4.19的内核,1.10后主干才支持kernel5.10,因此编译kernel5.10需要采用的是Master 1.10以后的版本,拉取代码和编译的过程同上,此处不再描述(只有本小节使用的是主干1.10以后的版本,其它小节均使用的是RK分支版本)。编译完成后进入kernel 5.10源码路径\out\kernel\src_tmp\linux-5.10,进行如下操作:

2.1 修改DTS

打开.\out\kernel\src_tmp\linux-5.10\arch\arm64\boot\dts\rockchip\rk3568.dts进行修改,适配开源panfrost。diff如下:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第2张图片
修改后如下:

gpu: gpu@fde60000 {
	compatible = "rockchip, rk3568-mali", "arm,mali-bifrost";
	reg = <0x0 0xfde60000 0x0 0x20000>;

	interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
		     <GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
		     <GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;
	interrupt-names = "job", "mmu", "gpu";
	clocks = <&scmi_clk 1>, <&cru CLK_GPU>;
	clock-names = "core", "bus";
	operating-points-v2 = <&gpu_opp_table>;

	#cooling-cells = <2>;
	power-domains = <&power RK3568_PD_GPU>;
	status = "disabled";
};

2.2 启用Panfrost内核

进入到linux-kernel5.10的目录后,cd到对应的目录\out\kernel\src_tmp\linux-5.10,执行make menuconfig ARCH=arm64,在graphic support中启用panfrost,
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第3张图片
然后在Direct Rendering Manager取消选择Ignore drm ioctl permission,然后保存退出配置。OpenHarmony适配开源图形驱动(旧框架)--RK3568_第4张图片

2.3 单独编译kernel5.10

执行 ./make-ohos.sh TB-RK3568X0进行编译。

3.编译buildroot,启用mesa3d和panfrost驱动

3.1基于xfan的代码仓对mesa进行编译

首先通过git clone下载最新的mesa21.3.3版本。git clone https://gitee.com/xfan1024/oh-buildroot-mesa3d.git

3.2执行make menuconfig进行buildroot固件的编译,进行如下的配置:

配置项 配置值
Target options -> Target Architecture ARM (little endian)
Target options -> Target Architecture Variant cortex-A53
Target options -> Target ABI EABI
Toolchain -> C library musl
Toolchain -> Kernel Header Linux 5.10.x kernel headers
Toolchain -> Enable C++ support y
System configuration -> /dev management Dynamic using devtmpfs + eudev
Target packages -> Graphic libraries and applications -> mesa3d y
Target packages -> Graphic libraries and applications -> mesa3d-> Gallium panfrost driver y
Target packages -> Graphic libraries and applications -> mesa3d-> OpenGL ES y
Target packages -> Graphic libraries and applications -> weston y
Target packages -> Graphic libraries and applications -> weston-> default compositor drm
Filesystem images -> ext2/3/4 root filesystem y
Filesystem images -> ext2/3/4 root filesystem -> ext2/3/4 variant ext4
保存,进行编译make
执行完成后生成镜像rootfs,如下:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第5张图片
最后将生成的两个的镜像进行重新烧录即可:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第6张图片

4.运行glmark2-es2-wayland,验证内核panfrost驱动和用户态panfrost驱动是否可以正常工作。

首先后台启动weston:

mkdir /tmp/xdg
XDG_RUNTIME_DIR=/tmp/xdg
weston --tty 1 &
glmark2-es2-wayland

如果看到屏幕上有正常的渲染画面,即验证panfrost驱动与kernel5.10驱动可以在weston中正常工作。
PS:如果未正常工作,可以尝试以下步骤:
cd到out/kernel/src_tmp/linux-5.10/drivers/gpu/drm
修改drm_ioctl.c,搜索关键字DUMB,将0修改为DRM_RENDER_ALLOW, 如下:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第7张图片
再次尝试启动glmark2即可

5.将编译出来的Mesa库接入到OpenHarmony

5.1 找到编译好的二进制文件:

配置项
文件名
output/target/usr/lib/libEGL.so.1
output/target/usr/lib/libGLESv1_CM.so.1
output/target/usr/lib/libGLESv2.so.2
output/target/usr/lib/libgbm.so.1
output/target/usr/lib/libglapi.so.0
output/target/usr/lib/dri/ panfrost_dri.so
将这些二进制文件拷贝到\device\rockchip\hardware\gpu

5.2 修改对应的编译配置项:

修改\device\rockchip\rk3568,增加“//device/hihope/hardware/gpu:libgallium_dri”, 如下图:

import("//build/ohos.gni")

print("rk3568_group in")
group("rk3568_group") {
  deps = [
  "//device/rockchip/hardware/gpu:libgallium_dri"
  ]

修改\device\rockchip\hardware\gpu\BUILD.gn为:

import("//build/ohos.gni")
import("//build/ohos/ndk/ndk.gni")

mesa3d_common_prebuilts = [
  "libgbm.so.1",
  "libEGL.so.1",
  "libglapi.so.0",
  "libGLESv1_CM.so.1",
  "libGLESv2.so.2",
]

mesa3d_common_deps = []
foreach(file, mesa3d_common_prebuilts) {
  target = "mesa3d-common-$file"
  ohos_prebuilt_shared_library(target) {
    source = file
    subsystem_name = "hdf"
    part_name = "hdf"
    install_enable = true
  }
  mesa3d_common_deps += [ ":$target" ]
}

group("mali-bifrost-g52-g2p0-wayland") {
  deps = mesa3d_common_deps
}

ohos_prebuilt_shared_library("libgallium_dri") {
  source = "libgallium_dri.so"
  part_name = "rockchip_products"
  install_enable = true
  symlink_target_name = [
    "panfrost_dri.so",
    "rockchip_dri.so",
  ]
}

5.3修改fence

修改third_party/weston/libweston/renderer-gl/egl-glue.c
增加weston_check_egl_extension(extensions, “EGL_ANDROID_native_fence_sync”)
如下图:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第8张图片
打开/foundation/graphic/standard/frameworks/surface/src/producer_egl_surface.cpp,这里强制进行缓存送显避免出现白屏的情况,如下图:
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第9张图片

6. 修改rendD节点权限,使得hap有权限访问

修改base/startup/init_lite/ueventd/etc/ueventd.config文件,增加card1和rendD129的权限,在该文件中加上:
/dev/dri/card1 0666 0 1003
/dev/dri/renderD129 0666 0 1003
最终重新编译./build.sh --product-name rk3568 --cccahe,重新烧录system.img
OpenHarmony适配开源图形驱动(旧框架)--RK3568_第10张图片
版权声明:本文为CSDN博主「zleoyu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zleoy/article/details/122721370

你可能感兴趣的:(harmonyos,ubuntu,linux,gpu)