1. 引言
随着RISC-V指令集架构的快速发展,基于该架构的计算机系统在工业控制、智能设备等领域得到了广泛应用[1]-[3]。润开鸿鸿锐开发板SCDAYU800A作为一款高性能的RISC-V开发平台,具备强大的AI算力和丰富的功能接口,适用于多种应用场景。OpenHarmony是一个由华为公司贡献给开放原子基金会(OpenAtom Foundation)的开源项目。它是一个全场景分布式操作系统,旨在为各种智能设备提供统一的操作体验。本文将重点探讨如何将OpenHarmony 4.1 Release版本移植到润开鸿鸿锐开发板SCDAYU800A上,并实现系统的稳定运行。
2. 润开鸿鸿锐开发板SCDAYU800A硬件特性
润开鸿鸿锐开发板SCDAYU800A具备平头哥高性能RISC-V架构曳影TH1520芯片,集成4核高性能RISC-V处理器玄铁C910架构。润开鸿鸿锐开发板SCDAYU800A的外观如图1所示。
Figure 1. Runkaihong Hongrui development board SCDAYU800A appearance
图1. 润开鸿鸿锐开发板SCDAYU800A的外观
该开发板具备以下硬件特性:
1) AI算力达4TOPs,支持蓝牙、音频、视频和摄像头等功能。
2) 支持多种视频输入输出接口,如MIPI、HDMI等。
3) 提供丰富的扩展接口,如GPIO、SPI、I2C等。
4) 适用于工控平板、智慧大屏、智能NVR、信息发布系统、云终端、车载中控等多种场景。
图2显示了润开鸿鸿锐开发板SCDAYU800A Mipi屏幕安装的方法。
Figure 2. Runkaihong Hongrui development board SCDAYU800A Mipi screen installation
图2. 润开鸿鸿锐开发板SCDAYU800A Mipi屏幕安装
3. OpenHarmony移植流程
移植就是把程序从一个运行环境转移到另一个运行环境。在主机–开发机的交叉模式下,即是把主机上的程序下载到目标机上运行。图3显示了OpenHarmony移植到SCDAYU800的流程情况。OpenHarmony版本选择必须大于3.2 Beta2以上版本。
Figure 3. Flowchart of porting OpenHarmony to SCDAYU800
图3. OpenHarmony移植到SCDAYU800的流程图
OpenHarmony的移植过程包括产品定义、工具链适配、musl库适配、内核移植、init启动子系统移植、显示适配等关键环节[4]。以下是移植步骤。
3.1. 产品定义
在OpenHarmony的移植过程中,产品定义是基础步骤。针对OpenHarmony标准系统,适配新的产品的方法是首先要在vendor、device/board和device/soc三个目录下创建产品相关的三个目录vendor/hihope/${product_name}、device/board/hihope/${product_name}和device/soc/${chip_product}/${chip},以SCDAYU800A为例,在当前产品中product_name设置为dayu800,chip_product设置为thead,chip设置为th1520。
vendor/hihope/dayu800目录主要存放厂家资料以及产品的配置文件,包括描述产品的config.json、产品的hcs配置文件以及其他配置文件等。
device/board/hihope/dayu800目录主要用于存放开发板相关的文件,包括外设驱动、启动参数、内核编译相关文件、烧录相关文件、uboot相关文件以及升级相关文件。
device/soc/thead/th1520目录主要用于存放和芯片SoC相关的文件和库,这些文件只会因芯片soc改变才会修改,而不会因为开发板变化而进行修改。
快速适配这三个仓的方法是学习能编译通过的产品,例如rk3568产品,然后将其拷贝一份,并重命名为当前产品名,然后按照以下步骤根据自己产品的特性进行逐步修改。根据上述分析,首先需要在//vendor/hihope目录下创建dayu800产品目录,并创建config.json文件,用于描述产品所使用的SOC及所需的子系统。配置文件内容如下[5]:
"product_name": "dayu800",
"device_company": "thead",
"device_build_path": "device/board/hihope/dayu800",
"target_cpu": "RISCV64",
"type": "standard",
"version": "3.0",
"board": "dayu800",
"api_version": 11,
"enable_ramdisk": true,
"build_selinux": false,
"build_seccomp": false,
"inherit": [
"vendor/hihope/dayu800/rich.json",
"vendor/hihope/dayu800/chipset_common.json"
],
"subsystems": [
{
"subsystem": "security",
"components": [
{
"component": "selinux",
"features": []
}
]
}
// 其他子系统配置
]
}
该部分根据vendor仓的定义,在//device/board/hihope目录下创建一个dayu800的产品,然后创建一个ohos.build文件定义产品的subsystem以及BUILD.gn定义产品的编译项目。
在//device/soc下根据芯片公司名称创建一个thead的仓,存放th1520 soc相关的代码和闭源库,通过//device/board/hihope/BUILD.gn添加模块进行关联编译。该仓下的ohos.build文件描述的是设备子系统,这里使用的是device_th1520,相关名称需要将拷贝过来的文件修改为当前设备的子系统名。同时需要将ohos.build的module_list下的模块及子模块中涉及的part_name和subsystem_name全部修改为device_th1520。
至此,可以通过使用如下命令,启动dayu800的构建:
./build.sh --product-name dayu800
3.2. 工具链适配
因为官方的OpenHarmony不支持RISCV64架构,因此在工具链架构的配置上相对来说配置起来比较困难,首先解决的是build仓中的架构适配,这部分仿照ARM64配置的部分进行相应的RISCV64架构添加,同时对于musl的编译配置根据RISCV64架构进行对应添加,内核的编译部分根据平头哥提供的编译工具链,使用llvm会有相关私有指令集无法编译[6]。
3.3. musl库适配
musl库是一个轻量级、高性能的C标准库(libc)实现,专为Linux系统设计。它旨在提供标准兼容性、代码简洁性和高效性,尤其适合嵌入式系统、容器化环境(如Docker)或需要高度可移植性的场景。这里首先编译musl库是因为该库依赖的模块相对最少,能最快测试RISCV64架构编译配置结果是否符合要求,该部分的编译主要涉及到build仓的配置、musl仓的RISCV64架构配置,以及musl库中有架构的代码,这一块部分从glibc中获取。
3.4. 内核移植
内核移植是OpenHarmony移植过程中的核心环节。润开鸿鸿锐开发板SCDAYU800A采用平头哥提供的Linux内核,适配OpenHarmony特性。该部分的移植既要对Linux内核本身很熟悉,同时也要对鸿蒙的内核特性宏配置很熟悉。本内核移植工作的主要思路是:
第一步是配置内核的编译流程脚本。
内核的编译是device/board/hihope/dayu800/kernel/BUILD.gn中kernel模块调用对应目录下的build_kernel.sh脚本进行编译的。该脚本的核心思想是首先拷贝内核源码到out/kernel/src_tmp/linux-5.10路径下,给内核源码中打上HDF (Hardware Driver Foundation)的补丁,然后在内核源码中创建vendor路径的软链接(主要是设备树dts和产品的外设驱动),然后将编译的config文件拷贝到arch/arm64/config路径下,将产品的dts文件拷贝到vendor/arch/arm64/boot/dts/hihope路径下,接下来将外设驱动链接到内核中,编译内核。最后拷贝编译成功的镜像到out/dayu800/packages/phone/images中。
第二步是将产品的设备树dts完整地移植过来,然后编译内核并解决相应的编译问题。
第三步是将架构代码即arch/arm64下的代码尽可能地替换成产品linux中的内容,然后编译内核并解决相应的编译问题。
在device/board/hihope/dayu800/kernel目录下进行内核编译。除内核以外的代码编译采用的是OpenHarmony版本自身的llvm工具链。
这里只列出核心编译命令。
# 首次编译请先执行下面命令
./build/prebuilts_download.sh
# 全量代码编译
./build.sh --product-name dayu800 --gn-args full_mini_debug=false --ccache
# 单模块编译
# module_name举例:"kernel:kernel",表示编译kernel目录下的kernel模块,所有后面的kernel是module_name
./build.sh --product-name dayu800 --ccache --build-target module
# 内核模块编译
./build.sh --product-name dayu800 --ccache --build-target kernel
编译成功有如下信息打印
[OHOS INFO] c overall build overlap rate: 1.05
[OHOS INFO]
[OHOS INFO]
[OHOS INFO] dayu800 build success
[OHOS INFO] cost time: 0:45:57
=====build successful=====
2025-01-18 13:06:52
++++++++++++++++++++++++++++++++++++++++
将编译后的内核打包成boot.ext4镜像文件。
第四步是将产品linux的config⽂件内的宏移植过来。
第五步是运行内核,并根据运行时问题进行逐个解决。
3.5. init启动子系统移植
在成功适配musl库和内核后,需要适配和启动第一个init进程及其初始化配置文件。主要工作包括:
1) 编译适配startup_init模块。
2) 配置启动参数,确保系统能够正常启动。
3.6. 显示适配
显示适配是系统启动的最后一步,主要包括以下内容:
1) 在shell中运行bootanimation,确保启动动画正常显示。
2) 调试OpenHarmony的Launcher模块,完成系统启动。
3) 该模块涉及的仓为graphic_graphic_2d,代码路径为foundation/graphic/graphic_2d,该模块是针对当前产品⽽适配。
4. 触摸屏驱动开发
触摸屏驱动是润开鸿鸿锐开发板SCDAYU800A的重要组成部分,其开发过程基于HDF驱动管理框架中的Input模型。触摸屏的驱动被放置在//drivers/hdf_core/framework/model/input/driver/touchscreen目录中。移植触摸屏驱动主要工作是向系统注册ChipDevice模型实例[7]。触摸屏驱动的主要工作包括:
1) 对触摸屏驱动IC进行上电、配置硬件管脚并初始化其状态。
2) 注册中断、配置通信接口(I2C或SPI)。
3) 设定Input相关配置、下载及更新固件等操作。
图4显示了润开鸿鸿锐开发板SCDAYU800A触摸屏的常用管脚。
Figure 4. Common pins of the development board SCDAYU800A touch screen
图4. 开发板SCDAYU800A触摸屏的常用管脚
润开鸿鸿锐开发板SCDAYU800A触摸屏驱动的开发过程分为以下三个步骤,这里仅列出部分代码。
4.1. 设备描述配置
在OpenHarmony中,配置(Configuration)通常指对系统、硬件或应用程序的参数、选项和功能进行定制和调整的过程,以满足特定设备或场景的需求。在HDF驱动框架下,需要在配置文件中注册驱动信息。设备描述配置主要包含Input驱动模型各模块层级信息配置文件路径为: vendor/hihope/dayu800/hdf_config/khdf/device_info/device_info.hcs,HDF框架依据该配置信息实现对Input模型各模块的依次加载。配置内容如下:
input :: host {
hostName = "input_host";
priority = 100;
device_input_manager :: device {
device0 :: deviceNode {
policy = 2; // 向外发布服务
priority = 100; // 加载优先级
preload = 0; // 加载该驱动
permission = 0660;
moduleName = "HDF_INPUT_MANAGER";
serviceName = "hdf_input_host";
deviceMatchAttr = "";
}
}
// 其他设备配置
}
4.2. 板级配置及器件私有配置
板级配置及器件私有配置文件路径为vendor/hihope/dayu800/hdf_config/khdf/input/input_config.hcs,配置内容如下:
root {
input_config {
touchConfig {
touch0 {
boardConfig {
match_attr = "touch_device1";
inputAttr {
inputType = 0; // 0代表触摸屏
solutionX = 800;
solutionY = 1280;
devName = "main_touch"; // 设备名称
}
// 其他配置
}
}
}
}
}
4.3. 添加器件驱动
在器件驱动中,主要实现平台预留的差异化接口。以数据获取及解析为例,润开鸿鸿锐开发板SCDAYU800A使用了gt911触摸屏,代码路径为: drivers/hdf_core/framework/model/input/driver/touchscreen/touch_gt911.c,部分代码如下:
static void ParsePointData(ChipDevice *device, FrameData *frame, uint8_t *buf, uint8_t pointNum)
{
int32_t resX = device->driver->boardCfg->attr.resolutionX;
int32_t resY = device->driver->boardCfg->attr.resolutionY;
// 数据解析逻辑
//器件私有配置解析
//器件设备注册到平台驱动
//调用Input HDI接口
}
图5显示了调用Input HDI的步骤。
Figure 5. Steps to call Input HDI
图5. 调用Input HDI的步骤
5. 结论
本文介绍了润开鸿鸿锐开发板SCDAYU800A的OpenHarmony操作系统的移植适配过程。在分析OpenHarmony标准系统的前提下,成功实现了OpenHarmony在润开鸿鸿锐开发板SCDAYU800A上的稳定运行。该研究为基于RISC-V架构的单板机系统开发提供了实践参考,具有一定的应用价值。