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打开成功。
相关推荐
微步_ym1 天前
RabbitMQ:在Linux上安装RabbitMQ
linux·rabbitmq·erlang
CC.GG1 天前
【Linux】倒计时和进度条实现
linux
Code Warrior1 天前
【Linux】库的制作与原理(1)
linux
生涯にわたる学び1 天前
关于之前知识的一些补充 02
linux·arm开发
汐汐咯1 天前
linux上安装minconda
linux·运维·服务器
小波小波轩然大波1 天前
Linux服务器配置(mariadb服务器)
linux·服务器·mariadb
忧郁的橙子.1 天前
k8s 主节点重启后 从节点 get 异常
linux·运维·服务器
Raymond运维1 天前
Apache介绍和安装
linux·运维·apache
半梦半醒*1 天前
nginx的访问控制、用户认证、https
linux·运维·服务器·nginx·https·centos
Skrrapper1 天前
ubuntu?centos?还是 redhat?Linux 系统选哪个?
linux·ubuntu·centos