移植概述
本文面向希望將 OpenHarmony 移植到三方芯片平臺(tái)硬件的開發(fā)者,介紹一種借助三方芯片平臺(tái)自帶 Linux 內(nèi)核的現(xiàn)有能力,快速移植 OpenHarmony 到三方芯片平臺(tái)的方法。
移植到三方芯片平臺(tái)的整體思路
內(nèi)核態(tài)層和用戶態(tài)層
為了更好的解釋整個(gè)內(nèi)核移植,首先需要介紹一些概念:
我們可以把 OpenHarmony 簡單的分為
OpenHarmony = OpenHarmony 內(nèi)核態(tài)層 + OpenHarmony 用戶態(tài)層
其中 OpenHarmony 內(nèi)核層就是上圖的紫色部分,可以看到,它主要由內(nèi)核本身(如 Linux Kernel,LiteOS),和一些運(yùn)行在內(nèi)核態(tài)的一些特性組成,比如 HDF 等。
而 OpenHarmony 用戶態(tài)層,在上圖,就是紫色之外的部分。可以看到,由下往上看,它主要由系統(tǒng)服務(wù)層,框架層,應(yīng)用層組成。在這兒我們將這三層整體稱為“OpenHarmony 用戶態(tài)層”。
為什么這么區(qū)分呢?因?yàn)槲覀冞@篇文章主要是要討論如何快速的把 OpenHarmony 移植到三方芯片平臺(tái)上。而 OpenHarmony 的用戶態(tài)層,整體來說和三方芯片平臺(tái)的耦合度不高,移植較為方便。
而內(nèi)核態(tài)層中的內(nèi)核本身以及 HDF 驅(qū)動(dòng)框架等,和三方芯片平臺(tái)的耦合度較高,是移植的重難點(diǎn)。我們先做這個(gè)區(qū)分,就是為了先把聚光燈打到我們最需要關(guān)注的 OpenHarmony 內(nèi)核態(tài)層上,開始分析和解題。另外說明,本文只包含 Linux 內(nèi)核的快速移植,不包含 LiteOS 的移植。
獲得內(nèi)核態(tài)層的兩種方法
為了表述方便,我們在下文部分地方用“OH”代替“OpenHarmony”。
將 OH 內(nèi)核態(tài)層繼續(xù)分解
OH 內(nèi)核態(tài)層 = OH Linux 內(nèi)核 + OH 內(nèi)核態(tài)特性(可選特性或者必選特性,如必選特性 HDF,今后的可選特性 HMDFS 等)
而 OH Linux 內(nèi)核 = 標(biāo)準(zhǔn) LTS Linux 內(nèi)核 + 三方 SoC 芯片平臺(tái)代碼 + OH 內(nèi)核態(tài)基礎(chǔ)代碼(支撐 OH 用戶態(tài)層運(yùn)行的最基礎(chǔ)代碼)
因此 OH 內(nèi)核態(tài)層 = 標(biāo)準(zhǔn) LTS Linux 內(nèi)核 + 三方 SoC 芯片平臺(tái)代碼 + OH 內(nèi)核態(tài)基礎(chǔ)代碼 + OH 內(nèi)核態(tài)特性(如 HDF)
而將前兩項(xiàng)組合,標(biāo)準(zhǔn) LTS Linux 內(nèi)核 + 三方 SoC 芯片平臺(tái)代碼,其實(shí)就是一個(gè)三方 Linux 內(nèi)核的基礎(chǔ)組成。從上面的推導(dǎo)可以看出,OpenHarmony 內(nèi)核態(tài)層其實(shí)能夠由兩種方法得到:
方法一:OH 內(nèi)核態(tài)層 = 三方 Linux 內(nèi)核 + OH 內(nèi)核態(tài)基礎(chǔ)代碼 + OH 內(nèi)核態(tài)特性(如 HDF,今后的 HMDFS 等)
也就是直接借助三方 Linux 內(nèi)核,再加上基礎(chǔ) OH 內(nèi)核態(tài)基礎(chǔ)代碼、以及 HDF 等 OH 內(nèi)核態(tài)特性。
方法二:OH 內(nèi)核態(tài)層 = OH Linux 內(nèi)核 + OH 內(nèi)核態(tài)特性(如 HDF,今后的 HMDFS 等)
也就是直接采用 OHLinux 內(nèi)核,然后再加入 OH 的其他內(nèi)核態(tài)特性。
當(dāng)前方法二中 OHLinux 內(nèi)核支持的三方芯片平臺(tái)還不夠豐富。為了能夠響應(yīng)三方開發(fā)者快速移植 OpenHarmony 的要求,下文會(huì)著重介紹方法一,即借助三方已有的 Linux 內(nèi)核,來快速移植 OpenHarmony。
借助已有 Linux 內(nèi)核來移植 OpenHarmony 的流程
整個(gè)移植流程可以分為三步:
- 準(zhǔn)備整體構(gòu)建環(huán)境,包括將三方芯片平臺(tái)的現(xiàn)有內(nèi)核代碼拷貝到 OpenHarmony 的整體編譯環(huán)境下。
- OpenHarmony 內(nèi)核態(tài)基礎(chǔ)代碼的移植。
- OpenHarmony 內(nèi)核態(tài)必選特性(如 HDF 等)的移植。
詳細(xì)步驟在接下來的章節(jié)中介紹。
移植到三方芯片平臺(tái)的步驟
下面以樹莓派 3b (BCM2837) 為例,演示將 OpenHarmony 移植到樹莓派的過程。
準(zhǔn)備整體構(gòu)建環(huán)境
- 將三方內(nèi)核納入 OpenHarmony 編譯環(huán)境。
完整編譯過一遍標(biāo)準(zhǔn) Hi3516DV300 的內(nèi)核之后,clone 樹莓派內(nèi)核源碼并復(fù)制到 manifest 輸出目錄下:export PROJ_ROOT=[OpenHarmony manifest] git clone https://gitee.com/xfan1024/oh-rpi3b-kernel.git cp -r oh-rpi3b-kernel $PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b
- 配置樹莓派內(nèi)核編譯環(huán)境。
# 進(jìn)入樹莓派kernel目錄 cd out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b # 配置編譯環(huán)境,使用工程項(xiàng)目自帶的clang export PATH=$PROJ_ROOT/prebuilts/clang/ohos/linux-x86_64/llvm/bin:$PROJ_ROOT/prebuilts/gcc/linux-x86/arm/gcc-linaro-7.5.0-arm-linux-gnueabi/bin/:$PATH export MAKE_OPTIONS="ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- CC=clang HOSTCC=clang" export PRODUCT_PATH=vendor/hisilicon/hispark_taurus_linux
- 注釋掉 clang 不識(shí)別的 flag。
PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/arch/arm/Makefile 注釋掉以下這一行:KBUILD_CFLAGS +=-fno-omit-frame-pointer -mapcs -mno-sched-prolog
移植內(nèi)核態(tài)基礎(chǔ)代碼
目前 OpenHarmony 內(nèi)核態(tài)的基礎(chǔ)代碼,主要是日志服務(wù)相關(guān)。輕量化內(nèi)核日志服務(wù)代碼包含:
drivers/staging/hilog
drivers/staging/hievent
將以上代碼,從 OpenHarmony 內(nèi)核代碼目錄 kernel/linux/linux-4.19/drivers/staging 中,拷貝到 out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b/drivers/staging 下。
在三方內(nèi)核的 drivers/staging/Kconfig 文件內(nèi)增加如下代碼:
source "drivers/staging/hilog/Kconfig"
source "drivers/staging/hievent/Kconfig"
在三方內(nèi)核的 drivers/staging/Makefile 文件內(nèi)增加如下代碼:
obj-$(CONFIG_HILOG) += hilog/
obj-$(CONFIG_HIEVENT) += hievent/
在內(nèi)核 config 項(xiàng)中打開對(duì)應(yīng)的 CONFIG 控制宏:CONFIG_HILOG 和 CONFIG_HIEVENT。
移植內(nèi)核態(tài)必選特性 HDF
-
打 HDF 補(bǔ)丁。
在 Linux 內(nèi)核打 HDF 補(bǔ)丁時(shí),執(zhí)行補(bǔ)丁 shell 腳本合入 HDF 補(bǔ)丁。- 配置 HDF 補(bǔ)丁腳本的四個(gè)變量參數(shù)。
- 獲取 patch_hdf.sh 腳本。
- 執(zhí)行 patch_hdf.sh 腳本依次傳入四個(gè)變量參數(shù)。
patch_hdf.sh 腳本四個(gè)參數(shù)含義為:第一個(gè)入?yún)楣こ谈夸浡窂?,第二入?yún)閮?nèi)核目錄路徑,第三個(gè)入?yún)閮?nèi)核版本路徑,第四個(gè)參數(shù)是當(dāng)前設(shè)備名。
./patch_hdf.sh [工程根目錄路徑] [內(nèi)核目錄路徑] [內(nèi)核補(bǔ)丁路徑] [設(shè)備名]?
以樹莓派 3b 為示例介紹:
# 進(jìn)入樹莓派kernel目錄 PROJ_ROOT/drivers/hdf_core/adapter/khdf/linux/patch_hdf.sh \ PROJ_ROOT # 指定工程根目錄路徑 \ PROJ_ROOT/out/KERNEL_OBJ/kernel/src_tmp/linux-rpi3b # 打補(bǔ)丁的內(nèi)核目錄路徑 \ PROJ_ROOT/kernel/linux/patches/linux-4.19 # 內(nèi)核補(bǔ)丁路徑.\ hi3516dv300 # 設(shè)備名.?
-
配置 config。
提供 HDF 基本配置,如果需要其他功能,通過 menuconfig 打開對(duì)應(yīng)驅(qū)動(dòng)開關(guān)即可。
HDF 補(bǔ)丁執(zhí)行成功后,默認(rèn) HDF 開關(guān)是關(guān)閉的,打開 HDF 基本配置選項(xiàng)如下:CONFIG_DRIVERS_HDF=y CONFIG_HDF_SUPPORT_LEVEL=2 CONFIG_DRIVERS_HDF_PLATFORM=y CONFIG_DRIVERS_HDF_PLATFORM_MIPI_DSI=y CONFIG_DRIVERS_HDF_PLATFORM_GPIO=y CONFIG_DRIVERS_HDF_PLATFORM_I2C=y CONFIG_DRIVERS_HDF_PLATFORM_UART=y CONFIG_DRIVERS_HDF_TEST=y
或者通過 menuconfig 界面打開 HDF 相關(guān)配置,命令如下:
# 生成 .config 配置文件 make ${MAKE_OPTIONS} rpi3b_oh_defconfig # 更改HDF內(nèi)核配置 make ${MAKE_OPTIONS} menuconfig # [*] Device Drivers # [*] HDF driver framework support --->
配置如下(在 Device Drivers -> HDF driver framework support 目錄下):
編譯 Image
# 執(zhí)行編譯命令
make ${MAKE_OPTIONS} -j33 zImage
編譯和運(yùn)行 HDF 測試用例(可選)
簡介
HDF(Hardware Driver Foundation)自測試用例,用于測試 HDF 框架和外設(shè)的基本功能,本文主要介紹 HDF 內(nèi)核態(tài)用例測試方法。
預(yù)置條件
測試前需要在 menuconfig 里檢查 HDF 測試開關(guān) CONFIG_DRIVERS_HDF_TEST=y,代碼全量編譯通過。
用例編譯和測試方法
通過?hdc_std 工具把用例執(zhí)行文件推送到設(shè)備中,然后執(zhí)行用例即可,操作步驟如下:
-
編譯 hdf 測試用例。
-
用 hdc_std 工具推送測試文件到設(shè)備中。
-
進(jìn)入設(shè)備 data/test 目錄,執(zhí)行測試文件即可。
用例編譯和測試詳細(xì)步驟如下: -
編譯 hdf 測試用例。
編譯 hdf 測試用例命令和文件路徑如下:./build.sh --product-name hispark_taurus_standard --build-target hdf_test
等待編譯完成。
-
將測試文件移動(dòng)到目標(biāo)移植設(shè)備上(以樹莓派為例)。
方法一:使用?hdc_std 工具。- 先在樹莓派里新建 data/test 目錄。
mkdir -p data/test
- 推送依賴庫和測試用例到樹莓派。
hdc file send XXX\out\{device_name}\hdf\hdf\libhdf_test_common.z.so /system/lib hdc file send XXX\out\{device_name}\tests\unittest\hdf\config\hdf_adapter_uhdf_test_config /data/test hdc file send XXX\out\{device_name}\tests\unittest\hdf\devmgr\DevMgrTest /data/test hdc file send XXX\out\{device_name}\tests\unittest\hdf\osal\OsalTest /data/test hdc file send XXX\out\{device_name}\tests\unittest\hdf\sbuf\SbufTest /data/test?
方法二:移動(dòng)到儲(chǔ)存卡內(nèi),啟動(dòng)樹莓派之后裝載。1. 拔掉樹莓派連接電腦的串口、USB 線,然后拔下數(shù)據(jù)卡。
2. 將數(shù)據(jù)卡插入到電腦的讀取口,將編譯好的 zImage 和測試文件夾 test/下載到電腦,然后移動(dòng)到數(shù)據(jù)卡的根目錄下。zImage 文件會(huì)被替換,請(qǐng)?zhí)崆白龊脗浞荨?br> 3. 最后將數(shù)據(jù)卡插回樹莓派。# 讓樹莓派文件系統(tǒng)讀取儲(chǔ)存卡根目錄 mount -t vfat /dev/block/mmcblk0p1 /boot cd /boot/[測試文件目錄] # 允許修改系統(tǒng)文件 mount -o remount,rw / # 安裝測試用庫 mv libhdf_test_common.z.so /system/lib mkdir /data/test mv * /data/test
- 先在樹莓派里新建 data/test 目錄。
-
執(zhí)行測試
- 進(jìn)入目錄執(zhí)行測試文件目錄 data/test。
cd /data/test
- 修改文件執(zhí)行權(quán)限。
chmod 777 hdf_adapter_uhdf_test_config DevMgrTest OsalTest SbufTest
- 開始測試。
./hdf_adapter_uhdf_test_config ./DevMgrTest ./OsalTest ./SbufTest
- 如果所有測試文件輸出均顯示 PASSED,那么 HDF 功能即安裝成功。
示例:DevMgrTest 用例成功結(jié)果顯示:./DevMgrTest Running main() from gmock_main.cc [==========] Running 1 test from 1 test case. [----------] Global test environment set-up. [----------] 1 test from DevMgrTest [ RUN ] DevMgrTest.DriverLoaderTest_001 [ OK ] DevMgrTest.DriverLoaderTest_001 (0 ms) [----------] 1 test from DevMgrTest (0 ms total) [----------] Global test environment tear-down Gtest xml output finished [==========] 1 test from 1 test case ran. (0 ms total) [ PASSED ] 1 test.
- 進(jìn)入目錄執(zhí)行測試文件目錄 data/test。
最后
有很多小伙伴不知道學(xué)習(xí)哪些鴻蒙開發(fā)技術(shù)?不知道需要重點(diǎn)掌握哪些鴻蒙應(yīng)用開發(fā)知識(shí)點(diǎn)?而且學(xué)習(xí)時(shí)頻繁踩坑,最終浪費(fèi)大量時(shí)間。所以有一份實(shí)用的鴻蒙(HarmonyOS NEXT)資料用來跟著學(xué)習(xí)是非常有必要的。?
這份鴻蒙(HarmonyOS NEXT)資料包含了鴻蒙開發(fā)必掌握的核心知識(shí)要點(diǎn),內(nèi)容包含了(ArkTS、ArkUI開發(fā)組件、Stage模型、多端部署、分布式應(yīng)用開發(fā)、音頻、視頻、WebGL、OpenHarmony多媒體技術(shù)、Napi組件、OpenHarmony內(nèi)核、Harmony南向開發(fā)、鴻蒙項(xiàng)目實(shí)戰(zhàn)等等)鴻蒙(HarmonyOS NEXT)技術(shù)知識(shí)點(diǎn)。
希望這一份鴻蒙學(xué)習(xí)資料能夠給大家?guī)韼椭行枰男』锇樽孕蓄I(lǐng)取,限時(shí)開源,先到先得~無套路領(lǐng)取?。?/strong>
獲取這份完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
鴻蒙(HarmonyOS NEXT)最新學(xué)習(xí)路線
-
?HarmonOS基礎(chǔ)技能
-
HarmonOS就業(yè)必備技能?
- ?HarmonOS多媒體技術(shù)
- 鴻蒙NaPi組件進(jìn)階
- HarmonOS高級(jí)技能
-
初識(shí)HarmonOS內(nèi)核?
- 實(shí)戰(zhàn)就業(yè)級(jí)設(shè)備開發(fā)
有了路線圖,怎么能沒有學(xué)習(xí)資料呢,小編也準(zhǔn)備了一份聯(lián)合鴻蒙官方發(fā)布筆記整理收納的一套系統(tǒng)性的鴻蒙(OpenHarmony )學(xué)習(xí)手冊(共計(jì)1236頁)與鴻蒙(OpenHarmony )開發(fā)入門教學(xué)視頻,內(nèi)容包含:ArkTS、ArkUI、Web開發(fā)、應(yīng)用模型、資源分類…等知識(shí)點(diǎn)。
獲取以上完整版高清學(xué)習(xí)路線,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
《鴻蒙 (OpenHarmony)開發(fā)入門教學(xué)視頻》
《鴻蒙生態(tài)應(yīng)用開發(fā)V2.0白皮書》
《鴻蒙 (OpenHarmony)開發(fā)基礎(chǔ)到實(shí)戰(zhàn)手冊》
OpenHarmony北向、南向開發(fā)環(huán)境搭建
?《鴻蒙開發(fā)基礎(chǔ)》
- ArkTS語言
- 安裝DevEco Studio
- 運(yùn)用你的第一個(gè)ArkTS應(yīng)用
- ArkUI聲明式UI開發(fā)
- .……
?《鴻蒙開發(fā)進(jìn)階》
- Stage模型入門
- 網(wǎng)絡(luò)管理
- 數(shù)據(jù)管理
- 電話服務(wù)
- 分布式應(yīng)用開發(fā)
- 通知與窗口管理
- 多媒體技術(shù)
- 安全技能
- 任務(wù)管理
- WebGL
- 國際化開發(fā)
- 應(yīng)用測試
- DFX面向未來設(shè)計(jì)
- 鴻蒙系統(tǒng)移植和裁剪定制
- ……
《鴻蒙進(jìn)階實(shí)戰(zhàn)》
- ArkTS實(shí)踐
- UIAbility應(yīng)用
- 網(wǎng)絡(luò)案例
- ……
?獲取以上完整鴻蒙HarmonyOS學(xué)習(xí)資料,請(qǐng)點(diǎn)擊→純血版全套鴻蒙HarmonyOS學(xué)習(xí)資料
總結(jié)
總的來說,華為鴻蒙不再兼容安卓,對(duì)中年程序員來說是一個(gè)挑戰(zhàn),也是一個(gè)機(jī)會(huì)。只有積極應(yīng)對(duì)變化,不斷學(xué)習(xí)和提升自己,他們才能在這個(gè)變革的時(shí)代中立于不敗之地。?文章來源:http://www.zghlxwxcb.cn/news/detail-858597.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-858597.html
到了這里,關(guān)于分享一種快速移植OpenHarmony Linux內(nèi)核的方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!