OpenHarmony瘦設備內核移植實戰(zhàn)(二)
一、背景
OpenHarmony系統移植最核心的步驟是內核的移植,內核的穩(wěn)定是一切子系統穩(wěn)定的基礎,上一篇我們一起認識了板卡、SoC、芯片架構,并在OpenHarmony源碼中找到了對應層面的開發(fā)路徑,本文將開始介紹實操部分。
二、內核啟動流程梳理
確保移植前開發(fā)板的官方SDK是可以跑起來的,原有SDK通常為FreeRTOS或者其他系統,固件的編譯有對應編譯流程,以及系統啟動流程。我們要做的工作就是梳理原有系統啟動流程,包括:如何將固件代碼拷貝到內存,棧針從哪里開始引導系統啟動,系統啟動前需要做哪些軟硬件的初始工作,然后讓OH通過這套流程跑起來。
系統啟動流程及原理圖:
MCU啟動工作原理圖:
1.BootLoader將系統程序從Flash加載到運行內存中。
2.通過匯編指令完成系統啟動前的軟硬件初始化準備工作。
3.初始化系統并啟動系統。
4.系統啟動完成。
5.完成系統框架層的啟動,使各個子系統處于可用狀態(tài)。
三、配置vendor
配置vendor,創(chuàng)建如下目錄結構
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內核
"subsystem": "kernel",
"components": [
{
"component": "liteos_m",
"features":[]
}
]
},
// 這里可以繼續(xù)添加XTS子系統、DFX子系統,以及其他特性子系統
],
"third_party_dir": "",
"product_adapter_dir": ""
}
配置完成后保存,我們可以使用hb set命令嘗試編譯。
可以看到在選項中會出現 alientek -> explorer 構建選項。直接使用hb build -f編譯后看看結果,得到錯誤提示:需要創(chuàng)建device相關的文件。
根據報錯提示,可得知應該是缺少device相關配置,接下來繼續(xù)創(chuàng)建device相關配置文件。
四、配置device/board
board配置板卡編譯相關的工具鏈,以及最為核心的啟動匯編命令、鏈接庫腳本,它將指定main函數來啟動系統。
根據配置規(guī)范,我們在device下創(chuàng)建對應的文件夾,開發(fā)板是正點原子(alientek)的探索者(explorer),因此我們根據OH規(guī)范創(chuàng)建目錄結構,如下:
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ā)板配置文件,最終得到如下目錄結構。
配置文件代碼如下:
device/board/alientek/explorer/explorer_stm32f407_defconfig配置:
LOSCFG_BOARD_EXPLORER_STM32F407=y
LOSCFG_SOC_SERIES_STM32F407=y
LOSCFG_SOC_STM32F407=y
device/board/alientek/explorer/Kconfig.liteos_m.board配置:
config BOARD_EXPLORER_STM32F407
bool "select board explorer stm32f407"
depends on SOC_STM32F407
device/board/alientek/explorer/Kconfig.liteos_m.defconfig.board配置:
if BOARD_EXPLORER_STM32F407
config BOARD
string
default "explorer_stm32f407"
endif #BOARD_EXPLORER_STM32F407
device/board/alientek/Kconfig.liteos_m.boards配置:
if SOC_STM32F407
orsource "explorer/Kconfig.liteos_m.board"
endif
device/board/alientek/Kconfig.liteos_m.defconfig.boards配置:
orsource "*/Kconfig.liteos_m.defconfig.board"
device/board/alientek/Kconfig.liteos_m.shields配置:
// 可以不用填內容