OpenHarmony 系統移植最核心的步驟是內核的移植,內核的穩定是一切子系統穩定的基礎,上一篇我們講述了內核啟動原理,以及 vendor、board 的開發配置,本文將介紹 SoC 層級的移植適配流程。
SoC 適配
SoC 配置芯片層級編譯依賴庫,包括 CMSIS、HAL(硬件抽象層)等,這里包含操作總線、串口、時鐘、寄存等庫函數。
①創建對應的文件目錄結構
目錄名稱按照芯片廠家、芯片型號來創建,比如 st 公司下的 stm32f4xx 系列芯片。
配置文件內容如下:
device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.series if?SOC_SERIES_STM32F4xx rsource?"Kconfig.liteos_m.defconfig.stm32f4xx" config?SOC_SERIES string default?"stm32f4xx" endif device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.stm32f4xx config?SOC string default?"stm32f4xx" depends?on?SOC_STM32F4xx device/soc/st/stm32f4xx/Kconfig.liteos_m.series config?SOC_SERIES_STM32F4xx bool?"STMicroelectronics?STM32F4xx?series" select?ARCH_ARM select?SOC_COMPANY_STMICROELECTRONICS select?CPU_CORTEX_M4 help Enable?support?for?STMicroelectronics?STM32F4xx?series device/soc/st/stm32f4xx/Kconfig.liteos_m.soc choice prompt?"STMicroelectronics?STM32F4xx?series?SoC" depends?on?SOC_SERIES_STM32F4xx config?SOC_STM32F407 bool?"SoC?STM32F407" Endchoice device/soc/st/Kconfig.liteos_m.defconfig rsource?"*/Kconfig.liteos_m.defconfig.series" device/soc/st/Kconfig.liteos_m.defconfig rsource?"*/Kconfig.liteos_m.series" device/soc/st/Kconfig.liteos_m.soc config?SOC_COMPANY_STMICROELECTRONICS bool if?SOC_COMPANY_STMICROELECTRONICS config?SOC_COMPANY default?"st" rsource?"*/Kconfig.liteos_m.soc" endif?#?SOC_COMPANY_STMICROELECTRONICS device/soc/st/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?=?[?"stm32f4xx"?] } } device/soc/st/stm32f4xx/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?=?[?"liteos_m",?"sdk"?] } }
②移植 HAL 庫函數等文件
對于 STM32F407 我們可以使用官方的 STM32CubeMX 生成對應的標準的 hal 庫函數文件。
勾選 Arm Cortex-M4→STM32F4→STM32F407ZGTx:
填寫工程名稱,選擇工程保存路徑,選擇 Makefile 作為編譯工具,點擊 GENERATE CODE 生成工程代碼。
使用 vscode 打開目錄,我們得到如下工程:
回顧一下之前講過的系統啟動的流程:
HAL 初始化
系統時鐘初始化
系統初始化
系統啟動
接下來我們將 HAL 庫函數文件及芯片頭文件遷移到 OH 代碼中,文件路徑如下:
將 Drivers 中的 CMSIS、STM32F4xx_HAL_Driver 復制到 /device/soc/st/stm32f4xx/sdk/Drivers 中。
③修改系統編譯配置文件
使用 OH 的 gn 以及 config 文件配置系統編譯流程以及包依賴關系,涉及到的配置文件如下:
?
device/board/alientek/explorer/liteos_m/config.gni#?Kernel? type,?e.g.?"linux",?"liteos_a",?"liteos_m".kernel_type?=?"liteos_m"#?Kernel?version.kernel_version?=?"3.0.0"#?Board?CPU? type,?e.g.?"cortex-a7",?"riscv32".board_cpu?=?"cortex-m4"#?Board?arch,?e.g.?"armv7-a",?"rv32imac".board_arch?=?""#?Toolchain?name?used? for?system?compiling.#?E.g.?gcc-arm-none-eabi,?arm-linux-harmonyeabi-gcc,?ohos-clang,?riscv32-unknown-elf.#?Note:?The?default?toolchain?is?"ohos-clang".? It's?not?mandatory?if?you?use?the?default?toolchain.board_toolchain?=?"arm-none-eabi-gcc"use_board_toolchain?=?true#?The?toolchain?path?installed,?it's? not?mandatory? if?you?have?added?toolchain? path?to?your?~/.bashrc.board_toolchain_path?=?""# ?Compiler?prefix.board_toolchain_prefix?=?"arm-none-eabi-"#?Compiler? type,?"gcc"? or?"clang".board_toolchain_type?=?"gcc" #Debug?compiler?optimization?level?optionsboard_opt_flags?=?["-mcpu=cortex-m4","-mthumb","-mfpu=fpv4-sp-d16","-mfloat-abi=hard",]#? Board?related?common?compile?flags.board_cflags?=?["-Og","-Wall","-fdata-sections","-ffunction-sections","-DSTM32F407xx","-DHAL_UART_MODULE_ENABLED"] board_cflags?+=?board_opt_flagsboard_asmflags?=?["-Og","-Wall","-fdata-sections","-ffunction-sections",] board_asmflags?+=?board_opt_flagsboard_cxx_flags?=?board_cflagsboard_ld_flags?=?["-T${ohos_root_path}device/board/alientek/explorer/liteos_m/STM32F407ZGTx_FLASH.ld"] board_ld_flags?+=?board_opt_flags#?Board?related?headfiles?search? path.board_include_dirs?=?[?"http://utils/native/lite/include"?]#?Board?adapter?dir? for?OHOS?components.board_adapter_dir?=?""這里的核心工作就是將原有的Makefile編譯文件翻譯成OH的 config.gni,可以看到有很多的編譯參數以及宏變量定義。 修改編譯依賴文件BUILD.gndevice/board/alientek/explorer/liteos_m/BUILD.gnimport("http://kernel/liteos_m/liteos.gni") module_name?=?get_path_info(rebase_path("."),?"name") kernel_module(module_name)? {sources?=?["startup_stm32f407xx.s","Src/main.c","Src/delay.c","Src/led.c","Src/sys.c","Src/usart.c","Src/stm32f4xx_hal_msp.c"," Src/stm32f4xx_it.c","Src/system_stm32f4xx.c", ]include_dirs?=?[?"Inc",]}#?"-Wl,-T"?+?rebase_path("STM32F407ZGTx_FLASH.ld"), config("public")?{ldflags?=?["-Wl,-u_printf_float"]libs?=?["c","m","nosys",]} device/soc/st/stm32f4xx/sdk/BUILD.gnimport("http://kernel/liteos_m/liteos.gni") module_name?=?"stm32f4xx_sdk"kernel_module(module_name)? {asmflags?=?board_asmflagssources?=?["Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc.c"," Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_rcc_ex.c","Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_gpio.c"," Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma_ex.c"," Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dma.c"," Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_cortex.c","Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal.c"," Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_exti.c","Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_uart.c",] include_dirs?=?["http://device/board/alientek/explorer/liteos_m/Inc"]}#指定全局頭文件搜索路徑 config("public")?{include_dirs?=?["Drivers/STM32F4xx_HAL_Driver/Inc","Drivers/CMSIS/Device/ST/STM32F4xx/Include",]}
④改造 main 函數,拉起系統內核
我們對 device/board/alientek/explorer/liteos_m/Src/main.c 文件進行如下編輯:
int?main(void) { HAL_Init();?????????????????????????/*?初始化HAL庫?*/ sys_stm32_clock_init(336,?8,?2,?7);?/*?初始化時鐘頻率168Mhz?*/ delay_init(168);????????????????????/*?延時初始化?*/ printf("hal、系統始終初始化完畢,開始啟動系統... "); RunTask(); } void?RunTask() { unsigned?int?ret; ret?=?LOS_KernelInit();??//?初始化LiteOS系統 if?(ret?!=?LOS_OK) { printf("Liteos?kernel?init?failed!?ERROR:?0x%x ",?ret); } else { LOS_Start();?//?啟動系統 } ... }? ??編譯與燒錄
使用 hb 工具進行編譯,hb set 選擇編譯目標,hb build -f 執行編譯。
日志輸出 explorer build success 表示編譯成功。 編譯過程中可能會遇到缺少某些結構體或者函數的定義,需要細心排查,注意宏定義是否打開。 STM32F407 開發板支持串口和 ST-LINK 燒錄方式,但 OH 編譯出來的是 bin 文件,bin 無法直接通過串口燒錄。
需要用到 ST-LINK 工具進行燒錄,燒錄時需要指定 flash,開始地址:0x08000000,大小:0x100000。
開始燒錄:
點亮開發板:
總結
本文主要講述了 OpenHarmony 內核的 SoC 代碼移植。因為 STM32F407 的架構和基礎 SDK 都是官方開源的,所以移植工作也較為容易。 但在實際工作中如果遇到未開源的芯片,那么需要模組或芯片廠商提供技術支持才可完成移植工作。 到這里瘦設備 OH 適配的最核心工作已完成,希望能對熱愛 OpenHarmony 的小伙伴有所幫助。 ?
關注我們
編輯:黃飛
?
評論
查看更多