Zephyr 硬件模型 v2 介绍
Zephyr v3.6.0 发布后将硬件模型切换到 v2 版本,并且计划 v3.7.0 后只支持新的硬件模型。
原因 链接到标题
原来的硬件模型如下
<SOC_ROOT>/soc/<ARCH>/<SOC_FAMILY>/...
<BOARD_ROOT>/boards/<ARCH>/<BOARD_NAME>/...
这种硬件模型主要用于单个 CPU 或单个 SMP cluster 的简单微控制器,而随着嵌入式行业的发展异构 AMP SoC 越来越多,这种硬件模型会遇到下面问题:
- 不支持一块主板有多个 SoC
- 多核异构的 SoC(虽然目前支持 AMP,无法为具有不同架构 CPU 的 AMP SoC 定义单个板目录或 SoC 目录)
- 不支持主板SoC变体
- 不支持主板选择 SoC
因此Zephyr在 2022 年 11 月提出改善对 AMP Soc 支持的计划 https://github.com/zephyrproject-rtos/zephyr/issues/51833,其中一项就是修改硬件模型 https://github.com/zephyrproject-rtos/zephyr/issues/51831
现状 链接到标题
切换到新的硬件模型是一项改动范围非常大的工作,从 2022.11 月开始一直到现在(2024.3) 都在逐步进行中, 目前 v2 模型已经进入主线。
详细细节可以参考: https://github.com/zephyrproject-rtos/zephyr/issues/51831
提交记录可以参考: https://github.com/zephyrproject-rtos/zephyr/commit/8dc3f856229ce083c956aa301c31a23e65bd8cd8
硬件模型 v2 链接到标题
v2 模型的目录结构被调整为如下,主要思想就是改以体系结构划分为供应商划分,这样异构 SoC 就不会因为含有多种体系结构的内核而不知道放那个目录合适。
<SOC_ROOT>/soc/<VENDOR>/<SOC_FAMILY>/...
<BOARD_ROOT>/<VENDOR>/<BOARD_NAME>/...
为方便说明后续将"硬件模型 v2"简称为"hwmv2"。本文后续的说明会涉及到主板目录的文件,但本文主旨不是说明如何建立 hwmv2 下的主板。
SOC 链接到标题
基本概念 链接到标题
对于一个供应商 SoC 在逻辑上的划分如下:
- Vendor: SoC 供应商
- SoC family:许多不同的 SoC 具有相似的特性和功能,并且供应商通常将它们一起命名和销售,例如 nxp 的 imx-rt 家族
- SoC series:一个或多个 SoC 或 SoC 系列具有足够的共同点,可以将它们视为相关且属于单一系列名称,例如 rt10xx 系列
- SoC: 片上系统,即包含至少一个 CPU 集群(又至少有一个 CPU 核心) 以及外设和内存的集成电路,例如 rt1062
对于一颗 SoC,其处理器的物理划分如下:
- CPU cluster: 一组一个或多个 CPU 核心,全部在同一地址空间内以对称(SMP) 配置执行同一映像。只有相同架构的 CPU 核心才能位于单个集群中。多个 CPU 集群(每个核心一个或多个) 可以共存于同一个 SoC 中。
- CPU core:具有自己的程序计数器的单个处理单元,顺序执行程序指令。 CPU 核心是 CPU 集群的一部分,CPU 集群可以包含一个或多个核心。
以上从 Vendor 到 SoC,是芯片供应商根据 SOC 的特点进行逻辑划分,从 SoC 到 core 是实际的物理构成关系,如下图:
以 nxp 为例说明 Vendor 到 SoC 的关系
以 rt1060 和 imx8m plus 为例说明 SoC 内部处理器的关系
rt1060 只有一个 CPU cluster,内部只有一个 CPU core,也就是只有一颗 Cortex-M7
imx8m plus 有三个 CPU cluster,其中一个含有 4 颗 Cortex-A53,一个含有个一颗 Cortex-M7,一个含有 1 颗 HiFi 4 的 Audio DSP
SoC hwmv2 链接到标题
Zephyr 基于上面的划分制定 hwmv2 的 soc 目录结构为 soc/<vendor>/<familys>/<series>/
例如:
对于 nxp 的 rt1062,对应的 soc 目录就是 soc/nxp/imxrt/imrt10xx
对于 nxp 的 mimx8ml8, 对应的 soc 目录就是 soc/nxp/imx/imx8m
当 soc 有多个 CPU cluster 时,且不同的 CPU cluster 下会有不同的架构实现,这时会再建立一层 CPU cluster 目录,例如针对 mimx8ml8
就在 soc/nxp/imx/imx8m
下多三个目录 adsp
,a53
, m7
。
在 familys 目录下,会放一个 soc.yml,用于描述当前 SoC familys 的组成情况,描述的最小粒度到 clusers,也就是最多到 CPU 架构,例如 zephyr/soc/nxp/imxrt/soc.yml
family:
- name: nxp_imxrt
series:
- name: imxrt10xx
socs:
- name: mimxrt1011
- name: mimxrt1015
- name: mimxrt1021
- name: mimxrt1024
- name: mimxrt1042
- name: mimxrt1051
- name: mimxrt1052
- name: mimxrt1061
- name: mimxrt1062
- name: mimxrt1064
- name: imxrt11xx
socs:
- name: mimxrt1166
cpuclusters:
- name: cm7
- name: cm4
- name: mimxrt1176
cpuclusters:
- name: cm7
- name: cm4
- name: imxrt5xx
socs:
- name: mimxrt595s
cpuclusters:
- name: cm33
- name: f1
- name: imxrt6xx
socs:
- name: mimxrt685s
nxp_imxrt 家族下含有 imxrt10xx, imxrt11xx, imxrt5xx, imxrt6xx 四个系列。imxrt10xx 系列下有 mimxrt1011~mimxrt1064 共计 10 种 SoC, imxrt11xx 系列下有 mimxrt1166 和 mimxrt1176 两种 SoC, mimxrt1166 这种 SoC 下有 cortex-m7 和 cortex-m4 两种架构的 CPU cluser。 soc.yml 的
主板 链接到标题
主板(board) ,是一个具有一组已定义的设备和功能的目标系统,可以加载并执行应用程序映像。它可以是实际的硬件系统,也可以是在 QEMU 下运行的模拟系统。一个电路板可以包含一个或多个 SoC。
Zephyr 基于vendor的划分制定 hwmv2 的 board 目录结构为 boards/<vendor>/<board_name>/
, 这里的 vendor 是指主板的供应商,例如:
对于 madmachine 制造的 mm_feather,其目录就是 boards/madmachine/mm_feather
。
在 hwmv2 下每个 board 下都会有一个 borad.yml 用于描述主板的高级元数据(例如板名称、其 SoC 和变体) 的 YAML 文件。例如下面示例就描述了 mm_feather 的供应商为 madmachine, 使用的 soc 是 mimxrt1062
board:
name: mm_feather
vendor: madmachine
socs:
- name: mimxrt1062
board.yml 的框架如下,可以针对 board 的情况进行描述
board:
name: <board-name>
vendor: <board-vendor>
revision:
format: <major.minor.patch|letter|number|custom>
default: <default-revision-value>
exact: <true|false>
revisions:
- name: <revA>
- name: <revB>
...
socs:
- name: <soc-1>
variants:
- name: <variant-1>
- name: <variant-2>
variants:
- name: <sub-variant-2-1>
...
- name: <soc-2>
...
以上的含义如下
-
board
- name: 主板名
- vendor:主板供应商
- revision:主板修订版本信息,一个主板会有多个修订版本
- socs:主板上的 soc,一个主板上可能会有多个 soc
-
revision
- format: 描述修订版 revisions 的格式,下面三种参数
- major.minor.patch: 位数的修订版本,例如 1.2.3
- number :整数修订版本, 例如 12
- letter: A 到 Z 单个字母修订版本,例如 A
- exact:精确匹配修订版本,ture 表示精确匹配,false 或者无该元素时为模糊匹配
- default:默认使用的修订版值
- revisions:下面是支持的修订版号,一个 name 对应一个版本号
- format: 描述修订版 revisions 的格式,下面三种参数
-
socs
- name:主板上 soc 的名称,可以有多个
- variants:一个 soc 支持多个变体,每个变体下面又支持多个子变体
多核支持 链接到标题
在 hwmv2 下通过 board.yml 来定义主板,使主板具有更高的灵活性。多核 SoC 的 cpu cluster,会从 soc.yml 继承,因此不需要特别列出 cpucluster,只有在多核变体需要指定使用其中cpucluster才需要列出。
下面以 zephyr/boards/nxp/imx8mp_evk/
举例说明,board.yml
内容如下
board:
name: imx8mp_evk
vendor: nxp
socs:
- name: mimx8ml8
variants:
- name: smp
cpucluster: a53
- name: ddr
cpucluster: m7
主板名为 imx8mp_evk,制造商为 nxp, 上面有一颗 mimx8nl8 的多核 soc, soc 有两个变体,一个变体叫 smp,使用 a53,另一个变体为 ddr 使用 m7。
主板的多核识别符可以用 board-name[@revision][/SoC[/CPU cluster][/variant]]
来表示。
如果不使用变体,主板多核的识别符为
- imx8mp_evk/mimx8ml8/adsp
- imx8mp_evk/mimx8ml8/a53
主板多核变体的识别符:
- imx8mp_evk/mimx8ml8/m7/ddr
- imx8mp_evk/mimx8ml8/a53/smp
同一 board 下要为多核进行不同的构建,还需要创建对应的 dts/配置文件/yaml 文件,按照如下方式进行命名
<board>_<soc>_<cpu_cluster>_<variants>_<revision>.yaml
<board>_<soc>_<cpu_cluster>_<variants>_<revision>.dts
<board>_<soc>_<cpu_cluster>_<variants>_<revision>_defconfig
例如 imx8mp_evk/mimx8ml8/m7/ddr 的如下
imx8mp_evk_mimx8ml8_m7_ddr.yaml
imx8mp_evk_mimx8ml8_m7_ddr.dts
imx8mp_evk_mimx8ml8_m7_ddr_defconfig
dts/配置文件根据多核使用硬件需求进行配置,细节不在本文的说明范围内,yaml 文件里面要指明主板的识别符,例如 imx8mp_evk_mimx8ml8_m7_ddr.yaml 的内容
identifier: imx8mp_evk/mimx8ml8/m7/ddr
name: NXP i.MX8M Plus EVK(DDR)
type: mcu
arch: arm
ram: 2048
flash: 2048
toolchain:
- zephyr
- gnuarmemb
- xtools
testing:
ignore_tags:
- net
- bluetooth
supported:
- uart
vendor: nxp
为 ddr 多核变体构建时,执行编译 west build -b imx8mp_evk/mimx8ml8/m7/ddr sample/hello_wrold
就会使用 imx8mp_evk_mimx8ml8_m7_ddr.dts
和 imx8mp_evk_mimx8ml8_m7_ddr_defconfig
进行构建。
单核支持 链接到标题
hwmv2 也能很好的兼容使用单核的 SoC,以 mm_feater 为例 zephyr/boards/madmachine/mm_feather/board.yml
board:
name: mm_feather
vendor: madmachine
socs:
- name: mimxrt1062
主板名为 mm_feather,制造商为 madmachine, 上面有一颗 mimxrt1062 的单核 soc。
对应的单核 zephyr/boards/madmachine/mm_feather/mm_feather.yaml
identifier: mm_feather
name: MM MM-FEATHER
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
- xtools
ram: 32768
flash: 8192
supported:
- counter
- sdhc
- gpio
- i2c
- dma
- uart
- pwm
- spi
vendor: nxp
可以看到其标识符号为 mm_feather,和原来的硬件模型兼容,仍然可以做 west build -b mm_feather sample/hello_world
多 SoC 支持 链接到标题
hwmv2 也引入了对一个主板上多个 SoC 的支持,以 Carbon 为例 zephyr/boards/96boards/carbon/board.yml
board:
name: 96b_carbon
vendor: 96boards
socs:
- name: stm32f401xe
- name: nrf51822
主板名为 96b_carbon,制造商为 96boards, 上面有两颗 soc,一颗为 stm32f401xe,另一颗为 nrf51822。
stm32f401xe 对应到 zephyr/boards/96boards/carbon/96b_carbon_stm32f401xe.yaml
内容为
identifier: 96b_carbon/stm32f401xe
name: 96Boards Carbon
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
- xtools
supported:
- gpio
- ble
- i2c
- counter
- spi
- usb_device
ram: 96
flash: 512
vendor: 96boards
nrf51822 对应到 zephyr/boards/96boards/carbon/96b_carbon_nrf51822.yaml
内容为
identifier: 96b_carbon/nrf51822
name: 96Boards Carbon(nRF51)
type: mcu
arch: arm
ram: 32
flash: 256
toolchain:
- zephyr
- gnuarmemb
- xtools
supported:
- ble
vendor: seeed
做 west build -b 96b_carbon/stm32f401xe app_main/
可以编译出 stm32f401xe 需要的镜像。
做 west build -b 96b_carbon/nrf51822 app_cp/
可以编译出 nrf51822 需要的镜像。
对修订版的支持 链接到标题
hwmv2 也兼容对多个主板修订版的支持,以 nucleo_f030r8 为例 zephyr/boards/st/nucleo_f030r8/board.yml
board:
name: nucleo_f030r8
vendor: st
revision:
format: number
default: "1"
revisions:
- name: "1"
- name: "2"
socs:
- name: stm32f030x8
主板名为 nucleo_f030r8,制造商为 st, 上面有一颗 stm32f030x8,主板支持两个版本,版本以数字标识分别为 1 和 2,默认使用版本 1
版本 1 对应到 zephyr/boards/st/nucleo_f030r8/nucleo_f030r8_1.yaml
内容
identifier: nucleo_f030r8
name: ST Nucleo F030R8
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
- xtools
ram: 8
flash: 64
supported:
- arduino_gpio
- arduino_i2c
- arduino_spi
- i2c
- spi
- gpio
- watchdog
- adc
testing:
ignore_tags:
- net
- bluetooth
vendor: st
版本 2 对应到 zephyr/boards/st/nucleo_f030r8/nucleo_f030r8_2.yaml
内容为
identifier: nucleo_f030r8@2
name: ST Nucleo F030R8
type: mcu
arch: arm
toolchain:
- zephyr
- gnuarmemb
- xtools
ram: 8
flash: 64
supported:
- arduino_gpio
- arduino_i2c
- arduino_spi
- i2c
- spi
- gpio
- watchdog
- adc
testing:
ignore_tags:
- net
- bluetooth
vendor: st
做 west build -b nucleo_f030r8 sample/hello
可以编译出默认主板版本 1 需要的镜像。
做 west build -b nucleo_f030r8@2 sample/hello
可以编译出主板版本 2 需要的镜像。
参考 链接到标题
https://docs.zephyrproject.org/latest/hardware/porting/board_porting.html https://github.com/zephyrproject-rtos/zephyr/files/13953224/Zephyr_arch_wg_HWMv2.pptx