0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

鸿蒙瘦设备移植:SoC适配

OpenHarmony技术社区 来源: OST开源开发者 2023-05-22 10:49 次阅读

OpenHarmony 系统移植最核心的步骤是内核的移植,内核的稳定是一切子系统稳定的基础,上一篇我们讲述了内核启动原理,以及 vendor、board 的开发配置,本文将介绍 SoC 层级的移植适配流程。

SoC 适配

SoC 配置芯片层级编译依赖库,包括 CMSIS、HAL(硬件抽象层)等,这里包含操作总线、串口、时钟、寄存等库函数。

①创建对应的文件目录结构

目录名称按照芯片厂家、芯片型号来创建,比如 st 公司下的 stm32f4xx 系列芯片。
b74ccf9e-f7fb-11ed-90ce-dac502259ad0.png

配置文件内容如下:

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("//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("//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 库函数文件。

选择 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

回顾一下之前讲过的系统启动的流程:

HAL 初始化

系统时钟初始化

系统初始化

系统启动

接下来我们将 HAL 库函数文件及芯片头文件迁移到 OH 代码中,文件路径如下:

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

将 Drivers 中的 CMSIS、STM32F4xx_HAL_Driver 复制到 /device/soc/st/stm32f4xx/sdk/Drivers 中。

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

③修改系统编译配置文件

使用 OH 的 gn 以及 config 文件配置系统编译流程以及包依赖关系,涉及到的配置文件如下:

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=["//utils/native/lite/include"]#BoardadapterdirforOHOScomponents.board_adapter_dir=""这里的核心工作就是将原有的Makefile编译文件翻译成OH的config.gni,可以看到有很多的编译参数以及宏变量定义。修改编译依赖文件BUILD.gndevice/board/alientek/explorer/liteos_m/BUILD.gnimport("//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("//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=["//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 文件进行如下编辑:

intmain(void)
{
HAL_Init();/*初始化HAL库*/
sys_stm32_clock_init(336,8,2,7);/*初始化时钟频率168Mhz*/
delay_init(168);/*延时初始化*/
printf("hal、系统始终初始化完毕,开始启动系统...
");
RunTask();
}
voidRunTask()
{
unsignedintret;
ret=LOS_KernelInit();//初始化LiteOS系统
if(ret!=LOS_OK)
{
printf("Liteoskernelinitfailed!ERROR:0x%x
",ret);
}
else
{
LOS_Start();//启动系统
}
...
}

编译与烧录

使用 hb 工具进行编译,hb set 选择编译目标,hb build -f 执行编译。

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

日志输出 explorer build success 表示编译成功。 编译过程中可能会遇到缺少某些结构体或者函数的定义,需要细心排查,注意宏定义是否打开。 STM32F407 开发板支持串口和 ST-LINK 烧录方式,但 OH 编译出来的是 bin 文件,bin 无法直接通过串口烧录。

需要用到 ST-LINK 工具进行烧录,烧录时需要指定 flash,开始地址:0x08000000,大小:0x100000。

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

开始烧录:

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

点亮开发板:

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

总结

本文主要讲述了 OpenHarmony 内核的 SoC 代码移植。因为 STM32F407 的架构和基础 SDK 都是官方开源的,所以移植工作也较为容易。 但在实际工作中如果遇到未开源的芯片,那么需要模组或芯片厂商提供技术支持才可完成移植工作。 到这里瘦设备 OH 适配的最核心工作已完成,希望能对热爱 OpenHarmony 的小伙伴有所帮助。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1309

    浏览量

    39846
  • soc
    soc
    +关注

    关注

    38

    文章

    3745

    浏览量

    215685
  • 移植
    +关注

    关注

    1

    文章

    367

    浏览量

    27854
  • 鸿蒙
    +关注

    关注

    55

    文章

    1629

    浏览量

    42120
  • OpenHarmony
    +关注

    关注

    23

    文章

    3297

    浏览量

    15159
收藏 人收藏

    评论

    相关推荐

    鸿蒙OS开发学习:【尺寸适配实现】

    鸿蒙开发中,尺寸适配是一个重要的概念,它可以帮助我们在不同屏幕尺寸的设备上正确显示和布局我们的应用程序。本文将介绍如何在鸿蒙开发中实现尺寸适配
    的头像 发表于 04-10 16:05 643次阅读
    <b class='flag-5'>鸿蒙</b>OS开发学习:【尺寸<b class='flag-5'>适配</b>实现】

    客户机和客户机整体解决方案有什么区别?

    最近不止一个人问说客户机和客户机解决方案究竟区别在哪,回答多了几遍有点烦,贴几张图上来大家自己看吧。其实很简单。就是客户机只是个终端设备,而解决方案所包含的是不仅仅有终端
    发表于 07-29 08:31

    鸿蒙适配APP要用什么开发语言?!

    请问为鸿蒙适配APP要用什么开发语言???
    发表于 09-18 15:48

    鸿蒙系统目前主要适配的芯片包括哪些?

    想了解下鸿蒙系统目前主要适配的芯片包括哪些?
    发表于 09-25 10:13

    系统移植

    目前,鸿蒙系统只是在海思芯片平台能够运行,如果需要满足 1+8+N的场景的话,就需要鸿蒙适配更多的芯片了,鸿蒙也期待更多的开发者能够移植其它
    发表于 11-24 12:03

    OpenHarmony设备内核移植实战(一)

    路径为: kernel/liteos_m/arch/arm 五、总结 OpenHarmony设备移植需要从芯片架构、SoC、开发板开始,因此本文首先讲述了三者之前的关系。
    发表于 04-24 16:04

    鸿蒙系统开始适配游戏 适配完毕的游戏会有啥体验

    鸿蒙系统最新进展情况 最近很多人都在讨论鸿蒙系统适配游戏的情况,其实我早前就已经透露过,鸿蒙系统因为有特殊的新引擎,所以每一款游戏只要适配
    的头像 发表于 01-11 09:49 3212次阅读

    RISC-V MCU开发实战 (三):移植鸿蒙OS项目

    移植鸿蒙OS项目
    的头像 发表于 11-01 11:08 2610次阅读
    RISC-V MCU开发实战 (三):<b class='flag-5'>移植</b><b class='flag-5'>鸿蒙</b>OS项目

    基于鸿蒙组件适配移植的流式布局

    项目介绍 项目名称:流式布局FlowLayout 所属系列:鸿蒙的第三方组件适配移植 功能:一种流式布局 项目移植状态:核心功能完成 调用差异:无 项目发起作者:陈丛笑 开发版本:sd
    发表于 03-21 14:32 1次下载
    基于<b class='flag-5'>鸿蒙</b>组件<b class='flag-5'>适配</b><b class='flag-5'>移植</b>的流式布局

    鸿蒙适配移植的开源SnackBar消息弹框教程

    项目介绍 项目名称:开源SnackBar消息弹框 所属系列:鸿蒙的第三方组件适配移植 功能:支持显示弹出式提醒,包括文字和点击效果 项目移植状态:完成 调用差异:无 开发版本:sdk5
    发表于 03-25 14:13 1次下载

    鸿蒙第三方组件适配移植的滑动验证码教程

    项目介绍 项目名称:滑动验证码 所属系列:鸿蒙的第三方组件适配移植 功能:实现了滑动验证的功能 可以判断验证成功或者是失败 项目移植状态:80%,
    发表于 04-02 14:34 1次下载

    基于鸿蒙适配移植的开源视频缓存引擎项目案例

    项目介绍 项目名称:开源视频缓存引擎项目 所属系列:鸿蒙的第三方组件适配移植 功能:支持自动缓存视频并在断网状态下播放视频 项目移植状态:完成 调用差异:无 开发版本:sdk5,Dev
    发表于 04-06 10:27 2次下载

    基于鸿蒙适配移植的开源弹幕解析绘制引擎项目

    项目介绍 项目名称:开源弹幕解析绘制引擎项目 所属系列:鸿蒙的第三方组件适配移植 功能:支持显示、隐藏、显示、暂停、继续、发送、定时发送弹幕 项目移植状态:完成 调用差异:无 开发版本
    发表于 04-11 10:38 2次下载

    基于鸿蒙适配移植的广告图片轮播控件教程

    项目介绍 项目名称:广告图片轮播控件 所属系列:鸿蒙的第三方组件适配移植 功能:广告轮播,循环轮播 项目移植状态:主功能 调用差异:无 开发版本:sdk5,DevEco Studio2
    发表于 04-11 10:40 2次下载

    鸿蒙设备移植指南:编译框架适配

    上一篇我们成功将 OpenHarmony 移植到小米 6 手机上,今天给大家讲解 OpenHarmony 编译部分。
    的头像 发表于 02-08 09:15 1003次阅读