基于SCDAYU800A開發(fā)板的OpenHarmony移植與適配研究
掃描二維碼
隨時隨地手機(jī)看文章
隨著RISC-V指令集架構(gòu)的快速發(fā)展,基于該架構(gòu)的計算機(jī)系統(tǒng)在工業(yè)控制、智能設(shè)備等領(lǐng)域得到了廣泛應(yīng)用[1]-[3]。潤開鴻鴻銳開發(fā)板SCDAYU800A作為一款高性能的RISC-V開發(fā)平臺,具備強(qiáng)大的AI算力和豐富的功能接口,適用于多種應(yīng)用場景。OpenHarmony是一個由華為公司貢獻(xiàn)給開放原子基金會(OpenAtom Foundation)的開源項目。它是一個全場景分布式操作系統(tǒng),旨在為各種智能設(shè)備提供統(tǒng)一的操作體驗。本文將重點探討如何將OpenHarmony 4.1 Release版本移植到潤開鴻鴻銳開發(fā)板SCDAYU800A上,并實現(xiàn)系統(tǒng)的穩(wěn)定運行。
潤開鴻鴻銳開發(fā)板SCDAYU800A具備平頭哥高性能RISC-V架構(gòu)曳影TH1520芯片,集成4核高性能RISC-V處理器玄鐵C910架構(gòu)。潤開鴻鴻銳開發(fā)板SCDAYU800A的外觀如圖1所示。
Figure 1. Runkaihong Hongrui development board SCDAYU800A appearance
圖1. 潤開鴻鴻銳開發(fā)板SCDAYU800A的外觀
該開發(fā)板具備以下硬件特性:
1) AI算力達(dá)4TOPs,支持藍(lán)牙、音頻、視頻和攝像頭等功能。
2) 支持多種視頻輸入輸出接口,如MIPI、HDMI等。
3) 提供豐富的擴(kuò)展接口,如GPIO、SPI、I2C等。
4) 適用于工控平板、智慧大屏、智能NVR、信息發(fā)布系統(tǒng)、云終端、車載中控等多種場景。
圖2顯示了潤開鴻鴻銳開發(fā)板SCDAYU800A Mipi屏幕安裝的方法。
Figure 2. Runkaihong Hongrui development board SCDAYU800A Mipi screen installation
圖2. 潤開鴻鴻銳開發(fā)板SCDAYU800A Mipi屏幕安裝
移植就是把程序從一個運行環(huán)境轉(zhuǎn)移到另一個運行環(huán)境。在主機(jī)–開發(fā)機(jī)的交叉模式下,即是把主機(jī)上的程序下載到目標(biāo)機(jī)上運行。圖3顯示了OpenHarmony移植到SCDAYU800的流程情況。OpenHarmony版本選擇必須大于3.2 Beta2以上版本。
Figure 3. Flowchart of porting OpenHarmony to SCDAYU800
圖3. OpenHarmony移植到SCDAYU800的流程圖
OpenHarmony的移植過程包括產(chǎn)品定義、工具鏈適配、musl庫適配、內(nèi)核移植、init啟動子系統(tǒng)移植、顯示適配等關(guān)鍵環(huán)節(jié)[4]。以下是移植步驟。
3.1. 產(chǎn)品定義
在OpenHarmony的移植過程中,產(chǎn)品定義是基礎(chǔ)步驟。針對OpenHarmony標(biāo)準(zhǔn)系統(tǒng),適配新的產(chǎn)品的方法是首先要在vendor、device/board和device/soc三個目錄下創(chuàng)建產(chǎn)品相關(guān)的三個目錄vendor/hihope/${product_name}、device/board/hihope/${product_name}和device/soc/${chip_product}/${chip},以SCDAYU800A為例,在當(dāng)前產(chǎn)品中product_name設(shè)置為dayu800,chip_product設(shè)置為thead,chip設(shè)置為th1520。
vendor/hihope/dayu800目錄主要存放廠家資料以及產(chǎn)品的配置文件,包括描述產(chǎn)品的config.json、產(chǎn)品的hcs配置文件以及其他配置文件等。
device/board/hihope/dayu800目錄主要用于存放開發(fā)板相關(guān)的文件,包括外設(shè)驅(qū)動、啟動參數(shù)、內(nèi)核編譯相關(guān)文件、燒錄相關(guān)文件、uboot相關(guān)文件以及升級相關(guān)文件。
device/soc/thead/th1520目錄主要用于存放和芯片SoC相關(guān)的文件和庫,這些文件只會因芯片soc改變才會修改,而不會因為開發(fā)板變化而進(jìn)行修改。
快速適配這三個倉的方法是學(xué)習(xí)能編譯通過的產(chǎn)品,例如rk3568產(chǎn)品,然后將其拷貝一份,并重命名為當(dāng)前產(chǎn)品名,然后按照以下步驟根據(jù)自己產(chǎn)品的特性進(jìn)行逐步修改。根據(jù)上述分析,首先需要在//vendor/hihope目錄下創(chuàng)建dayu800產(chǎn)品目錄,并創(chuàng)建config.json文件,用于描述產(chǎn)品所使用的SOC及所需的子系統(tǒng)。配置文件內(nèi)容如下[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",
}
]
}
// 其他子系統(tǒng)配置
]
}
該部分根據(jù)vendor倉的定義,在//device/board/hihope目錄下創(chuàng)建一個dayu800的產(chǎn)品,然后創(chuàng)建一個ohos.build文件定義產(chǎn)品的subsystem以及BUILD.gn定義產(chǎn)品的編譯項目。
在//device/soc下根據(jù)芯片公司名稱創(chuàng)建一個thead的倉,存放th1520 soc相關(guān)的代碼和閉源庫,通過//device/board/hihope/BUILD.gn添加模塊進(jìn)行關(guān)聯(lián)編譯。該倉下的ohos.build文件描述的是設(shè)備子系統(tǒng),這里使用的是device_th1520,相關(guān)名稱需要將拷貝過來的文件修改為當(dāng)前設(shè)備的子系統(tǒng)名。同時需要將ohos.build的module_list下的模塊及子模塊中涉及的part_name和subsystem_name全部修改為device_th1520。
至此,可以通過使用如下命令,啟動dayu800的構(gòu)建:
./build.sh --product-name dayu800
3.2. 工具鏈適配
因為官方的OpenHarmony不支持RISCV64架構(gòu),因此在工具鏈架構(gòu)的配置上相對來說配置起來比較困難,首先解決的是build倉中的架構(gòu)適配,這部分仿照ARM64配置的部分進(jìn)行相應(yīng)的RISCV64架構(gòu)添加,同時對于musl的編譯配置根據(jù)RISCV64架構(gòu)進(jìn)行對應(yīng)添加,內(nèi)核的編譯部分根據(jù)平頭哥提供的編譯工具鏈,使用llvm會有相關(guān)私有指令集無法編譯[6]。
3.3. musl庫適配
musl庫是一個輕量級、高性能的C標(biāo)準(zhǔn)庫(libc)實現(xiàn),專為Linux系統(tǒng)設(shè)計。它旨在提供標(biāo)準(zhǔn)兼容性、代碼簡潔性和高效性,尤其適合嵌入式系統(tǒng)、容器化環(huán)境(如Docker)或需要高度可移植性的場景。這里首先編譯musl庫是因為該庫依賴的模塊相對最少,能最快測試RISCV64架構(gòu)編譯配置結(jié)果是否符合要求,該部分的編譯主要涉及到build倉的配置、musl倉的RISCV64架構(gòu)配置,以及musl庫中有架構(gòu)的代碼,這一塊部分從glibc中獲取。
3.4. 內(nèi)核移植
內(nèi)核移植是OpenHarmony移植過程中的核心環(huán)節(jié)。潤開鴻鴻銳開發(fā)板SCDAYU800A采用平頭哥提供的Linux內(nèi)核,適配OpenHarmony特性。該部分的移植既要對Linux內(nèi)核本身很熟悉,同時也要對鴻蒙的內(nèi)核特性宏配置很熟悉。本內(nèi)核移植工作的主要思路是:
第一步是配置內(nèi)核的編譯流程腳本。
內(nèi)核的編譯是device/board/hihope/dayu800/kernel/BUILD.gn中kernel模塊調(diào)用對應(yīng)目錄下的build_kernel.sh腳本進(jìn)行編譯的。該腳本的核心思想是首先拷貝內(nèi)核源碼到out/kernel/src_tmp/linux-5.10路徑下,給內(nèi)核源碼中打上HDF (Hardware Driver Foundation)的補丁,然后在內(nèi)核源碼中創(chuàng)建vendor路徑的軟鏈接(主要是設(shè)備樹dts和產(chǎn)品的外設(shè)驅(qū)動),然后將編譯的config文件拷貝到arch/arm64/config路徑下,將產(chǎn)品的dts文件拷貝到vendor/arch/arm64/boot/dts/hihope路徑下,接下來將外設(shè)驅(qū)動鏈接到內(nèi)核中,編譯內(nèi)核。最后拷貝編譯成功的鏡像到out/dayu800/packages/phone/images中。
第二步是將產(chǎn)品的設(shè)備樹dts完整地移植過來,然后編譯內(nèi)核并解決相應(yīng)的編譯問題。
第三步是將架構(gòu)代碼即arch/arm64下的代碼盡可能地替換成產(chǎn)品linux中的內(nèi)容,然后編譯內(nèi)核并解決相應(yīng)的編譯問題。
在device/board/hihope/dayu800/kernel目錄下進(jìn)行內(nèi)核編譯。除內(nèi)核以外的代碼編譯采用的是OpenHarmony版本自身的llvm工具鏈。
這里只列出核心編譯命令。
# 首次編譯請先執(zhí)行下面命令
./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
# 內(nèi)核模塊編譯
./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
++++++++++++++++++++++++++++++++++++++++
將編譯后的內(nèi)核打包成boot.ext4鏡像文件。
第四步是將產(chǎn)品linux的config?件內(nèi)的宏移植過來。
第五步是運行內(nèi)核,并根據(jù)運行時問題進(jìn)行逐個解決。
3.5. init啟動子系統(tǒng)移植
在成功適配musl庫和內(nèi)核后,需要適配和啟動第一個init進(jìn)程及其初始化配置文件。主要工作包括:
1) 編譯適配startup_init模塊。
2) 配置啟動參數(shù),確保系統(tǒng)能夠正常啟動。
3.6. 顯示適配
顯示適配是系統(tǒng)啟動的最后一步,主要包括以下內(nèi)容:
1) 在shell中運行bootanimation,確保啟動動畫正常顯示。
2) 調(diào)試OpenHarmony的Launcher模塊,完成系統(tǒng)啟動。
3) 該模塊涉及的倉為graphic_graphic_2d,代碼路徑為foundation/graphic/graphic_2d,該模塊是針對當(dāng)前產(chǎn)品?適配。
觸摸屏驅(qū)動是潤開鴻鴻銳開發(fā)板SCDAYU800A的重要組成部分,其開發(fā)過程基于HDF驅(qū)動管理框架中的Input模型。觸摸屏的驅(qū)動被放置在//drivers/hdf_core/framework/model/input/driver/touchscreen目錄中。移植觸摸屏驅(qū)動主要工作是向系統(tǒng)注冊ChipDevice模型實例[7]。觸摸屏驅(qū)動的主要工作包括:
1) 對觸摸屏驅(qū)動IC進(jìn)行上電、配置硬件管腳并初始化其狀態(tài)。
2) 注冊中斷、配置通信接口(I2C或SPI)。
3) 設(shè)定Input相關(guān)配置、下載及更新固件等操作。
圖4顯示了潤開鴻鴻銳開發(fā)板SCDAYU800A觸摸屏的常用管腳。
Figure 4. Common pins of the development board SCDAYU800A touch screen
圖4. 開發(fā)板SCDAYU800A觸摸屏的常用管腳
潤開鴻鴻銳開發(fā)板SCDAYU800A觸摸屏驅(qū)動的開發(fā)過程分為以下三個步驟,這里僅列出部分代碼。
4.1. 設(shè)備描述配置
在OpenHarmony中,配置(Configuration)通常指對系統(tǒng)、硬件或應(yīng)用程序的參數(shù)、選項和功能進(jìn)行定制和調(diào)整的過程,以滿足特定設(shè)備或場景的需求。在HDF驅(qū)動框架下,需要在配置文件中注冊驅(qū)動信息。設(shè)備描述配置主要包含Input驅(qū)動模型各模塊層級信息配置文件路徑為: vendor/hihope/dayu800/hdf_config/khdf/device_info/device_info.hcs,HDF框架依據(jù)該配置信息實現(xiàn)對Input模型各模塊的依次加載。配置內(nèi)容如下:
input :: host {
hostName = "input_host";
priority = 100;
device_input_manager :: device {
device0 :: deviceNode {
policy = 2; // 向外發(fā)布服務(wù)
priority = 100; // 加載優(yōu)先級
preload = 0; // 加載該驅(qū)動
permission = 0660;
moduleName = "HDF_INPUT_MANAGER";
serviceName = "hdf_input_host";
deviceMatchAttr = "";
}
}
// 其他設(shè)備配置
}
4.2. 板級配置及器件私有配置
板級配置及器件私有配置文件路徑為vendor/hihope/dayu800/hdf_config/khdf/input/input_config.hcs,配置內(nèi)容如下:
root {
input_config {
touchConfig {
touch0 {
boardConfig {
match_attr = "touch_device1";
inputAttr {
inputType = 0; // 0代表觸摸屏
solutionX = 800;
solutionY = 1280;
devName = "main_touch"; // 設(shè)備名稱
}
// 其他配置
}
}
}
}
}
4.3. 添加器件驅(qū)動
在器件驅(qū)動中,主要實現(xiàn)平臺預(yù)留的差異化接口。以數(shù)據(jù)獲取及解析為例,潤開鴻鴻銳開發(fā)板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;
// 數(shù)據(jù)解析邏輯
//器件私有配置解析
//器件設(shè)備注冊到平臺驅(qū)動
//調(diào)用Input HDI接口
}
圖5顯示了調(diào)用Input HDI的步驟。
Figure 5. Steps to call Input HDI
圖5. 調(diào)用Input HDI的步驟
本文介紹了潤開鴻鴻銳開發(fā)板SCDAYU800A的OpenHarmony操作系統(tǒng)的移植適配過程。在分析OpenHarmony標(biāo)準(zhǔn)系統(tǒng)的前提下,成功實現(xiàn)了OpenHarmony在潤開鴻鴻銳開發(fā)板SCDAYU800A上的穩(wěn)定運行。該研究為基于RISC-V架構(gòu)的單板機(jī)系統(tǒng)開發(fā)提供了實踐參考,具有一定的應(yīng)用價值。