浅析OpenHarmony内核SoC层级的移植适配流程

发布时间:2024-06-24  

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

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("//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# 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 = [ "//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("//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 文件进行如下编辑:


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 执行编译。

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 的小伙伴有所帮助。  


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>