介绍
本文档基于OpenHarmony 5.0.2 Release版本,在OrangePi 5 Max开发板(极小尺寸的RK3588开发板)上,实现HDF框架的uart串口适配
步骤
1 确保HDF驱动框架能编译进内核
-
在路径
\\device\board\openvalley\opi5max\kernel\configs\orangepi5max_oh_defconfig
下打开CONFIG_DRIVERS_HDF=y
CONFIG_HDF_SUPPORT_LEVEL=2
-
rm -rf out/kernel
:删除编译的内核,/build.sh --product-name=opi5max --ccache
重新编译内核 -
会发现有以下报错:
llvm-ar: error:'.../.../framework/utils/src/hcs_parser/device_resource_if.o':No such or directory
-
进一步分析是环境变量错误,导致的内核编译错误,需要在修改以下内容:
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
-
修改如上patch,则能成功将HDF编译进内核
2 打开开发板40pin的串口配置
- 阅读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 |
-
在
\\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>; };
-
重新编译固件,烧录到开发板后,用
ls dev/
如果存在ttyS1、ttyS3、ttyS4、ttyS6,则打开成功。
3 打开HDF_UART配置
-
在
\\device\board\openvalley\opi5max\kernel\configs\orangepi5max_oh_defconfig
打开宏定义CONFIG_DRIVERS_HDF_PLATFORM=y, CONFIG_DRIVERS_HDF_PLATFORM_UART=y
-
对于不同的平台,需要在对应的平台目录修改对应的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"; }
-
确保
\\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()的端口号
- 用
ls dev/
查看挂载设备,如果存在HDF_PLATFORM_UART_1、HDF_PLATFORM_UART_3、HDF_PLATFORM_UART_4、HDF_PLATFORM_UART_6,则表示HDF_UART打开成功。