0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

鴻蒙瘦設(shè)備移植:SoC適配

OpenHarmony技術(shù)社區(qū) ? 來源: OST開源開發(fā)者 ? 2023-05-22 10:49 ? 次閱讀

OpenHarmony 系統(tǒng)移植最核心的步驟是內(nèi)核的移植,內(nèi)核的穩(wěn)定是一切子系統(tǒng)穩(wěn)定的基礎(chǔ),上一篇我們講述了內(nèi)核啟動原理,以及 vendor、board 的開發(fā)配置,本文將介紹 SoC 層級的移植適配流程。

SoC 適配

SoC 配置芯片層級編譯依賴庫,包括 CMSIS、HAL(硬件抽象層)等,這里包含操作總線、串口、時鐘、寄存等庫函數(shù)。

①創(chuàng)建對應(yīng)的文件目錄結(jié)構(gòu)

目錄名稱按照芯片廠家、芯片型號來創(chuàng)建,比如 st 公司下的 stm32f4xx 系列芯片。
b74ccf9e-f7fb-11ed-90ce-dac502259ad0.png

配置文件內(nèi)容如下:

device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.series
ifSOC_SERIES_STM32F4xx
rsource"Kconfig.liteos_m.defconfig.stm32f4xx"
configSOC_SERIES
string
default"stm32f4xx"
endif
device/soc/st/stm32f4xx/Kconfig.liteos_m.defconfig.stm32f4xx
configSOC
string
default"stm32f4xx"
dependsonSOC_STM32F4xx
device/soc/st/stm32f4xx/Kconfig.liteos_m.series
configSOC_SERIES_STM32F4xx
bool"STMicroelectronicsSTM32F4xxseries"
selectARCH_ARM
selectSOC_COMPANY_STMICROELECTRONICS
selectCPU_CORTEX_M4
help
EnablesupportforSTMicroelectronicsSTM32F4xxseries
device/soc/st/stm32f4xx/Kconfig.liteos_m.soc
choice
prompt"STMicroelectronicsSTM32F4xxseriesSoC"
dependsonSOC_SERIES_STM32F4xx
configSOC_STM32F407
bool"SoCSTM32F407"
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
configSOC_COMPANY_STMICROELECTRONICS
bool
ifSOC_COMPANY_STMICROELECTRONICS
configSOC_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 庫函數(shù)等文件

對于 STM32F407 我們可以使用官方的 STM32CubeMX 生成對應(yīng)的標(biāo)準(zhǔn)的 hal 庫函數(shù)文件。

選擇 ACCESS TO MCU SELECTOR:

b767b656-f7fb-11ed-90ce-dac502259ad0.png

勾選 Arm Cortex-M4→STM32F4→STM32F407ZGTx:

b7796a04-f7fb-11ed-90ce-dac502259ad0.png

填寫工程名稱,選擇工程保存路徑,選擇 Makefile 作為編譯工具,點擊 GENERATE CODE 生成工程代碼。

b7d566b0-f7fb-11ed-90ce-dac502259ad0.png

使用 vscode 打開目錄,我們得到如下工程:

b7faf3e4-f7fb-11ed-90ce-dac502259ad0.png

回顧一下之前講過的系統(tǒng)啟動的流程:

HAL 初始化

系統(tǒng)時鐘初始化

系統(tǒng)初始化

系統(tǒng)啟動

接下來我們將 HAL 庫函數(shù)文件及芯片頭文件遷移到 OH 代碼中,文件路徑如下:

b80d729e-f7fb-11ed-90ce-dac502259ad0.png

將 Drivers 中的 CMSIS、STM32F4xx_HAL_Driver 復(fù)制到 /device/soc/st/stm32f4xx/sdk/Drivers 中。

b84883ac-f7fb-11ed-90ce-dac502259ad0.png

③修改系統(tǒng)編譯配置文件

使用 OH 的 gn 以及 config 文件配置系統(tǒng)編譯流程以及包依賴關(guān)系,涉及到的配置文件如下:

device/board/alientek/explorer/liteos_m/config.gni#Kerneltype,e.g."linux","liteos_a","liteos_m".kernel_type="liteos_m"#Kernelversion.kernel_version="3.0.0"#BoardCPUtype,e.g."cortex-a7","riscv32".board_cpu="cortex-m4"#Boardarch,e.g."armv7-a","rv32imac".board_arch=""#Toolchainnameusedforsystemcompiling.#E.g.gcc-arm-none-eabi,arm-linux-harmonyeabi-gcc,ohos-clang,riscv32-unknown-elf.#Note:Thedefaulttoolchainis"ohos-clang".It'snotmandatoryifyouusethedefaulttoolchain.board_toolchain="arm-none-eabi-gcc"use_board_toolchain=true#Thetoolchainpathinstalled,it'snotmandatoryifyouhaveaddedtoolchainpathtoyour~/.bashrc.board_toolchain_path=""#Compilerprefix.board_toolchain_prefix="arm-none-eabi-"#Compilertype,"gcc"or"clang".board_toolchain_type="gcc"#Debugcompileroptimizationleveloptionsboard_opt_flags=["-mcpu=cortex-m4","-mthumb","-mfpu=fpv4-sp-d16","-mfloat-abi=hard",]#Boardrelatedcommoncompileflags.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#Boardrelatedheadfilessearchpath.board_include_dirs=["http://utils/native/lite/include"]#BoardadapterdirforOHOScomponents.board_adapter_dir=""這里的核心工作就是將原有的Makefile編譯文件翻譯成OH的config.gni,可以看到有很多的編譯參數(shù)以及宏變量定義。修改編譯依賴文件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 函數(shù),拉起系統(tǒng)內(nèi)核

我們對 device/board/alientek/explorer/liteos_m/Src/main.c 文件進(jìn)行如下編輯:

intmain(void)
{
HAL_Init();/*初始化HAL庫*/
sys_stm32_clock_init(336,8,2,7);/*初始化時鐘頻率168Mhz*/
delay_init(168);/*延時初始化*/
printf("hal、系統(tǒng)始終初始化完畢,開始啟動系統(tǒng)...
");
RunTask();
}
voidRunTask()
{
unsignedintret;
ret=LOS_KernelInit();//初始化LiteOS系統(tǒng)
if(ret!=LOS_OK)
{
printf("Liteoskernelinitfailed!ERROR:0x%x
",ret);
}
else
{
LOS_Start();//啟動系統(tǒng)
}
...
}

編譯與燒錄

使用 hb 工具進(jìn)行編譯,hb set 選擇編譯目標(biāo),hb build -f 執(zhí)行編譯。

b87a80aa-f7fb-11ed-90ce-dac502259ad0.png

日志輸出 explorer build success 表示編譯成功。 編譯過程中可能會遇到缺少某些結(jié)構(gòu)體或者函數(shù)的定義,需要細(xì)心排查,注意宏定義是否打開。 STM32F407 開發(fā)板支持串口和 ST-LINK 燒錄方式,但 OH 編譯出來的是 bin 文件,bin 無法直接通過串口燒錄。

需要用到 ST-LINK 工具進(jìn)行燒錄,燒錄時需要指定 flash,開始地址:0x08000000,大小:0x100000。

b89ddd8e-f7fb-11ed-90ce-dac502259ad0.png

開始燒錄:

b8d43e4c-f7fb-11ed-90ce-dac502259ad0.png

點亮開發(fā)板:

b8f033ea-f7fb-11ed-90ce-dac502259ad0.png

總結(jié)

本文主要講述了 OpenHarmony 內(nèi)核的 SoC 代碼移植。因為 STM32F407 的架構(gòu)和基礎(chǔ) SDK 都是官方開源的,所以移植工作也較為容易。 但在實際工作中如果遇到未開源的芯片,那么需要模組或芯片廠商提供技術(shù)支持才可完成移植工作。 到這里瘦設(shè)備 OH 適配的最核心工作已完成,希望能對熱愛 OpenHarmony 的小伙伴有所幫助。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1336

    瀏覽量

    40082
  • soc
    soc
    +關(guān)注

    關(guān)注

    38

    文章

    4021

    瀏覽量

    217010
  • 移植
    +關(guān)注

    關(guān)注

    1

    文章

    375

    瀏覽量

    28008
  • 鴻蒙
    +關(guān)注

    關(guān)注

    56

    文章

    2267

    瀏覽量

    42481
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3546

    瀏覽量

    15734
收藏 人收藏

    評論

    相關(guān)推薦

    Flutter 在鴻蒙系統(tǒng)上移植的小成本實現(xiàn)案例解析

    探索,成功地實現(xiàn)了 Flutter 對于鴻蒙系統(tǒng)的原生支持。 作者 | 楊超 本文經(jīng)授權(quán)轉(zhuǎn)載自美團(tuán)技術(shù)團(tuán)隊 前言 鴻蒙系統(tǒng) (HarmonyOS)是華為推出的一款面向未來、面向全場景的分布式操作系統(tǒng)。在傳統(tǒng)單設(shè)備系統(tǒng)能力的基礎(chǔ)上
    的頭像 發(fā)表于 01-26 09:55 ?4424次閱讀
    Flutter 在<b class='flag-5'>鴻蒙</b>系統(tǒng)上<b class='flag-5'>移植</b>的小成本實現(xiàn)案例解析

    鴻蒙OS開發(fā)學(xué)習(xí):【尺寸適配實現(xiàn)】

    鴻蒙開發(fā)中,尺寸適配是一個重要的概念,它可以幫助我們在不同屏幕尺寸的設(shè)備上正確顯示和布局我們的應(yīng)用程序。本文將介紹如何在鴻蒙開發(fā)中實現(xiàn)尺寸適配
    的頭像 發(fā)表于 04-10 16:05 ?1457次閱讀
    <b class='flag-5'>鴻蒙</b>OS開發(fā)學(xué)習(xí):【尺寸<b class='flag-5'>適配</b>實現(xiàn)】

    客戶機(jī)和客戶機(jī)整體解決方案有什么區(qū)別?

    最近不止一個人問說客戶機(jī)和客戶機(jī)解決方案究竟區(qū)別在哪,回答多了幾遍有點煩,貼幾張圖上來大家自己看吧。其實很簡單。就是客戶機(jī)只是個終端設(shè)備,而解決方案所包含的是不僅僅有終端
    發(fā)表于 07-29 08:31

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

    路徑為: kernel/liteos_m/arch/arm 五、總結(jié) OpenHarmony設(shè)備移植需要從芯片架構(gòu)、SoC、開發(fā)板開始,因此本文首先講述了三者之前的關(guān)系。
    發(fā)表于 04-24 16:04

    鴻蒙系統(tǒng)開始適配游戲 適配完畢的游戲會有啥體驗

    鴻蒙系統(tǒng)最新進(jìn)展情況 最近很多人都在討論鴻蒙系統(tǒng)適配游戲的情況,其實我早前就已經(jīng)透露過,鴻蒙系統(tǒng)因為有特殊的新引擎,所以每一款游戲只要適配
    的頭像 發(fā)表于 01-11 09:49 ?3379次閱讀

    基于鴻蒙組件適配移植的流式布局

    項目介紹 項目名稱:流式布局FlowLayout 所屬系列:鴻蒙的第三方組件適配移植 功能:一種流式布局 項目移植狀態(tài):核心功能完成 調(diào)用差異:無 項目發(fā)起作者:陳叢笑 開發(fā)版本:sd
    發(fā)表于 03-21 14:32 ?1次下載
    基于<b class='flag-5'>鴻蒙</b>組件<b class='flag-5'>適配</b><b class='flag-5'>移植</b>的流式布局

    鴻蒙適配移植的開源SnackBar消息彈框教程

    項目介紹 項目名稱:開源SnackBar消息彈框 所屬系列:鴻蒙的第三方組件適配移植 功能:支持顯示彈出式提醒,包括文字和點擊效果 項目移植狀態(tài):完成 調(diào)用差異:無 開發(fā)版本:sdk5
    發(fā)表于 03-25 14:13 ?1次下載

    鴻蒙第三方組件適配移植的滑動驗證碼教程

    項目介紹 項目名稱:滑動驗證碼 所屬系列:鴻蒙的第三方組件適配移植 功能:實現(xiàn)了滑動驗證的功能 可以判斷驗證成功或者是失敗 項目移植狀態(tài):80%,
    發(fā)表于 04-02 14:34 ?1次下載

    基于鴻蒙適配移植的開源視頻緩存引擎項目案例

    項目介紹 項目名稱:開源視頻緩存引擎項目 所屬系列:鴻蒙的第三方組件適配移植 功能:支持自動緩存視頻并在斷網(wǎng)狀態(tài)下播放視頻 項目移植狀態(tài):完成 調(diào)用差異:無 開發(fā)版本:sdk5,Dev
    發(fā)表于 04-06 10:27 ?2次下載

    基于openharmony適配移植的搜索控件

    項目介紹 項目名稱:SimpleSearchView 所屬系列:openharmony 第三方組件適配移植 功能:一款簡單的基于鴻蒙風(fēng)格的搜索控件 項目移植狀態(tài):主功能完成 調(diào)用差異:
    發(fā)表于 04-07 10:25 ?1次下載

    基于openharmony適配移植的圓形視圖教程

    該三方開源庫從github fork過來,主要將底層接口調(diào)用的實現(xiàn)修改成鴻蒙接口的實現(xiàn),將三方庫鴻蒙化,供開發(fā)鴻蒙應(yīng)用的開發(fā)者使用。 CircleView 包含標(biāo)題和副標(biāo)題的圓形視圖 項目移植
    發(fā)表于 04-11 09:54 ?0次下載

    基于鴻蒙適配移植的開源彈幕解析繪制引擎項目

    項目介紹 項目名稱:開源彈幕解析繪制引擎項目 所屬系列:鴻蒙的第三方組件適配移植 功能:支持顯示、隱藏、顯示、暫停、繼續(xù)、發(fā)送、定時發(fā)送彈幕 項目移植狀態(tài):完成 調(diào)用差異:無 開發(fā)版本
    發(fā)表于 04-11 10:38 ?2次下載

    基于鴻蒙適配移植的廣告圖片輪播控件教程

    項目介紹 項目名稱:廣告圖片輪播控件 所屬系列:鴻蒙的第三方組件適配移植 功能:廣告輪播,循環(huán)輪播 項目移植狀態(tài):主功能 調(diào)用差異:無 開發(fā)版本:sdk5,DevEco Studio2
    發(fā)表于 04-11 10:40 ?2次下載

    鴻蒙設(shè)備移植指南:編譯框架適配

    上一篇我們成功將 OpenHarmony 移植到小米 6 手機(jī)上,今天給大家講解 OpenHarmony 編譯部分。
    的頭像 發(fā)表于 02-08 09:15 ?1321次閱讀

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

    背景 在各行各業(yè)存在很多不同的智能設(shè)備,每個設(shè)備都使用芯片去實現(xiàn)不同的業(yè)務(wù)場景需求。本文將以常用的STM32F407ZG芯片為例,介紹OpenHarmony設(shè)備內(nèi)核
    的頭像 發(fā)表于 05-11 20:16 ?907次閱讀
    OpenHarmony<b class='flag-5'>瘦</b><b class='flag-5'>設(shè)備</b>內(nèi)核<b class='flag-5'>移植</b>實戰(zhàn)(一)