首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

openharmony适配HDF编译进Linux内核

  • 25-04-24 12:44
  • 3289
  • 5258
blog.csdn.net

介绍

本文档基于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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
  5. 修改如上patch,则能成功将HDF编译进内核

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

  1. 阅读OrangePi_5_Max_RK3588用户手册,知道四组 UART 总线在 40pin 中对应的引脚如下表所示:
UART 总线RX 对应 40pinTX 对应 40pindtbo 对应配置
UART1_M127 号引脚28 号引脚uart1-m1
UART3_M133 号引脚31 号引脚uart3-m1
UART4_M219 号引脚23 号引脚uart4-m2
UART6_M111 号引脚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>;
     };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  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";
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
  • 在配置过程中要注意以下几点:

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打开成功。
注:本文转载自blog.csdn.net的橄榄油加油的文章"https://blog.csdn.net/weixin_62941746/article/details/146072754"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

123
硬件开发
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top