02 镜像编译
本章节详细介绍如何配置SDK、编译Boot、内核以及根文件系统镜像。SDK支持一键整体编译,也支持单独模块的独立编译,以适应不同的开发调试需求。
说明
本SDK提供make工具和run.sh脚本两种编译方式
1. 基础编译步骤
步骤1:配置环境变量。
进入SDK根目录,执行以下命令加载编译环境:
source build/env.sh步骤2:选择芯片型号
ShiMeta-Pico-G1提供GK7206V12A和GK7206V11A两种芯片型号选择,具体配置步骤如下:
tip
此配置项在重新选择之前一直生效,无需每次编译时都进行配置
芯片类型选择
make menuconfigBase-->Chip Type-->xm7206v12a-->保存退出
说明
如需选择GK7206V11A请选择xm7206v11a
DDR型号选择
Board-->Boot Regfile Config-->XM7206V12A_EVB_6L_DDR3_2133M_256M_1x16bit-->保存退出
说明
- GK7206V11A 输入:XM7206V11A_EVB_6L_DDR3_2133M_128M_1x16bit
- GK7206V12A 输入:XM7206V12A_EVB_6L_DDR3_2133M_256M_1x16bit
步骤3:编写配置(可选)。
如果需要修改SDK的默认编译配置,可通过 menuconfig 进行配置,具体参考3. menuconfig配置
make menuconfig步骤4:编译
配置保存后,可在SDK根目录下使用编译或打包指令进行编译或打包操作,生成所有需要的镜像(包括uboot、kernel、rootfs),以下以整体编译为例:
make build -j编译完成后,系统会根据目标启动介质(NAND / eMMC / SPI)自动生成对应的镜像,并统一输出到 out/<board_name>/image 目录下,供烧录工具直接使用。
说明
-j 参数后可跟数字以启动多线程并行编译,如 make build -j16,可根据编译服务器的CPU核心数和内存大小进行调整,以加快编译速度。
2. 其他常见编译指令
2.1 完整编译整个SDK
会依次编译:uboot、kernel、rootfs、sample、打包镜像
make build2.2 清理整个 SDK 编译产物
会删除:out/、临时文件、object 文件、镜像文件、相当于恢复到“未编译”状态
make clean2.3 仅编译U-Boot
若只修改了source/uboot,可只编译U-Boot,U-Boot 是板子上电后的第一阶段 bootloader
make uboot2.4 清除U-Boot编译结果
make uboot_clean2.5 仅编译内核
若只修改了内核相关,如source/kernel,可只编译内核
make linux2.6 清除内核编译结果
make linux_clean2.7 仅编译sample示例代码
make sample2.8 清除sample编译结果
make sample_clean3. menuconfig 配置
3.1 功能说明
menuconfig 是一种基于 Kconfig 配置体系的图形化终端配置工具,将 SDK 中分散的配置项集中到一个统一界面中管理,通过文本菜单界面的方式,将大量编译选项、芯片型号、工具链、内核版本、Flash 类型、文件系统类型等配置项组织成分级菜单,供开发者交互式选择。
在 GK7206 SDK 中,menuconfig 主要用于生成和维护 SDK 的全局配置文件 cfg.mk。开发者通过执行配置命令进入菜单界面,选择目标芯片、工具链、内核版本、Bootloader 配置、 Flash 类型等选项,保存后生成或更新 cfg.mk,SDK 顶层 Makefile 和 build/base.mk 会包含 cfg.mk,并根据其中的 CONFIG_ 配置项决定后续构建行为。
配置选项包含以下4种状态:
| 符号 | 含义 |
|---|---|
[ ] 或 <> | 不编译 |
[*] | 编译进内核 |
<M> | 编译为模块(.ko) |
<*> | 编译进内核(强制) |
Tip: 在该界面下输入
/可以进入搜索界面
3.2 配置选项
顶层菜单结构
xmedia SDK Configuration
├── Base
├── Board
├── Bootloader System
└── Linux SystemBase
Base 菜单用于配置 SDK 的基础平台信息,包括芯片型号、芯片架构、交叉编译工具链、日志模式以及 QuickStart 快速启动开关。
Base
├── Chip Type
│ ├── xm7206v11a
│ │ └── 选择目标芯片为 xm7206v11a。
│ │
│ ├── xm7206v10
│ │ └── 选择目标芯片为 xm7206v10。
│ │
│ ├── xm7206v10b
│ │ └── 选择目标芯片为 xm7206v10b。
│ │
│ ├── xm7206v12a
│ │ └── 选择目标芯片为 xm7206v12a。
│ │
│ ├── xm7206v11
│ │ └── 选择目标芯片为 xm7206v11。
│ │
│ └── xm7206v11at
│ └── 选择目标芯片为 xm7206v11at。
│
├── Toolchains Config
│ ├── kernel toolchains
│ │ ├── arm-gcc12.2.0-linux
│ │ │ └── 选择 ARM glibc 工具链用于内核编译。
│ │ │
│ │ ├── aarch64-gcc12.2.0-linux
│ │ │ └── 选择 AArch64 64 位工具链用于内核编译。
│ │ │
│ │ └── arm-gcc12.2.0-linux-uclibceabi
│ │ └── 选择 ARM uClibc 工具链用于内核编译。
│ │
│ └── usr 32bit toolchains
│ ├── arm-gcc12.2.0-linux
│ │ └── 选择 ARM glibc 工具链用于用户态 32 位程序编译。
│ │
│ └── arm-gcc12.2.0-linux-uclibceabi
│ └── 选择 ARM uClibc 工具链用于用户态 32 位程序编译。
│
├── SDK Log Mode
│ ├── log
│ │ └── 启用 SDK 日志模式。
│ │ 编译时会增加 CONFIG_LOG_TRACE_SUPPORT=1 等日志相关宏。
│ │
│ └── nolog
│ └── 关闭 SDK 日志模式。
│ 适合发布版本或不需要调试日志的场景。
│
└── Support QuickStart
└── 是否启用 QuickStart 快速启动模式。
启用后会影响 bootstrap、qs_mcu、initrd、分区表和 bootargs 等启动链路配置。Board
Board 菜单用于配置板级相关参数。
Board
├── Flash Config
│ ├── Nand Flash support:是否启用 NAND Flash 总体支持。开启后才会显示 NAND Flash 设备类型选择。
│ │ │
│ │ └─── Nand Flash device support
│ │ ├──Nand Flash Support
│ │ │ └── 启用传统并行 NAND Flash 支持。
│ │ │ 该选项会影响 NAND 分区表、NAND rootfs 镜像和 NAND 启动参数。
│ │ │
│ │ └── Spi-Nand Flash Support
│ │ └── 启用 SPI-NAND Flash 支持。
│ │ 该选项会影响 SPI-NAND 分区表、rootfs 镜像和启动参数。
│ │
│ ├── SPI Flash Support
│ │ └── 是否启用 SPI NOR Flash 支持。
│ │ │ 默认开启。
│ │ │ 开启后可生成 SPI Flash 对应的镜像、分区和启动参数。
│ │ │
│ │ Block Size
│ │ └── SPI Flash 块大小配置。
│ │ 仅在 SPI Flash Support 开启时有效。
│ │ 默认值为 64k。
│ │
│ └── eMMC Flash Support
│ └── 是否启用 eMMC Flash 支持。
│ 开启后可选择生成 ext4 rootfs 等适用于 eMMC 的镜像。
│
└── Boot Regfile Config
└── Boot Reg File
└── 配置 Boot 阶段使用的寄存器初始化文件名。
通常用于 DDR、Pinmux 或芯片启动阶段寄存器初始化。Bootloader System
Bootloader System 用于配置系统启动加载程序相关参数,主要是 U-Boot 版本、U-Boot 默认配置、环境变量存储区域和 DDR Training 支持等。
Bootloader System
├── Boot Type
│ └── uboot
│ └── 选择启动加载程序类型为 U-Boot。
│ 当前工程中只提供 uboot 这一种 Boot Type。
│
├── U-boot Version
│ └── u-boot-2020.01
│ └── 选择 U-Boot 版本为 u-boot-2020.01。
│ 当前工程中只提供该版本。
│
├── Boot Defconfig
│ └── 配置 U-Boot 默认 defconfig 文件名。
│ 例如 xxxxx_defconfig。
│ 对应文件位于 U-Boot 源码目录下。
│
├── Environment Variables Partition Start Address
│ └── 配置 U-Boot 环境变量分区的起始地址。
│ 默认值为 0x80000。
│ 该地址应与 NAND、SPI-NAND 或 SPI-NOR 的块大小对齐。
│
├── Environment Variables Image Size
│ └── 配置 U-Boot 环境变量镜像大小。
│ 默认值为 0x40000。
│
├── DDR Training Command Support
│ └── 是否在 Bootloader 中启用 DDR Training 命令支持。
│ 默认开启。
│ 用于测试 DDR 窗口或调试 DDR 稳定性。
│
└── APP Support
└── 是否启用 Bootloader 阶段的 APP 支持。
默认开启。
该选项通常用于支持启动阶段额外的应用或功能模块。Linux System
Linux System 是 Linux 系统级配置入口,下面分为三个子菜单:
Linux System
├── Kernel
├── Filesystem
└── ToolsLinux System -> Kernel
Kernel 菜单用于配置 Linux 内核版本、SMP、多媒体驱动编译方式以及 InitRamdisk 相关配置。
Linux System
└── Kernel
├── Kernel Version
│ ├── linux-5.10.y
│ │ └── 选择 Linux Kernel 版本为 5.10.y。
│ │ 当前默认值。
│ │
│ └── linux-4.9.y
│ └── 选择 Linux Kernel 版本为 4.9.y。
│
│
├── Kernel SMP Support
│ └── 是否启用 Linux Kernel SMP 多核支持。
│ 默认开启。
│ 开启后使用多核内核构建路径,关闭后使用单核内核构建路径。
│
├── Kernel Defconfig
│ └── 配置 Linux Kernel 默认 defconfig 文件名。
│ 例如 xxxxx_defconfig。
│ 对应配置文件一般位于内核源码目录:
│ arch/arm/configs/
│
├── Build GMP in Kernel
│ └── 是否将 GMP 相关驱动以内建方式编译进内核。
│ 选中时通常编译为 built-in;
│ 未选中时通常以 kernel module 方式生成。
│
└── InitRamdisk Config
└── Toybox Config File For InitRamdisk
└── 配置 InitRamdisk 使用的 Toybox 配置文件名。
默认值为 toybox-0.8.8。
对应配置文件通常位于 toybox 源码配置目录。Linux System -> Filesystem
Filesystem 菜单用于配置根文件系统、BusyBox、C++ 运行库、strip 行为以及 rootfs 镜像格式。
Linux System
└── Filesystem
├── Busybox Config File For Root
│ └── 配置 RootFS 中 BusyBox 使用的配置文件名。
│ 默认值为 busybox-1_26_2。
│ 对应配置文件通常位于 BusyBox 源码配置目录。
│
├── C++ Runtime Libarary Support
│ └── 是否在 RootFS 中支持 C++ 运行库。
│ 默认开启。
│ 如果用户程序依赖 libstdc++ 等 C++ 运行库,需要开启该项。
│
├── Enable Strip
│ └── 是否对根文件系统中的可执行文件和库进行 strip。
│ 默认开启。
│ 开启后会减小 rootfs 体积,但会去除调试符号;
│ 如果需要使用 gdb 调试,建议关闭。
│
├── Create Yaffs Rootfs Image
│ └── 是否生成 YAFFS 格式 rootfs 镜像。
│ 仅在启用 Nand Flash Support 或 Spi-Nand Flash Support 时有效。
│
├── Create Jffs2 Rootfs Image
│ └── 是否生成 JFFS2 格式 rootfs 镜像。
│ 仅在启用 SPI Flash Support 时有效。
│
├── Create Squashfs Rootfs Image
│ └── 是否生成 SquashFS 格式 rootfs 镜像。
│ SquashFS 是只读压缩文件系统,适合对体积敏感的固件场景。
│
├── Create ext4 Rootfs Image
│ └── 是否生成 ext4 格式 rootfs 镜像。
│ 仅在启用 eMMC Flash Support 时有效。
│
├── eMMC Rootfs Size
│ └── 配置 eMMC rootfs 镜像大小。
│ 仅在 Create ext4 Rootfs Image 开启时有效。
│ 默认单位为 MB,默认值为 32。
│
├── Create Ubi Rootfs Image
│ └── 是否生成 UBI 格式 rootfs 镜像。
│ 仅在启用 Nand Flash Support 或 Spi-Nand Flash Support 时有效。
│
└── UBI Rootfs Size
└── 配置 UBI rootfs 分区大小。
仅在 Create Ubi Rootfs Image 开启时有效。
默认值为 64M。Linux System -> Tools
Tools 菜单用于配置是否在 rootfs 或 SDK 构建中加入常用系统工具、调试工具和文件系统工具。
Linux System
└── Tools
├── Udev Support
│ └── 是否启用 udev 支持。
│ udev 用于 Linux 用户态设备节点管理。
│
├── Fat32 fsck Support
│ └── 是否加入 FAT32 文件系统检查工具。
│ 用于检测或修复 FAT/FAT32 文件系统。
│
├── Ext3/Ext4 format Support
│ └── 是否加入 ext3/ext4 文件系统格式化工具。
│ 适用于 eMMC、SD 卡等块设备文件系统格式化场景。
│
├── GDB Support
│ └── 是否加入 GDB 调试支持。
│ 注意:该选项需要用户自行准备 GDB 源码包;
│ 如果源码包不存在,开启该项可能导致编译失败。
│
├── Ubi/Jffs2 format Support
│ └── 是否加入 UBI/JFFS2 相关格式化和管理工具。
│ 常用于 NAND 或 SPI-NAND Flash 场景。
│
├── Read/Write Registers Support
│ └── 是否加入寄存器读写工具。
│ 用于底层调试、硬件寄存器查看和修改。
│
├── Mii ethphy Support
│ └── 是否加入 MII/以太网 PHY 调试工具。
│ 用于查看或配置以太网 PHY 寄存器。
│
└── CAN Tools Support
└── 是否加入 CAN 总线相关工具。
用于 CAN 接口调试、收发测试等场景。4. 使用 run.sh 脚本编译
SDK 根目录下提供了 run.sh 一键编译脚本,封装了常用的编译、清理和信息查询操作,使用更加简便。该脚本无需手动执行 source build/env.sh,内部已自动加载编译环境。
4.1 基本用法
./run.sh <命令> [-j[N]]其中 -j[N] 为可选的并行编译参数,省略 N 时自动使用全部 CPU 核心。
4.2 配置与信息命令
lunch — 交互式选择开发板配置
通过交互式菜单选择开发板型号和内核版本,自动生成 cfg.mk 配置文件:
./run.sh lunch执行后会出现如下交互菜单:
- 选择开发板型号(列出
configs/目录下所有可用的板级配置) - 选择内核版本(如
linux-5.10、linux-4.9,以及对应的 quickstart 版本)
提示
lunch 命令相当于替代了手动执行 make menuconfig 的芯片选型步骤,适合首次编译或切换目标平台时使用。
check — 检查编译环境
检查编译所需的工具链、命令等是否已正确安装,包括 bash、make、gcc、交叉编译工具链和 fakeroot 等:
./run.sh checkinfo — 查看当前编译信息
显示当前 cfg.mk 中的配置信息,包括芯片型号、芯片架构、内核版本、Bootloader、工具链和 Flash 支持等:
./run.sh infoenv — 查看环境配置
显示当前工具链路径等环境信息:
./run.sh envlist — 列出可用的开发板配置
列出所有可用的板级配置和内核版本,并标识当前正在使用的配置:
./run.sh list4.3 编译命令
| 命令 | 说明 |
|---|---|
./run.sh uboot | 编译 U-Boot bootloader |
./run.sh kernel | 编译 Linux 内核 |
./run.sh rootfs | 编译根文件系统 |
./run.sh driver | 编译内核驱动(GMP) |
./run.sh sysdrv | 编译 uboot + kernel + rootfs(系统驱动三件套) |
./run.sh osal | 编译 OSAL 适配层 |
./run.sh media | 编译媒体库(GMP 库) |
./run.sh app | 编译应用示例代码 |
./run.sh mcu | 编译 MCU 固件 |
./run.sh all | 全量编译(先执行 clean,再执行完整编译) |
说明
./run.sh all 会先清理全部编译产物再重新编译,等同于 make clean && make build。如需增量编译,请使用 sysdrv 或单独编译目标模块。
4.4 清理命令
| 命令 | 说明 |
|---|---|
./run.sh clean | 清理全部编译产物 |
./run.sh clean uboot | 清理 U-Boot 编译结果 |
./run.sh clean kernel | 清理内核编译结果 |
./run.sh clean rootfs | 清理根文件系统编译结果 |
./run.sh clean driver | 清理内核驱动编译结果 |
./run.sh clean sysdrv | 清理 uboot / kernel / rootfs 编译结果 |
./run.sh clean media | 清理媒体库编译结果 |
./run.sh clean sample | 清理应用示例编译结果 |
./run.sh clean all | 清理全部编译产物 |
说明
./run.sh <target> clean 与 ./run.sh clean <target> 两种写法等效,均支持。
4.5 并行编译
所有编译和清理命令均支持 -j 参数进行并行编译,以加快构建速度:
# 使用全部 CPU 核心并行编译
./run.sh kernel -j
# 使用 4 个线程并行编译
./run.sh kernel -j4
# 全量编译并使用全部核心
./run.sh all -j4.6 使用示例
以下是一次完整的首次编译流程示例:
# 1. 首次使用:选择开发板配置
./run.sh lunch
# 2. 检查编译环境是否就绪
./run.sh check
# 3. 确认当前配置
./run.sh info
# 4. 全量编译(使用全部核心)
./run.sh all -j日常开发中的增量编译示例:
# 仅修改了内核代码,重新编译内核
./run.sh kernel -j
# 修改了 uboot 和内核,编译系统驱动
./run.sh sysdrv -j
# 编译应用示例
./run.sh app -j
# 清理内核编译结果后重新编译
./run.sh clean kernel
./run.sh kernel -j