您的位置 首页 热门动态

详解Board和SoC解耦的设计思路

本文简单介绍OpenHarmony轻量系统移植,Board和SoC解耦的设计思路。适合自己动手移植OpenHarmony轻量系统的朋友们。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

摘要

本文简单介绍OpenHarmony轻量系统移植,Board和SoC解耦的设计思路。适合自己动手移植OpenHarmony轻量系统的朋友们。

开始尝试讲解一下系统的移植,主要是轻量系统,也可能会顺便讲下L1移植。

对应的是 01_vendor_soc_board

详解Board和SoC解耦的设计思路

1、hb编译原理

当我们输入hb set命令后,会提示我们选择要编译构建的工程。

详解Board和SoC解耦的设计思路

那么,hb 怎么知道有哪些工程可以编译呢?

事实上这些工程都是在vendor文件夹中的,为了验证,我们可以在vendor中创建一个空的文件夹:gd,然后gd文件夹下面又创建了gd32f303_lianzhian文件夹。

但是这里还不够,一个标准简单的vendor文件夹结构如下:

详解Board和SoC解耦的设计思路

其中debug.config内容为空即可,因为它的内容是自动生成的,后面我们配置的内核的时候需要用到。

这几个文件我们可以直接复制3861的过来,然后删去我们不需要的子系统,我们只需要保留如下即可:

config.json文件:

{  \"product_name\": \"gd32f303_lianzhian\",  \"type\": \"mini\",  \"version\": \"3.0\",  \"device_company\": \"lianzhian\",  \"board\": \"gd32f303_lianzhian\",  \"kernel_type\": \"liteos_m\",  \"kernel_version\": \"\",  \"subsystems\": [   {    \"subsystem\": \"kernel\",    \"components\": [     { \"component\": \"liteos_m\",      \"features\":[      ]     }    ]   }  ],  \"third_party_dir\": \"\",  \"product_adapter_dir\": \"\"}

向右滑动查看完整代码

BUILD.gn文件:

group(\"gd32f303_lianzhian\") {}

向右滑动查看完整代码

此时,我们再去执行hb set,就可以看到我们自己创建的工程了:gd32f303_lianzhian

详解Board和SoC解耦的设计思路

2、设计思想

最新的master分支的代码设计采用Board和SoC解耦的设计思路,具体可以看这个文章:

按照硬件进行层次划分为芯片架构层、片上系统层和单板层。从下向上依次进行包含关系,例如:

(1)架构

ARMv7E-M架构具有ARM Cortex-M4, ARM Cortex-M7等CPU实现。

(2)芯片系列

ARM Cortex-M4 CPU对应的SoC Family有STmicro STM32NXP i.MX等,反过来,如图SoC Family 2跨越CPU1和CPU2,意味着一个SoC Family可以包含多个CPU实现,例如STMicro STM32可以包含Cortex-M0、Cortex-M4等CPU,又例如复杂的STM32MP157 SoC包含两个Cortex-A7 CPU核与一个Cortex-M4 CPU核,对于异构多核SoC,需要通过OpenAMP来进行分解成多个同构多核的部分。

(3)芯片与开发板对应关系

STM32 SoC Family有STM32F4、STM32G4等SoC Series。

STM32F4 SoC Series 有 STM32F401、STM32F429等SoC。

STM32F429 SoC 有 野火STM32F429挑战者开发板、正点原子stm32f429阿波罗开发板等。

如图Board 5上面还有一个shields,意味着一个Board可以通过增加扩展板的形式来提供更强的功能。例如,单板可以利用串口通信外接Hi3861模组,以提供WLAN能力。

详解Board和SoC解耦的设计思路

基于硬件结构划分层次图,OpenHarmony顶层目录结构设计如下:

详解Board和SoC解耦的设计思路

3、board配置

1)创建 board文件夹

当我们输入hb set命令后,我们选择 gd32f303_lianzhian 可以看到会提示报错:我们需要创建该文件夹:device/board/lianzhian,为啥是lianzhian ?

因为我们在vendor中的config.json中指定了device_company 设备厂家是lianzhian,大家可以回头看看,标准的board文件夹目录结构如下:

详解Board和SoC解耦的设计思路

2)Kconfig配置文件

我们可以在kernel/liteos_m内核目录下执行make menuconfig进行图形化配置,Makefile文件会遍历board下的所有Kconfig文件,所以我们需要添加对应的Kconfig文件。

这里内核是分层设计的,即厂商配置和具体开发板分开,一个厂商下面可以有多个开发板。

例如我们现在移植的设备厂商是是lianzhian,那么lianzhian是厂商文件夹,lianzhian下面有Kconfig,主要是厂商级别的配置。

然后lianzhian下面可以有多个开发板,我们这里只写了gd32f303_lianzhian开发板。同样gd32f303_lianzhian文件夹下面也有Kconfig配置文件。

3)厂商Kconfig配置文件

我们先看下lianzhian厂商的Kconfig文件

(1)Kconfig.liteos_m.boards 文件内容:

orsource \”*/Kconfig.liteos_m.board\”

可以看到很简单,事实上它就是简单的把当前目录下的所有文件夹下的Kconfig.liteos_m.board文件都导入进来。

(2)Kconfig.liteos_m.defconfig.boards文件

orsource \”*/Kconfig.liteos_m.defconfig.board\”

同样把当前目录下的所有文件夹下的Kconfig.liteos_m.defconfig.board文件都导入进来。

(3)Kconfig.liteos_m.shields 文件

这里我们暂时不需要,可以内容为空

4)具体开发板的Kconfig配置文件

我们先看下gd32f303_lianzhian厂商的Kconfig文件。

(1)Kconfig.liteos_m.board文件:

需要配置选择该单板的选项,以及它依赖的SoC

config BOARD_GD32F303_LIANZHIAN  bool \"select board gd32f303 lianzhian\"  depends on SOC_GD32F303    #只有当我们芯片型号选择为GD32F303时才可见

向右滑动查看完整代码

这里是增加一个配置选项,即后面我们可以在make menuconfig中看到\”select board gd32f303 lianzhian\”配置项。

详解Board和SoC解耦的设计思路

(2)Kconfig.liteos_m.defconfig.board 文件

需要配置选择该单板后,默认定义 BOARD 的名字,该文件我们可以留空,也可以如下配置:

if BOARD_GD32F303_LIANZHIANconfig BOARD  string  default \"gd32f303_lianzhian\"endif #BOARD_GD32F303_LIANZHIAN

向右滑动查看完整代码

(3)gd32f303_lianzhian_defconfig 文件

内容为:

LOSCFG_BOARD_GD32F303_LIANZHIAN=yLOSCFG_SOC_SERIES_GD32F303=yLOSCFG_SOC_GD32F303ZET6=y

向右滑动查看完整代码

这里表示我们选中的板卡、SOC、SOC具体子型号系列等。

5)config.gni配置文件

liteos_m文件夹下的config.gni文件是用来进行内核配置的

详解Board和SoC解耦的设计思路

该文件内容如下:

# Copyright (C) 2020 Hisilicon (Shanghai) Technologies Co., Ltd. All rights reserved.# 选择内核类型, e.g. \"linux\", \"liteos_a\", \"liteos_m\".kernel_type = \"liteos_m\"# 内核版本,留空即可.kernel_version = \"\"# 芯片架构, e.g. \"cortex-a7\", \"riscv32\".board_cpu = \"cortex-m4\"# 这里一般不用谢, 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\"# 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\"# 编译选项Board related common compile flags.board_cflags = [ \"-mcpu=cortex-m4\", \"-mfpu=fpv4-sp-d16\", \"-mfloat-abi=hard\", \"-mthumb\", \"-Og\", # \"-g\", #\"-Wall\", \"-fdata-sections\", \"-ffunction-sections\", # 注意,这里我们需要定义GD32F30X_HD宏 \"-DGD32F30X_HD\", # 我们需要浮点数计算 \"-D__FPU_PRESENT\",]board_cxx_flags = board_cflagsboard_ld_flags = []# 头文件路径,一般需要soc相关 Board related headfiles search path.board_include_dirs = [ \"${ohos_root_path}device/soc/gd32/gd32f303/liteos_m\", \"${ohos_root_path}device/soc/gd32/CMSIS\", \"${ohos_root_path}device/soc/gd32/CMSIS/GD/GD32F30x/Include\", \"${ohos_root_path}device/soc/gd32/gd32f303/GD32F3XX_Driver/Inc\", \"${ohos_root_path}device/soc/gd32/gd32f303\", \"${ohos_root_path}utils/native/lite/include\", \"${ohos_root_path}kernel/liteos_m/components/cpup\", \"${ohos_root_path}kernel/liteos_m/components/exchook\", ]# 开发板用到哪个soc Board adapter dir for OHOS components.board_adapter_dir = \"${ohos_root_path}device/soc/gd32\"# Sysroot path.board_configed_sysroot = \"\"# Board storage type, it used for file system generation.storage_type = \"\"

向右滑动查看完整代码

4、SOC配置

1)创建 SOC文件夹

我们进入到device/soc文件夹,创建 gd32文件夹,gd32文件夹内容如下:

详解Board和SoC解耦的设计思路

其中GD32官方标准库文件和CMSIS都可以在GD官网下载到,而且不需要我们修改编写,故而本节不会讲其中的内容,重点放在Kconfig配置文件中。

同样,soc也是分为芯片厂家的Kconfig 和具体芯片信号的Kconfig,gd32是芯片厂家,gd32f303只是其中的一款型号而已。

2)gd32芯片厂家Kconfig配置文件

(1)先看Kconfig.liteos_m.soc文件

config SOC_COMPANY_GD32  boolif SOC_COMPANY_GD32config SOC_COMPANY  default \"gd32\"rsource \"*/Kconfig.liteos_m.soc\"endif # SOC_COMPANY_GD32

向右滑动查看完整代码

这里很简单,就是配置我们的芯片厂商默认为 gd32,之后导入所有文件夹的 Kconfig.liteos_m.soc 配置文件。

(2)Kconfig.liteos_m.series文件

这个文件就比较简单了,导入所有文件夹的 Kconfig.liteos_m.series 配置文件

rsource \"*/Kconfig.liteos_m.series\"

向右滑动查看完整代码

(3)Kconfig.liteos_m.defconfig

同样,导入所有文件夹的Kconfig.liteos_m.defconfig

rsource \"*/Kconfig.liteos_m.defconfig.series\"

向右滑动查看完整代码

3)gd32F303芯片的Kconfig配置文件

我们来看看具体的芯片型号gd32f303的配置文件吧

(1)Kconfig.liteos_m.series文件

需要配置芯片系列,以及它的芯片架构等信息,内容:

config SOC_SERIES_GD32F303  bool \"GD32F303 chip\"  select ARM  select SOC_COMPANY_GD32  select CPU_CORTEX_M4  help    Enable support for GD32F303

向右滑动查看完整代码

这个是芯片系列的选择,我们的芯片系列是GD32F303,架构是ARM、CORTEX_M4 芯片厂家是 SOC_COMPANY_GD32,这个在上一级gd32的Kconfig配置文件中有定义。

(2)Kconfig.liteos_m.soc文件

需要配置芯片系列有多少个型号的芯片。内容:

choice  prompt \"GD32F303 series SoC\"  depends on SOC_SERIES_GD32F303 #只有选择了芯片系列SOC_SERIES_GD32F303后才会出现如下选项config SOC_GD32F303ZET6  #增加一个SOC_GD32F303ZET6选项,我们现在只有GD32F303ZET6,后面可以还有GD32F303RCT6等。  bool \"SoC GD32F303ZET6\"endchoice

向右滑动查看完整代码

(3)Kconfig.liteos_m.defconfig.series 文件

选择芯片系列后默认的配置,内容:

if SOC_SERIES_GD32F303rsource \"Kconfig.liteos_m.defconfig.gd32f303\"config SOC_SERIES  string  default \"gd32f303\"config NUM_IRQS #中断数量,跟具体芯片相关  int  default 90config SYS_CLOCK_HW_CYCLES_PER_SEC #时钟周期,GD32F303是120MHz  int  default 120000000endif

向右滑动查看完整代码

(4)Kconfig.liteos_m.defconfig.gd32f303 文件

Gd32f303的配置,内容比较简单:

config SOC  string  default \"gd32f303zet6\"  depends on SOC_GD32F303ZET6

向右滑动查看完整代码

默认是gd32f303zet6,至此我们的soc的kconfig配置基本完成。

4)内核配置头文件

还有一个比较重要的内核配置头文件,target_config.h。这个大家可以直接复制我的就行,主要是内核功能配置相关。

详解Board和SoC解耦的设计思路

其中有一个比较重要的配置项:

/** * @ingroup los_config * Memory size */#define LOSCFG_SYS_HEAP_SIZE                (60*1024)

向右滑动查看完整代码

这个是配置内核的堆栈大小,这里可以根据自己芯片的内存大小来定,GD32F303内存是64KB,这里我用60k即可。

5、make menuconfig配置

完成上面移植内容后,接下来,我们就可以进行menuconfig配置了。

注意,这里我们需要先执行一次hb set选择我们的开发板gd32f303_lianzhian。我们进入 kernel/liteos_m 文件夹执行 make menuconfig

详解Board和SoC解耦的设计思路

进入Platform,我们选择gd32f303芯片、gd32f303_lianzhian开发板,如下:

详解Board和SoC解耦的设计思路

退出保存。结果将自动保$(PRODUCT_PATH)/kernel_configs/debug.config

6、gn编译

在上一步Kconfig的图形化配置后,将其生成的配置结果可以作为gn编译的输入,以控制不同模块是否编译。另外为了解决之前gn编写时,随意include的问题,内核编译做了模块化编译的设计,使得整个编译逻辑更加清晰。

我们需要编写device/board/lianzhian 和 device/soc/gd32两个文件夹下的BUILD.gn。

这几个BUILD.gn文件比较简单,都是模块化编译,大家可以直接参考我的。

7、开始编译

配置完BUILD.gn后,我们就可以开始执行hb build -f编译了。可以看到已经能编译过一大半了:

详解Board和SoC解耦的设计思路

我们今天的目标就是要能让编译系统能开始编译我们的开发板一步一脚印,接下来我们将继续开始移植,接下来将配置libc库、系统启动、main函数、链接脚本,直到编译通过并且在开发板中成功运行~

本节Board和SoC解耦的设计思路就分享到这里了,下一篇我们给大家分享:Board、SOC、架构与代码对应关系,欢迎大家持续关注哦~

原文标题:从零移植OpenHarmony轻量系统【2】Board和SoC解耦的设计思路

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: admin

为您推荐

泰克发力5大模块,与您共同开启智能汽车的行业未来

中国北京2022年4月2日 – 泰克致力于成为智能汽车测试的领跑者,走在行业发展趋势前沿,聚焦智能座舱、自动驾驶和汽车三电领域,持续投入和专注于智能汽车测试的重要测试点,为客户提供安全、可靠、高效的智慧出行测试解决方案。一张图显示当前变革中的汽车行业面临的现状与挑战。 自动驾驶 自动驾驶汽车测试是自动驾驶研发中的重要环节,随着智能网联汽车高等级的自动化和网联化系统不断产业化落地,对测试的依赖越来越深入,尤其是面\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

施耐德电气数字化实力屡获业界权威认可 联电河间工厂恢复生产

施耐德电气数字化实力屡获业界权威认可 联电河间工厂恢复生产

Invenergy 是全球最大的可持续能源解决方案和 GE 可再生能源的私营开发商、所有者和运营商,今天宣布了 998 兆瓦的Traverse 风能中心的商业运营,该中心是美国境内最大的风电场。北美单相。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

从智能门锁看智能家居的升级:华为鸿蒙“搅局”、品牌厂商再争核心入口

电子发烧友网报道(文/莫婷婷)在2022年第一季度,陆续有终端厂商发布智能家居最新产品。3月16日,华为带来一款智能门锁,最大的亮点就是搭载了华为鸿蒙Harmony OS。3月18日,萤石发布了萤石北斗星视频锁。智能家居发展至今,正在朝着什么样的方向发展,智能门锁的智能交互又会怎样提升,我们将选取最新的智能门锁产品进行分析。   接入智能门锁,鸿蒙打通华为智能家居生态 CSHIA数据显示,2016年我国智能家居市场规模为2608亿元,在五年的时间里\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

Idaho Power将与美光合作太阳能项目 西部数据推快速缓存解决方案

Idaho Power将与美光合作太阳能项目 西部数据推快速缓存解决方案

近日,Idaho Power 将与美光合作,促进新的 40 兆瓦 (MW) 太阳能项目的建设。该项目支持美光在 2025 年底前为其美国业务采购 100% 可再生能源的目标。\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

2022年TI杯模拟邀请赛与省级大学生电赛正式启动

2022年TI杯模拟邀请赛与省级大学生电赛正式启动

2022年4月7日,上海——近日,2022年TI杯全国大学生电子设计竞赛模拟电子系统设计专题邀请赛(下简称“模拟邀请赛”)正式启动,将于2022年8月16日至20日在杭州电子科技大学举行。本次竞赛由全国大学生电子设计竞赛组委会主办,江苏省教育厅、东南大学、杭州电子科技大学承办,德州仪器(TI)协办。此外,德州仪器自2008年开始支持的TI杯省级大学生电子设计竞赛联赛(以下简称“联赛”)也进入准备阶段。   模拟邀请赛是全国大学生电子设计竞赛\” />

<meta http-equiv=X-UA-Compatible content=\"IE=edge,chrome=1

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注