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打开成功。
相关推荐
即将头秃的程序媛1 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin1 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧3 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天3 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º4 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。5 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert6 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风7 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子7 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka7 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器