openharmony适配HDF编译进Linux内核

介绍

本文档基于OpenHarmony 5.0.2 Release版本,在OrangePi 5 Max开发板(极小尺寸的RK3588开发板)上,实现HDF框架的uart串口适配

步骤

1 确保HDF驱动框架能编译进内核

  1. 在路径\\device\board\openvalley\opi5max\kernel\configs\orangepi5max_oh_defconfig下打开

    CONFIG_DRIVERS_HDF=y

    CONFIG_HDF_SUPPORT_LEVEL=2

  2. rm -rf out/kernel:删除编译的内核,/build.sh --product-name=opi5max --ccache重新编译内核

  3. 会发现有以下报错:

    llvm-ar: error:'.../.../framework/utils/src/hcs_parser/device_resource_if.o':No such or directory

  4. 进一步分析是环境变量错误,导致的内核编译错误,需要在修改以下内容:

    cfg/init.opi5max.cfg | 4 +±-

    kernel/build_kernel.sh | 10 ++++++±--

    kernel/make-ohos.sh | 2 ±

    modules/modules_path.gni | 10 +++++±---

    5 files changed, 29 insertions(+), 10 deletions(-)

     diff --git a/cfg/init.opi5max.cfg b/cfg/init.opi5max.cfg
     index 5cd00f2..b22f8b0 100755
     --- a/cfg/init.opi5max.cfg
     +++ b/cfg/init.opi5max.cfg
     @@ -15,8 +15,8 @@
                     "write /sys/kernel/hungtask/monitorlist whitelist,init,appspawn",
                     "chown system system /sys/kernel/hungtask/userlist",
                     "symlink /dev/block/platform/fe2e0000.mmc/by-name /dev/block/by-name",
     -                "insmod /vendor/modules/rtkm.ko",
     -                "insmod /vendor/modules/8852be.ko"
     +                # "insmod /vendor/modules/rtkm.ko",
     +                # "insmod /vendor/modules/8852be.ko"
                 ]
             }, {
                 "name" : "boot",
     diff --git a/kernel/build_kernel.sh b/kernel/build_kernel.sh
     index d0a82f2..e609e7c 100755
     --- a/kernel/build_kernel.sh
     +++ b/kernel/build_kernel.sh
     @@ -33,9 +33,11 @@ rm -rf ${KERNEL_SRC_TMP_PATH}
     mkdir -p ${KERNEL_SRC_TMP_PATH}
     
     rm -rf ${KERNEL_OBJ_TMP_PATH}
     -# mkdir -p ${KERNEL_OBJ_TMP_PATH}
     +mkdir -p ${KERNEL_OBJ_TMP_PATH}
     +
     +# export KBUILD_OUTPUT=${KERNEL_SRC_TMP_PATH}
     +export KBUILD_OUTPUT=${KERNEL_OBJ_TMP_PATH}
     
     -export KBUILD_OUTPUT=${KERNEL_SRC_TMP_PATH}
     export INSTALL_MOD_PATH=${OUT_PKG_DIR}/../../../driver_modules
     
     echo "cp kernel source"
     @@ -46,17 +48,19 @@ cd ${KERNEL_SRC_TMP_PATH}
     #hdf patch 打入HDF补丁
     bash ${PATCHES_PATH}/hdf_patch.sh ${PROJECT_ROOT} ${KERNEL_SRC_TMP_PATH} ${HDF_PATCH_FILE}
     
     +cd ${KERNEL_SRC_TMP_PATH}
     cp -rf ${DEVICE_DIR}/kernel/make*.sh ${KERNEL_SRC_TMP_PATH}/
     #config
     cp -rf ${KERNEL_CONFIG_FILE} ${KERNEL_SRC_TMP_PATH}/arch/arm64/configs/${DEFCONFIG_FILE}
     cp -rf ${PROJECT_ROOT}/device/board/openvalley/opi5max/kernel/dts/* ${KERNEL_SRC_TMP_PATH}/arch/arm64/boot/dts/rockchip/
     +# cp -rf ${DEVICE_DIR}/kernel/drivers/* ${KERNEL_SRC_TMP_PATH}/drivers/
     
     ./make-ohos.sh orangepi_5max enable_ramdisk
     
     mkdir -p ${OUT_PKG_DIR}
     
     cp ${KERNEL_SRC_TMP_PATH}/boot_linux.img ${OUT_PKG_DIR}
     -cp ${KBUILD_OUTPUT}/resource.img ${OUT_PKG_DIR}/resource.img
     +cp ${KERNEL_OBJ_TMP_PATH}/resource.img ${OUT_PKG_DIR}/resource.img
     cp ${DEVICE_DIR}/loader/parameter.txt ${OUT_PKG_DIR}/parameter.txt
     cp ${DEVICE_DIR}/loader/MiniLoaderAll.bin ${OUT_PKG_DIR}/MiniLoaderAll.bin
     cp ${DEVICE_DIR}/loader/uboot.img ${OUT_PKG_DIR}/uboot.img
     diff --git a/kernel/make-ohos.sh b/kernel/make-ohos.sh
     index 205ce83..8cf2e57 100755
     --- a/kernel/make-ohos.sh
     +++ b/kernel/make-ohos.sh
     @@ -70,7 +70,7 @@ function make_kernel_image()
             return -2
         fi
     
     -	${MAKE} ARCH=${arch} modules_install
     +	# ${MAKE} ARCH=${arch} modules_install
     
         return 0
     }
     diff --git a/modules/modules_path.gni b/modules/modules_path.gni
     index 1ae500a..f15f072 100755
     --- a/modules/modules_path.gni
     +++ b/modules/modules_path.gni
     @@ -11,7 +11,9 @@
     # See the License for the specific language governing permissions and
     # limitations under the License.
     
     -modules_files = [
     -  "$root_build_dir/driver_modules/lib/modules/5.10.110/kernel/drivers/net/wireless/rockchip_wlan/rtl8852be/8852be.ko",
     -  "$root_build_dir/driver_modules/lib/modules/5.10.110/kernel/drivers/net/wireless/rockchip_wlan/rtl8852be/rtkm.ko",
     -  ]
     \ No newline at end of file
     +# modules_files = [
     +#   "$root_build_dir/driver_modules/lib/modules/5.10.110/kernel/drivers/net/wireless/rockchip_wlan/rtl8852be/8852be.ko",
     +#   "$root_build_dir/driver_modules/lib/modules/5.10.110/kernel/drivers/net/wireless/rockchip_wlan/rtl8852be/rtkm.ko",
     +#   ]
     +# 不编译ko镜像
     +modules_files = []
     \ No newline at end of file
    
  5. 修改如上patch,则能成功将HDF编译进内核

2 打开开发板40pin的串口配置

  1. 阅读OrangePi_5_Max_RK3588用户手册,知道四组 UART 总线在 40pin 中对应的引脚如下表所示:
UART 总线 RX 对应 40pin TX 对应 40pin dtbo 对应配置
UART1_M1 27 号引脚 28 号引脚 uart1-m1
UART3_M1 33 号引脚 31 号引脚 uart3-m1
UART4_M2 19 号引脚 23 号引脚 uart4-m2
UART6_M1 11 号引脚 13 号引脚 uart6-m1
  1. \\device\board\openvalley\opi5max\kernel\dts\rk3588-orangepi-5-max.dts设备树配置中,打开四个串口总线的配置,配置如下:

     &uart1 {
         status = "okay";
         pinctrl-names = "default";
         pinctrl-0 = <&uart1m1_xfer>;
     };
    
     &uart3 {
         status = "okay";
         pinctrl-names = "default";
         pinctrl-0 = <&uart3m1_xfer>;
     };
    
     &uart4 {
         status = "okay";
         pinctrl-names = "default";
         pinctrl-0 = <&uart4m1_xfer>;
     };
     &uart6 {
         status = "okay";
         pinctrl-names = "default";
         pinctrl-0 = <&uart6m1_xfer>;
     };
    
  2. 重新编译固件,烧录到开发板后,用ls dev/如果存在ttyS1、ttyS3、ttyS4、ttyS6,则打开成功。

3 打开HDF_UART配置

  1. \\device\board\openvalley\opi5max\kernel\configs\orangepi5max_oh_defconfig打开宏定义CONFIG_DRIVERS_HDF_PLATFORM=y, CONFIG_DRIVERS_HDF_PLATFORM_UART=y

  2. 对于不同的平台,需要在对应的平台目录修改对应的HCS文件,现需要增加uart1 uart3 uart4 uart6的HCS配置,修改\\vendor\openvalley\opi5max\hdf_config\khdf\platform\rk3588_uart_config.hcs文件,添加以下内容:

     device_uart_0x0001 :: uart_device {
         num = 1;
         match_attr = "rockchip_rk3588_uart_1";
     }
    
     device_uart_0x0003 :: uart_device {
         num = 3;
         match_attr = "rockchip_rk3588_uart_3";
     }
    
     device_uart_0x0004 :: uart_device {
         num = 4;
         match_attr = "rockchip_rk3588_uart_4";
     }
    
     device_uart_0x0006 :: uart_device {
         num = 6;
         match_attr = "rockchip_rk3588_uart_6";
     }
    
  3. 确保\\vendor\openvalley\opi5max\hdf_config\khdf\device_info\device_info.hcs已经配置好了HDF_PLATFORM和HDF_PLATFORM_UART,添加以下内容:

     device1 :: deviceNode {
         policy = 2;
         permission = 0644;
         priority = 40;
         moduleName = "HDF_PLATFORM_UART";
         serviceName = "HDF_PLATFORM_UART_1";
         deviceMatchAttr = "rockchip_rk3588_uart_1";
     }
     device2 :: deviceNode {
         policy = 2;
         permission = 0644;
         priority = 40;
         moduleName = "HDF_PLATFORM_UART";
         serviceName = "HDF_PLATFORM_UART_3";
         deviceMatchAttr = "rockchip_rk3588_uart_3";
     }
     device3 :: deviceNode {
         policy = 2;
         permission = 0644;
         priority = 40;
         moduleName = "HDF_PLATFORM_UART";
         serviceName = "HDF_PLATFORM_UART_4";
         deviceMatchAttr = "rockchip_rk3588_uart_4";
     }
     device4 :: deviceNode {
         policy = 2;
         permission = 0644;
         priority = 40;
         moduleName = "HDF_PLATFORM_UART";
         serviceName = "HDF_PLATFORM_UART_6";
         deviceMatchAttr = "rockchip_rk3588_uart_6";
     }
    
  • 在配置过程中要注意以下几点:

1 device1, device2... 是自定义的,可以根据实际情况修改

2 policy 表示服务策略,取值为 0 时,表示不发布服务,取值为 1 时表示向内核态发布服务,取值为 2 时表示向内核用户态发布服务

3 moduleName 的值要与驱动实现的 HdfDriverEntry 结构体中的 moduleName 相同。

4 deviceMatchAttr 的值表示驱动的私有配置信息

5 serviceName 表示服务名称,服务加载成功之后会在开发板的/dev/目录下生成节点。例如HDF_PLATFORM_UART_6 后面跟着的数据 6 是 UartOpen()的端口号

  1. ls dev/查看挂载设备,如果存在HDF_PLATFORM_UART_1、HDF_PLATFORM_UART_3、HDF_PLATFORM_UART_4、HDF_PLATFORM_UART_6,则表示HDF_UART打开成功。
相关推荐
唐青枫2 分钟前
Linux expr命令详解
linux
阳光808829 分钟前
体验开源OpenHarmony+stratovirt模拟器
linux·ubuntu·rust·开源
IvanWKQ1 小时前
本地服务重启-端口占用-显示和美国ip有个连接?存在恶意程序或是间谍程序?
linux·服务器·网络
山风,2 小时前
Vulnhub靶机渗透-TR0LL1
linux·服务器·网络安全
VermouthSp2 小时前
Linux驱动开发(1.基础创建)
linux·驱动开发
我是阿呆同学3 小时前
【基础io】
linux
菜萝卜子4 小时前
【Linux】权限相关知识点
linux·运维·服务器
LG.YDX4 小时前
Linux:理解进程,系统调用,进程,进程切换,调度,分时操作系统和实时操作系统,
linux·运维·服务器
森焱森5 小时前
出现“ping不通但可以远程连接”的情况可能由以下原因导致
linux·c语言·网络·c++
m0_748248238 小时前
centOS 环境 安装redis方法
linux·redis·centos