1 鸿蒙瘦设备移植:SoC适配-德赢Vwin官网 网
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 的小伙伴有所帮助。

审核编辑:汤梓红

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

    关注

    3

    文章

    1372

    浏览量

    40273
  • soc
    soc
    +关注

    关注

    38

    文章

    4161

    浏览量

    218149
  • 移植
    +关注

    关注

    1

    文章

    379

    浏览量

    28124
  • 鸿蒙
    +关注

    关注

    57

    文章

    2339

    浏览量

    42802
  • OpenHarmony
    +关注

    关注

    25

    文章

    3713

    浏览量

    16251
收藏 人收藏

    评论

    相关推荐

    Flutter 在鸿蒙系统上移植的小成本实现案例解析

    探索,成功地实现了 Flutter 对于鸿蒙系统的原生支持。 作者 | 杨超 本文经授权转载自美团技术团队 前言 鸿蒙系统 (HarmonyOS)是华为推出的一款面向未来、面向全场景的分布式操作系统。在传统单设备系统能力的基础上
    的头像 发表于 01-26 09:55 4612次阅读
    Flutter 在<b class='flag-5'>鸿蒙</b>系统上<b class='flag-5'>移植</b>的小成本实现案例解析

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

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

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

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

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

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

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

    项目介绍 项目名称:流式布局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次下载

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

    项目介绍 项目名称:SimpleSearchView 所属系列:openharmony 第三方组件适配移植 功能:一款简单的基于鸿蒙风格的搜索控件 项目移植状态:主功能完成 调用差异:
    发表于 04-07 10:25 1次下载

    基于openharmony适配移植的圆形视图教程

    该三方开源库从github fork过来,主要将底层接口调用的实现修改成鸿蒙接口的实现,将三方库鸿蒙化,供开发鸿蒙应用的开发者使用。 CircleView 包含标题和副标题的圆形视图 项目移植
    发表于 04-11 09:54 0次下载

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

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

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

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

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

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

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

    背景 在各行各业存在很多不同的智能设备,每个设备都使用芯片去实现不同的业务场景需求。本文将以常用的STM32F407ZG芯片为例,介绍OpenHarmony设备内核
    的头像 发表于 05-11 20:16 1047次阅读
    OpenHarmony<b class='flag-5'>瘦</b><b class='flag-5'>设备</b>内核<b class='flag-5'>移植</b>实战(一)

    客户机是什么?客户机能单独使用吗?

    在当今数字化办公环境中,客户机作为一种高效的终端设备,逐渐成为企业和机构的首选。那么,究竟什么是客户机呢?其实,客户机是一种特殊设计的计算机终端,与传统的个人电脑(PC)有着显著
    的头像 发表于 10-10 10:04 400次阅读