赞
踩
最近电力行业推动电鸿蒙的概念。因此我们公司开始着手在已有的MCU平台适配Openharmony系统,本人之前一直从事上层应用开发,没有相关工作经历,因此在CSDN平台记录整个工作过程,与各位共同学习
在我写这篇文章的时候,Openharmony的官网已推出4.1-release版本的源码,我之所以选择Openharmony 3.2-release版本,是因为上文提到的电鸿蒙里RK3568平台的源码是基于Openharmony 3.2-release搭建的。为了后续项目匹配电鸿蒙,我选择在Openharmony 3.2-release移植
后文对 Openharmony简称 ohos
ohos官网: https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/get-code/sourcecode-acquire.md/
官网一共有4种获取方式,我选择的是直接站点下载压缩包 : https://docs.openharmony.cn/pages/v4.1/zh-cn/release-notes/OpenHarmony-v3.2-release.md
官网提供2种开发方式,分别为基于IDE开发和命令行开发,写的很详细,但是2种开发方式都需要安装各种库和依赖,对于刚接触的人来说,不是很友好。所以在官网设备开发文档菜单栏------工具中,介绍了基于Docker编译环境 https://docs.openharmony.cn/pages/v4.0/zh-cn/device-dev/get-code/gettools-acquire.md,这种方式非常友好,只需要在本地拉取Docker镜像,就可以在基于镜像的容器中编译源码了
嫌麻烦不想读文档的,自行准备一个Ubuntu 20.04虚拟机,直接上干货
拉取Docker镜像
docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2
进入存放ohos源码的路径下,运行容器
docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/docker_oh_standard:3.2
在容器中,手动安装交叉编译工具
apt-get update && apt-get install -y gcc-arm-linux-gnueabi
建议安装交叉编译工具后,将该容器做成镜像,重新生成一次,不然每次启动,都要手动安装一次交叉编译工具
编译工程,验证源码与编译环境是否正确
./build.sh --product-name rk3568 --ccache
编译成功结果如下
rk3568平台的内核配置和预编译脚本在://device/board/hihope/rk3568/kernel/build_kernel.sh
①:复制一份内核源码
②将HDF框架补丁打入内核源码
③将支持RK3568平台的基础代码补丁打入内核源码
④复制内核源码的配置文件
执行过程分析:ohos 源码中含有原生Linux-5.10源码,将Linux内核源码拷贝出来以后,先打HDF框架补丁,在打基于RK3568平台的补丁,最后只需修改dts和驱动,重新生成一个新的补丁,替换掉原项目的补丁,就可以适配自己的板子了
基于上文提到的ohos内核编译流程解析,我们通过搭建自己的内核源码来适配飞凌的开发板
- 拷贝一份Linux-5.10原生内核源码
- 打入ohos中RK3568平台的补丁
- 修改ohos中RK3568的预编译脚本
- 修改本地代码编译内核脚本
- 将OK3568-C的设备树移植到本地内核中
- 重新生成一份Patch补丁
- 替换ohos中的补丁文件
以上操作,我已写了一个Makefile脚本,供大家参考(具体路径根据实际情况修改)
# Linux内核目录 KERNEL_SRC_TMP_PATH := ~/Documents/linux-5.10 # OpenHarmony目录相关变量 OHOS_BUILD_HOME := ~/Documents/OpenHarmony-v3.2-Release/OpenHarmony DEVICE_NAME := rk3568 KERNEL_VERSION := linux-5.10 KERNEL_SRC_PATH := $(OHOS_BUILD_HOME)/kernel/linux/${KERNEL_VERSION} DEVICE_PATCH_DIR := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION}/$(DEVICE_NAME)_patch DEVICE_PATCH_FILE := $(DEVICE_PATCH_DIR)/kernel.patch KERNEL_PATCH_PATH := $(OHOS_BUILD_HOME)/kernel/linux/patches/${KERNEL_VERSION} .PHONY: all clean copy_kernel: rm -rf $(KERNEL_SRC_TMP_PATH);mkdir -p $(KERNEL_SRC_TMP_PATH);cp -arfL $(KERNEL_SRC_PATH)/* $(KERNEL_SRC_TMP_PATH)/;cd $(KERNEL_SRC_TMP_PATH) && git init && git add . && git commit -a -sm "初始内核" kernel_patch: cd $(KERNEL_SRC_TMP_PATH) && patch -p1 < $(DEVICE_PATCH_FILE) cd $(KERNEL_SRC_TMP_PATH) && find ./* -name *.orig | xargs rm -rf && git add . && git commit -a -sm "RK3568补丁" all: make clean make copy_kernel make patch_kernel clean: rm -rf $(KERNEL_SRC_TMP_PATH)
具体操作如下:
- make copy_kernel
- make kernel_patch
- 进入ohos源码,vim //device/board/hihope/rk3568/kernel/build_kernel.sh
这里的OK-RK3568是我给飞凌自定义的板子名称,大家按自己的需求修改
- 进入本地内核源码,vim //linux-5.10/make-ohos.sh
修改为自己的设备树二进制文件
OK-RK3568:对应上文预编译脚本中的板子名称,要一致
arm64:平台
0xfe660000:串口地址
OK3568-C-linux:设备树文件名
rockchip_linux_defconfig:配置文件名
将设备树变量替换成自己的
- 将自己的设备树文件全部放在本地内核路径下 //linux-5.10/arch/arm64/boot/dts/rockchip
- git diff 初始版本的编号 HEAD > kernel.patch
- 将生成的补丁kernel.patch替换到ohos源码路径下 //kernel/linux/patches/linux-5.10/rk3568_patch
RK3568核心板上有一个LED灯是可控的,修改内核配置文件(//kernel/linux/config/linux-5.10/arch/arm64/configs)以后,编译ohos,将镜像烧写进开发板后,可以看到核心板上蓝色灯闪烁
终端打印:
如果在移植设备树文件以后,将镜像烧录到板子上内核报错:
Cannot load fstab from command line
说明找不到分区文件,如果遇到这个问题,可以私聊我寻求答案
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。