1. 概述
本文档介绍如何使用 bingo 工具构建基于 OEE (OpenEuler Embedded) 和 AST2600 芯片的 BMC 固件。
SDK 工具包(oee_sdk.zip)由 Yocto 源码构建产出,包含交叉编译器、bootloader、kernel 和 rootfs 等文件。bingo 基于这份 SDK 进行 HPM 升级包和 EMMC 烧片包的组装。
1.1 前置条件
- 操作系统:推荐 Ubuntu 22.04+ 或兼容 Linux 发行版
- bingo 工具:尚未安装时,参考 bingo 构建系统文档 了解安装方式
bingo 默认已预装在 openUBMC 开发环境中,可跳过安装步骤直接使用;如使用自定义环境则需自行安装。
1.2 架构对比
| 对比项 | 1711/1712 (RTOS) | OEE+AST2600 (OEE) |
|---|---|---|
| 系统架构 | RTOS | Linux (OpenEuler Embedded) |
| 源码构建工具 | 内部构建系统 | oebuild + bitbake (Yocto) |
| 打包工具 | gpp_header + cat | FirmwarePackager (Python) |
| 配置格式 | hpm_header.config | hpm_layout.yml (YAML) |
| Boot文件 | Hi1711_boot系列 | u-boot-spl + u-boot (组合为 mmc-bootarea.img) |
| Rootfs | RTOS文件系统 | OEE Linux rootfs (core-image-tiny-initramfs) |
| 签名方式 | 打包进固件 | 外部 CMS 签名 |
1.3 SDK工具包结构
社区归档的SDK工具包由 Yocto 构建产物打包而成,结构如下:
oee_sdk.zip
├── oee_sdk/ # Yocto 构建产物
│ ├── u-boot-spl.bin # SPL bootloader
│ ├── u-boot.bin # U-Boot
│ ├── u-boot-env.bin # U-Boot环境配置(原始)
│ ├── u-boot-env.img # U-Boot环境镜像(2M,由 u-boot-env.bin 制作)
│ ├── fitImage-obmc-phosphor-initramfs-evb-ast2600-evb-ast2600 # Linux kernel + initramfs (raw fitImage)
│ ├── fitImage.img # ext4 格式的 boot 分区镜像(内含 fitImage)
│ └── oee_rootfs.tar.gz # OEE rootfs 压缩包
└── oee_compiler/ # OEE专用编译器
└── openeuler-x86_64-obmc-armv7a-ast2600-toolchain-24.03-LTS.sh文件说明:
| 文件 | 来源 | 用途 |
|---|---|---|
u-boot-spl.bin | Yocto 构建产物 | SPL bootloader |
u-boot.bin | Yocto 构建产物 | U-Boot |
u-boot-env.bin | Yocto 构建产物 | U-Boot 环境配置(原始) |
u-boot-env.img | 由 u-boot-env.bin 通过 truncate+dd 制作 | 2M 固定大小,烧入 emmc 的 u-boot-env 分区 |
fitImage-obmc-phosphor-initramfs-${board}-${machine} | Yocto 构建产物(raw fitImage) | 用于制作 boot 分区镜像 fitImage.img |
fitImage.img | 由 mkfs.ext4 将 raw fitImage 封装为 ext4 格式 | 写入 emmc boot-a/boot-b 分区 |
oee_rootfs.tar.gz | Yocto 构建产物(rootfs) | 作为 HPM 升级包的 ROOTFS 分区 |
openeuler-x86_64-obmc-armv7a-ast2600-toolchain-24.03-LTS.sh | 预编译 OEE 交叉编译器 | 安装到 /opt/oee-sdk |
1.4 分区配置文件
构建过程涉及分区配置文件:
| 配置文件 | 用途 | 位置 |
|---|---|---|
| hpm_layout.yml | HPM升级包分区布局 | ${board_path}/hpm_layout.yml |
| emmc_layout.yml | 真机烧片包GPT分区布局 | ${board_path}/emmc_layout.yml |
配置文件差异:
| 特性 | hpm_layout.yml | emmc_layout.yml |
|---|---|---|
| 格式 | YAML列表结构 | YAML字典结构 |
| 分区设计 | 简化分区(3个) | 双备份分区(7个) |
| 用途 | HPM在线升级包 | EMMC真机烧片包 |
| 分区类型 | type编号(0,32,1) | 类型字符串(raw, ext4) |
1.5 产品仓说明
产品仓(Product Repository)是存放产品配置的 Git 仓库,包含 manifest.yml 等配置文件,地址为:
仓库目录结构如下(以 openUBMC_ast2600 产品为例):
manifest/
├── build/
│ ├── product/
│ │ └── BMC/
│ │ └── openUBMC_ast2600/ # 产品目录,即 ${product}/${board_path}
│ │ ├── hpm_layout.yml
│ │ ├── emmc_layout.yml
│ │ ├── ca/ # 签名证书目录
│ │ │ ├── rootca.crl
│ │ │ └── rootca.der
│ │ └── ...
│ └── ...
└── manifest.yml # 产品顶层配置文件manifest.yml:产品顶层配置文件,位于仓库根目录${product}:指向manifest/build/product/BMC/openUBMC_ast2600/${board_path}:与${product}相同,指向板级配置目录
2. 工具链安装
2.1 manifest.yml 配置
2.1.1 SDK下载配置
在产品仓 manifest.yml(参见 1.5 节)中配置 SDK 和工具包下载:
bmc_sdk_download:
url: "https://repo.openubmc.cn/26.03/oee_sdk/oee_sdk.zip"
sha256: "b6b870d973e5a94625daf1947df228c184ad43d391b226f53be26535416c4a48"
packages_download:
url: "https://repo.openubmc.cn/26.03/oee_sdk/packages.tar.xz"
sha256: "<sha256校验值>"2.1.2 工具安装配置
tools_install:
build_tool:
label: "local"
work_path: "~/oee_compiler"
verify: true
install:
mode: "oee"
path: "/opt/oee-sdk"
sdk_tool:
label: "local"
work_path: "~/oee_sdk"
verify: true
install:
mode: "default"
path: "${sdk_path}"配置说明:
| 配置项 | 说明 |
|---|---|
label: "local" | 使用本地已下载的工具,不执行远程下载 |
work_path | 工具存放路径,支持 ~ 路径 |
mode: "oee" | OEE模式,安装到 /opt/oee-sdk |
mode: "default" | 默认模式,直接复制到目标路径 |
2.1.3 平台配置
platform:
conan: "oee_sdk/0.0.1@openubmc.dev/dev"
options:
rtos_version: "oee_ast2600"
enable_haf: false2.2 安装命令
执行以下命令安装工具链:
bingo build -t install_sdk -b openUBMC_ast2600安装内容:
| 内容 | 安装位置 | 说明 |
|---|---|---|
| OEE编译器 | /opt/oee-sdk | arm-openeuler-linux-gnueabi交叉编译工具链 |
| SDK文件 | ${sdk_path} | u-boot、kernel、rootfs等 |
| Conan制品缓存 | conan缓存目录 | 平台组件编译包 |
| Profile | ~/.conan2/profiles/profile_oee.ini | 构建配置文件 |
2.3 安装验证
# 查看编译器版本
arm-openeuler-linux-gnueabi-gcc --version
# 查看SDK文件
ls ~/oee_sdk/3. 组件适配
openUBMC 平台相关的 BMC 组件(如 libmcpp/1.2.128@openubmc/stable)支持使用 OEE 交叉编译工具链进行编译。以下说明组件适配流程。
3.1 Profile配置
OEE构建使用专用profile文件 profile_oee.ini(存放于产品仓根目录,参见 1.5 节),关键配置:
[settings]
os=Linux
arch=armv7hf
compiler=gcc
compiler.version=12.3
compiler.libcxx=libstdc++11
build_type=Release
[buildenv]
# 编译器路径
CC=arm-openeuler-linux-gnueabi-gcc
CXX=arm-openeuler-linux-gnueabi-g++
# Sysroot路径
CONAN_CMAKE_SYSROOT=/opt/oee-sdk/sysroots/armv7a-vfp-openeuler-linux-gnueabi/3.2 构建命令
# 需在组件仓根目录(conanfile.py 所在目录)下执行
bingo build -pr profile_oee.ini3.3 构件适配要点
以下编译参数需在 profile_oee.ini 中配置:
| 要点 | 说明 | profile_oee.ini 配置示例 |
|---|---|---|
| 编译器 | 使用 arm-openeuler-linux-gnueabi-gcc | CC=arm-openeuler-linux-gnueabi-gcc |
| Sysroot | 链接OEE sysroot库 | CONAN_CMAKE_SYSROOT=/opt/oee-sdk/sysroots/armv7a-vfp-openeuler-linux-gnueabi/ |
| C标准 | 使用 -std=gnu11 | CFLAGS=-std=gnu11 |
| C++标准 | 使用 -std=c++17 | CXXFLAGS=-std=c++17 |
| ABI | _GLIBCXX_USE_CXX11_ABI=0 | CXXFLAGS=-D_GLIBCXX_USE_CXX11_ABI=0 |
4. 产品构建
4.1 manifest.yml 完整配置
以下为构建配置中使用的变量说明:
| 变量 | 含义 | 默认值/示例 |
|---|---|---|
${sdk_path} | SDK工具包安装路径 | ~/oee_sdk(由 tools_install.sdk_tool.work_path 指定) |
${work_out} | 构建输出目录 | 由 bingo 自动设置,通常为构建工作区下的 output/ 目录 |
${product} | 产品配置目录 | manifest/build/product/BMC/openUBMC_ast2600/ |
${board_path} | 板级配置目录 | ${product}(与 product 相同) |
schema: /usr/share/bingo/schema/manifest.schema.json
platform:
conan: "oee_sdk/0.0.1@openubmc.dev/dev"
options:
rtos_version: "oee_ast2600"
base:
version: "26.06.00.01"
customization: "customization/prototype.py"
signature:
files:
- file: ${product}/ca/rootca.crl
dst: cms.crl
profile: "profile_oee.ini"
bmc_sdk_download:
url: "https://repo.openubmc.cn/26.03/oee_sdk/oee_sdk.zip"
sha256: "<sha256>"
tools_install:
build_tool:
label: "local"
work_path: "~/oee_compiler"
install:
mode: "oee"
path: "/opt/oee-sdk"
sdk_tool:
label: "local"
work_path: "~/oee_sdk"
install:
mode: "default"
path: "${sdk_path}"
gpp:
gpt_config: "${board_path}/emmc_layout.yml"
files:
- file: ${sdk_path}/oee_rootfs.tar.gz
- file: ${sdk_path}/fitImage-obmc-phosphor-initramfs-${board}-${machine}
dst: kernel.bin
- file: ${sdk_path}/u-boot-spl.bin
- file: ${sdk_path}/u-boot.bin
- file: ${sdk_path}/u-boot-env.img
- file: ${sdk_path}/fitImage.img
- file: ${work_out}/rootfs_BMC.img
- file: ${work_out}/rootfs_BMC.tar.gz
- file: ${work_out}/rootfs_BMC.img.cms
- file: ${product}/ca/rootca.crl
dst: cms.crl
- file: ${product}/ca/rootca.der
dst: rootca.der
dependencies:
- conan: help
kernel.bin使用 SDK 中的 raw fitImage 文件重命名而来,而非fitImage.img。
4.2 HPM包分区配置 (hpm_layout.yml)
HPM升级包的分区布局配置,位于 ${board_path}/hpm_layout.yml:
firmwares:
type: "hpm"
top_header:
size: 512 # Top Header大小(字节)
reserved: "" # 预留字段,最多15字节字符串
partitions:
- partition: BOOT
file: mmc-bootarea.img
type: 0 # 分区类型编号
site: 0 # 分区偏移,0表示自动计算
size: 0 # 分区大小,0表示按文件实际大小
- partition: KERNEL
file: kernel.bin
type: 32
site: 0
size: 0
- partition: ROOTFS
file: rootfs_BMC.tar.gz
type: 1
site: 0
size: 0配置说明:
| 字段 | 说明 | 备注 |
|---|---|---|
type: "hpm" | 固件类型标识 | 用于区分固件类型 |
top_header.size | Top Header大小 | 固定512字节 |
top_header.reserved | 预留字符串 | 最多15字节,用于标识固件信息 |
partition | 分区名称 | 用于日志和调试 |
file | 分区文件名 | 相对于构建目录 |
type | 分区类型编号 | 用于区分分区类型(BOOT=0, ROOTFS=1, KERNEL=32等) |
site | 分区偏移(字节) | 0表示自动计算,强制512字节对齐 |
size | 分区大小(字节) | 0表示按文件实际大小 |
分区说明:
| 分区 | 文件 | 类型编号 | 说明 |
|---|---|---|---|
| BOOT | mmc-bootarea.img | 0 | u-boot组合镜像(SPL + u-boot) |
| KERNEL | kernel.bin | 32 | Linux kernel + initramfs |
| ROOTFS | rootfs_BMC.tar.gz | 1 | BMC rootfs压缩包 |
4.3 真机烧片包分区配置 (emmc_layout.yml)
真机EMMC烧片包的GPT分区布局配置,位于 ${board_path}/emmc_layout.yml:
partitions:
settings:
sector_size: 512 # 扇区大小(字节),可选值: 512, 4096
gpt_header_sectors: 34 # GPT头占用扇区数
header_offset: 0x5000 # 数据头偏移(字节),首个分区起始位置
alignment: 1 # 分区对齐(扇区数),1表示不强制对齐
total_size: auto # 镜像总大小,auto自动计算,可指定如 512M
power_of_two_align: true # 镜像大小2次幂对齐
partition:
u-boot-env:
size: 2M # 分区大小
type: raw # 类型: raw, ext4
file: u-boot-env.img # 分区镜像文件名
boot-a:
size: 32M
type: ext4
file: fitImage.img
label: boot-a # 文件系统标签(可选)
boot-b:
size: 32M
type: ext4
file: fitImage.img
rofs-a:
size: 385028KB
type: ext4
file: rootfs_BMC.img
rofs-b:
size: 385028KB
type: ext4
file: rootfs_BMC.img
rwfs:
size: 200M
type: ext4
file: datafs.img
pflash:
size: 2M
type: rawSettings配置说明:
| 字段 | 说明 | 默认值 |
|---|---|---|
sector_size | 扇区大小(字节) | 512 |
gpt_header_sectors | GPT头占用扇区数 | 34 |
header_offset | 数据区起始偏移(字节) | 0(从GPT头后开始) |
alignment | 分区对齐(扇区数) | 1(不强制对齐) |
total_size | 镜像总大小 | auto(自动计算) |
power_of_two_align | 镜像大小2次幂对齐 | true |
分区说明:
| 分区 | 大小 | 类型 | 文件 | 说明 |
|---|---|---|---|---|
| u-boot-env | 2M | raw | u-boot-env.img | U-Boot环境变量分区 |
| boot-a | 32M | ext4 | fitImage.img | A分区kernel镜像 |
| boot-b | 32M | ext4 | fitImage.img | B分区kernel镜像(双备份) |
| rofs-a | 385028KB | ext4 | rootfs_BMC.img | A分区rootfs镜像 |
| rofs-b | 385028KB | ext4 | rootfs_BMC.img | B分区rootfs镜像(双备份) |
| rwfs | 200M | ext4 | datafs.img | 可读写数据分区 |
| pflash | 2M | raw | - | 保留分区(无文件) |
4.4 构建命令
# 默认构建,生成 HPM 升级包、真机 emmc 烧片包 (.wic) 和 qemu 仿真包 (.img)
bingo build -b openUBMC_ast26004.5 构建产物
| 产物文件 | 说明 |
|---|---|
rootfs_openUBMC_ast2600.hpm | HPM升级包 |
openUBMC_ast2600_real.wic | 真机emmc烧片包 |
openUBMC_ast2600_real.img | qemu仿真包 |
5. 其他配置
5.1 签名配置
OEE 固件包支持 CMS 签名,用于升级包的完整性校验。签名流程由 bingo 自动完成:构建时若环境存在 signatrust-client,则根据 manifest.yml 中配置的签名策略自动调用签名服务,对 rootfs_BMC.img 进行 CMS 分离签名,生成 rootfs_BMC.img.cms。
产品仓中 base.signature 仅配置证书吊销列表的分发:
base:
signature:
files:
- file: ${product}/ca/rootca.crl
dst: cms.crl证书文件(rootca.der、rootca.crl)通过 gpp.files 打包进固件:
gpp:
files:
# rootfs_BMC.img的cms签名文件
- file: ${work_out}/rootfs_BMC.img.cms
# 签名文件的证书吊销列表
- file: ${product}/ca/rootca.crl
dst: cms.crl
# 签名的根证书
- file: ${product}/ca/rootca.der
dst: rootca.der签名相关文件说明:
| 文件 | 格式 | 用途 |
|---|---|---|
rootfs_BMC.img.cms | CMS | rootfs 签名文件(由 bingo 自动生成) |
rootca.der | DER | 根证书,用于验签 |
rootca.crl | DER | 证书吊销列表 |
更详细的签名说明参考:
- bingo支持固件完整性保护签名能力
- cms_sign Demo — 包含自制签名证书链、签名服务器搭建、
bingo simple_sign签名验证等完整流程
6. 常见问题
6.1 SDK下载许可协议
首次下载SDK需要同意许可协议:
# 设置环境变量自动同意
export OPENUBMC_LICENSE=true
# 或交互式确认
bingo build -t install_sdk -b openUBMC_ast2600
# 输入 Y 同意协议6.2 编译器路径问题
如果 ~/oee_compiler 路径不正确,检查:
# 确认编译器位置
ls ~/oee_compiler/6.3 GPT镜像文件大小不足
GPT镜像构建时,文件小于分区大小会自动补0填充:
分区 ROOTFS 文件大小不足,补0填充: 实际 50000000 字节 -> 目标 134217728 字节6.4 分区配置文件位置
分区配置文件默认位置:
| 配置文件 | 默认位置 | 说明 |
|---|---|---|
| hpm_layout.yml | ${board_path}/hpm_layout.yml | HPM升级包分区配置 |
| emmc_layout.yml | ${board_path}/emmc_layout.yml | 真机烧片包分区配置 |
${board_path} 变量指向产品仓(参见 1.5 节)内的板级配置目录。
6.5 自定义分区配置
如需自定义分区配置:
- HPM包分区:复制并修改
hpm_layout.yml - 真机烧片包:复制并修改
emmc_layout.yml,并通过gpt_config指定新路径
gpp:
gpt_config: "${board_path}/custom_emmc_layout.yml"6.6 分区偏移自动计算
HPM包和真机烧片包的分区偏移均可自动计算:
- HPM包:在
hpm_layout.yml中设置site: 0,系统自动计算并强制512字节对齐 - 真机烧片包:在
emmc_layout.yml中设置start: null或不配置,系统自动计算偏移
7. QEMU 仿真验证
7.1 安装 QEMU
wget https://download.qemu.org/qemu-11.0.0.tar.xz
tar xvJf qemu-11.0.0.tar.xz
cd qemu-11.0.0
./configure
make -j8
make install7.2 启动仿真
cd manifest/output
qemu-system-arm -M ast2600-evb,boot-emmc=true \
-drive file=openUBMC_ast2600_real.img,format=raw,if=sd,index=2 \
-nographic