**RK3568 OpenHarmony V3.2 Beta5 开发之板级驱动适配**
前言
上回说到,如果是自己的主板,应该如何适配板级驱动,让OpenHarmony系统在自己的板子上跑起来呢?
1.OpenHarmony SDK驱动内核编译流程解析
(1)首先,rk3568平台的内核配置和预编译脚本在:device/board/hihope/rk3568/kernel/build_kernel.sh
简单地说,其核心思想是:基于linux-5.10的基础内核,打上rk3568平台的核心补丁kernel.patch后,就可以支持RK3568板级dts配置和基础驱动。然后拷贝内核源码到out目录进行编译。
(2)内核的编译脚本在out/kernel/src_tmp/linux-5.10/make-ohos.sh 中
这里配置了编译工具链,指定的板级dts,config等(没错,这里就是我们需要找的地方)
2.构建编译思路
(1)首先进入内核基础目录kernel/linux/linux-5.10 打上kernel.patch,这样我们就拥有了一份rk3568完整的内核代码
(2) 进入kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip目录,加入自己的板级dts和相关dtsi配置
(3)修改后生成新的核心补丁kernel.patch,新的kernel.patch替换掉kernel/linux/patches/linux-5.10/rk3568_patch/kernel.patch
这样完全编译出的固件,就对应我们自己的主板了。(当然,编译脚本要指定到对应的板级dts,下面会举例)
3.调试实战
(1)修改预编译脚本
device/board/hihope/rk3568/kernel/build_kernel.sh
diff --git a/rk3568/kernel/build_kernel.sh b/rk3568/kernel/build_kernel.sh
index 4bd1e65..6b0fdf4 100755
--- a/rk3568/kernel/build_kernel.sh
+++ b/rk3568/kernel/build_kernel.sh
@@ -72,7 +72,7 @@ do
;;
esac
done
-eval $make_ohos_env ./make-ohos.sh TB-RK3568X0 $ramdisk_arg ${ENABLE_LTO_O0}
+eval $make_ohos_env ./make-ohos.sh NN-RK3568N10 $ramdisk_arg ${ENABLE_LTO_O0}
mkdir -p ${2}
diff --git a/rk3568/kernel/logo.bmp b/rk3568/kernel/logo.bmp
index 980f44e..b4bc234 100755
Binary files a/rk3568/kernel/logo.bmp and b/rk3568/kernel/logo.bmp differ
diff --git a/rk3568/kernel/logo_kernel.bmp b/rk3568/kernel/logo_kernel.bmp
index f74ed84..2c7ecdf 100755
Binary files a/rk3568/kernel/logo_kernel.bmp and b/rk3568/kernel/logo_kernel.bmp differ
(2)修改内核编译脚本,添加自己的板级dts、dtsi文件
cd kernel/linux
进入内核源码目录:
先打一次rk3568默认补丁kernel.patch,操作如下:
cd linux-5.10/
patch -p1 < ../patches/linux-5.10/rk3568_patch/kernel.patch
make-ohos.sh修改如下:
diff --git a/make-ohos.sh b/make-ohos.sh
new file mode 100755
-index 000000000..4f6b72d23
+index 000000000..50fb79a39
--- /dev/null
+++ b/make-ohos.sh
-@@ -0,0 +1,135 @@
+@@ -0,0 +1,137 @@
+#!/bin/bash
+
+set -e
@@ -1665131,7 +1665526,8 @@ index 000000000..4f6b72d23
+BUILD_PATH=boot_linux
+EXTLINUX_PATH=${BUILD_PATH}/extlinux
+EXTLINUX_CONF=${EXTLINUX_PATH}/extlinux.conf
-+TOYBRICK_DTB=toybrick.dtb
++#TOYBRICK_DTB=toybrick.dtb
++NNEWN_DTB=rk3568-evb-nnewn.dtb
+if [ ${KBUILD_OUTPUT} ]; then
+ OBJ_PATH=${KBUILD_OUTPUT}/
+fi
@@ -1665145,6 +1665541,7 @@ index 000000000..4f6b72d23
+model_list=(
+ "TB-RK3568X0 arm64 0xfe660000 rk3568-toybrick-x0-linux Image rockchip_linux_defconfig"
+ "TB-RK3568X10 arm64 0xfe660000 rk3568-toybrick-x10-linux Image rockchip_linux_defconfig"
++ "NN-RK3568N10 arm64 0xfe660000 rk3568-evb-nnewn Image rockchip_linux_defconfig"
+)
+
+
@@ -1665166,7 +1665563,7 @@ index 000000000..4f6b72d23
+
+ echo "label rockchip-kernel-5.10" > ${EXTLINUX_CONF}
+ echo " kernel /extlinux/${image}" >> ${EXTLINUX_CONF}
-+ echo " fdt /extlinux/${TOYBRICK_DTB}" >> ${EXTLINUX_CONF}
++ echo " fdt /extlinux/${NNEWN_DTB}" >> ${EXTLINUX_CONF}
+ cmdline="append earlycon=uart8250,mmio32,${uart} root=PARTUUID=614e0000-0000-4b53-8000-1d28000054a9 rw rootwait rootfstype=ext4"
+ echo " ${cmdline}" >> ${EXTLINUX_CONF}
+}
@@ -1665234,7 +1665631,7 @@ index 000000000..4f6b72d23
+ fi
+ make_extlinux_conf ${dtb_path} ${uart} ${image}
+ cp -f ${OBJ_PATH}arch/${arch}/boot/${image} ${EXTLINUX_PATH}/
-+ cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${TOYBRICK_DTB}
++ cp -f ${OBJ_PATH}${dtb_path}/${dtb}.dtb ${EXTLINUX_PATH}/${NNEWN_DTB}
+ cp -f logo*.bmp ${BUILD_PATH}/
+ if [ "enable_ramdisk" != "${ramdisk_flag}" ]; then
+ make_ext2_image
dts和dtsi文件自己添加到kernel/linux/linux-5.10/arch/arm64/boot/dts/rockchip/目录
(3)合并生成新补丁,迭代旧的kernel.patch
操作如下:
cd linux-5.10/
git add -A
git diff --cached > kernel.patch
cp kernel.patch ../patches/linux-5.10/rk3568_patch/
git reset --hard 9a1d8aa6829683f690336aaf2741c0b658964aeb
(4)编译验证
编译指令(由于我们默认已经将编译脚本指向了我们自己的dts,所以编译指令不变)
./build.sh --product-name rk3568 --ccache4