当前位置:首页 > 嵌入式 > 《嵌入式技术与智能系统》
[导读]文章详细介绍了针对润开鸿鸿锐开发板SCDAYU800A的OpenHarmony操作系统的移植适配过程。润开鸿鸿锐开发板SCDAYU800A基于平头哥高性能RISC-V架构曳影TH1520芯片,具备强大的AI算力和丰富的功能接口。通过对OpenHarmony的适配,实现了从产品定义、工具链适配到内核移植、驱动适配等关键环节的完整流程。并重点探讨了RISC-V架构下针对标准系统Linux内核的移植以及触摸屏驱动的开发,为基于RISC-V架构的嵌入式系统研究提供了实践参考。

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架构的单板机系统开发提供了实践参考,具有一定的应用价值。

参考文献

[1] RISC-V架构手册[EB/OL].
[2] 刘畅, 武延军, 吴敬征, 赵琛. RISC-V指令集架构研究综述[J]. 软件学报, 2021, 32(12): 3992-4024.
[3] 林金龙, 何小庆. 深入理解RISC-V程序开发[M]. 北京: 航空航天大学出版社, 2021.
[4] OpenHarmony官方文档[EB/OL].
[5] 润开鸿鸿锐开发板SCDAYU800A技术手册[EB/OL].
[6] HDF驱动开发框架[EB/OL]. OpenHarmony开发者社区.
[7] ITOPEN/DAYU800 [EB/OL].
本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭