OpenHarmony瘦設(shè)備內(nèi)核移植實戰(zhàn)(二)

一、背景
OpenHarmony系統(tǒng)移植最核心的步驟是內(nèi)核的移植,內(nèi)核的穩(wěn)定是一切子系統(tǒng)穩(wěn)定的基礎(chǔ),上一篇我們一起認(rèn)識了板卡、SoC、芯片架構(gòu),并在OpenHarmony源碼中找到了對應(yīng)層面的開發(fā)路徑,本文將開始介紹實操部分。
二、內(nèi)核啟動流程梳理
確保移植前開發(fā)板的官方SDK是可以跑起來的,原有SDK通常為FreeRTOS或者其他系統(tǒng),固件的編譯有對應(yīng)編譯流程,以及系統(tǒng)啟動流程。我們要做的工作就是梳理原有系統(tǒng)啟動流程,包括:如何將固件代碼拷貝到內(nèi)存,棧針從哪里開始引導(dǎo)系統(tǒng)啟動,系統(tǒng)啟動前需要做哪些軟硬件的初始工作,然后讓OH通過這套流程跑起來。
系統(tǒng)啟動流程及原理圖:

MCU啟動工作原理圖:

1.BootLoader將系統(tǒng)程序從Flash加載到運行內(nèi)存中。
2.通過匯編指令完成系統(tǒng)啟動前的軟硬件初始化準(zhǔn)備工作。
3.初始化系統(tǒng)并啟動系統(tǒng)。
4.系統(tǒng)啟動完成。
5.完成系統(tǒng)框架層的啟動,使各個子系統(tǒng)處于可用狀態(tài)。
三、配置vendor
配置vendor,創(chuàng)建如下目錄結(jié)構(gòu)

BUILD.gn代碼如下:
group("explorer") {
}config.json代碼如下:
"product_name": "explorer",
"type": "mini",
"version": "3.0",
"device_company": "alientek",
"board": "explorer",
"kernel_type": "liteos_m",
"kernel_version": "3.0.0",
"subsystems": [
{ // 增加liteos_m內(nèi)核
"subsystem": "kernel",
"components": [
{
"component": "liteos_m",
"features":[]
}
]
},
// 這里可以繼續(xù)添加XTS子系統(tǒng)、DFX子系統(tǒng),以及其他特性子系統(tǒng)
],
"third_party_dir": "",
"product_adapter_dir": ""
}配置完成后保存,我們可以使用hb set命令嘗試編譯。

可以看到在選項中會出現(xiàn) alientek -> explorer 構(gòu)建選項。直接使用hb build -f編譯后看看結(jié)果,得到錯誤提示:需要創(chuàng)建device相關(guān)的文件。

根據(jù)報錯提示,可得知應(yīng)該是缺少device相關(guān)配置,接下來繼續(xù)創(chuàng)建device相關(guān)配置文件。
四、配置device/board
board配置板卡編譯相關(guān)的工具鏈,以及最為核心的啟動匯編命令、鏈接庫腳本,它將指定main函數(shù)來啟動系統(tǒng)。
根據(jù)配置規(guī)范,我們在device下創(chuàng)建對應(yīng)的文件夾,開發(fā)板是正點原子(alientek)的探索者(explorer),因此我們根據(jù)OH規(guī)范創(chuàng)建目錄結(jié)構(gòu),如下:

BUILD.gn 代碼如下:
if (ohos_kernel_type == "liteos_m") {
import("http://kernel/liteos_m/liteos.gni")
module_name = get_path_info(rebase_path("."), "name")
module_group(module_name) {
modules = [
"explorer",
]在/device/board/alientek/explorer/目錄下創(chuàng)建BUILD.gn文件,以及l(fā)iteos_m目錄。
BUILD.gn代碼與之前一樣。
創(chuàng)建開發(fā)板配置文件,最終得到如下目錄結(jié)構(gòu)。

配置文件代碼如下:
device/board/alientek/explorer/explorer_stm32f407_defconfig配置:
LOSCFG_BOARD_EXPLORER_STM32F407=y
LOSCFG_SOC_SERIES_STM32F407=y
LOSCFG_SOC_STM32F407=ydevice/board/alientek/explorer/Kconfig.liteos_m.board配置:
config BOARD_EXPLORER_STM32F407
bool "select board explorer stm32f407"
depends on SOC_STM32F407device/board/alientek/explorer/Kconfig.liteos_m.defconfig.board配置:
if BOARD_EXPLORER_STM32F407
config BOARD
string
default "explorer_stm32f407"
endif #BOARD_EXPLORER_STM32F407device/board/alientek/Kconfig.liteos_m.boards配置:
if SOC_STM32F407
orsource "explorer/Kconfig.liteos_m.board"
endifdevice/board/alientek/Kconfig.liteos_m.defconfig.boards配置:
orsource "*/Kconfig.liteos_m.defconfig.board"device/board/alientek/Kconfig.liteos_m.shields配置:
// 可以不用填內(nèi)容
































