3. Linux BSP基础概念

在嵌入式 Linux 开发中,BSP(Board Support Package,板级支持包)是连接通用操作系统与具体硬件板卡之间的“适配层”。对于全志 T113 这类 ARM Cortex-A7 双核平台,BSP 并不是单一文件,而是一整套源码、配置、脚本和文档的集合,它让 Linux 内核、U-Boot 和根文件系统能够在特定电路板上正确启动并驱动外设。理解 BSP 的定义、启动流程以及 U-Boot/Kernel/Rootfs 三者关系,是进行后续驱动移植和系统裁剪的前提。

一、BSP 的定义与组成

从工程角度看,BSP 是“让操作系统跑在指定硬件上”的最小充分集合。它通常包含以下内容:

  • 引导加载程序:如 U-Boot,负责初始化 DDR、时钟、串口,并加载内核。
  • Linux 内核源码及板级配置:包括设备树(.dts/.dtsi)、defconfig、驱动补丁。
  • 根文件系统:BusyBox、systemd 或 Buildroot 构建的 rootfs 镜像。
  • 构建工具与脚本:交叉编译工具链、打包脚本、烧录工具配置。
  • 硬件描述文档:原理图、引脚复用表、电源时序说明。

全志 T113 的 BSP 通常以 SDK 形式发布,目录结构清晰,便于按需裁剪。下面这张图展示了 BSP 在系统中的位置以及 U-Boot、Kernel、Rootfs 三者的加载关系。

全志 T113 BSP 启动链路与三者关系 T113 硬件平台:CPU / DDR / eMMC / UART / 以太网 / LCD BSP 负责将通用软件适配到该硬件 U-Boot SPL + 主 U-Boot 初始化 DDR / 时钟 加载 Kernel + DTB 传递 bootargs Linux Kernel 解析设备树 .dtb 初始化驱动 / 子系统 挂载 rootfs 启动 init 进程 Rootfs BusyBox / systemd /etc /bin /lib 应用程序与库 提供用户空间 加载 挂载 驱动硬件 驱动硬件 访问硬件

二、启动流程:从上电到用户空间

T113 的启动流程可以概括为“四级跳”:BootROM → SPL → U-Boot → Kernel → Rootfs。上电后,芯片内部固化的 BootROM 根据引脚或 eFuse 选择启动介质(如 eMMC、SD 卡、SPI Flash),加载 SPL(Secondary Program Loader)。SPL 体积很小,主要完成 DDR 初始化和时钟配置,随后加载完整的 U-Boot 到 DDR 中运行。

U-Boot 阶段会读取环境变量,准备内核镜像(Image 或 zImage)和设备树(.dtb),并通过 bootargs 向内核传递启动参数,例如:

setenv bootargs 'console=ttyS0,115200 root=/dev/mmcblk0p2 rw rootwait'
fatload mmc 0:1 0x40000000 zImage
fatload mmc 0:1 0x41800000 sun8iw20p1.dtb
bootz 0x40000000 - 0x41800000

内核启动后,会解析设备树,匹配并初始化各外设驱动,最后尝试挂载 rootfs。挂载成功后执行 /sbin/init,进入用户空间,系统启动完成。

三、U-Boot、Kernel、Rootfs 的关系

三者是“接力”关系,而非并列关系。U-Boot 是搬运工和参数传递者;Kernel 是硬件管理者和抽象层;Rootfs 是用户程序和服务的载体。它们之间的接口主要是:

阶段 核心职责 关键产物 与下一阶段接口
U-Boot 硬件初始化、加载内核 u-boot-sunxi-with-spl.bin bootargs、内核地址、DTB 地址
Kernel 驱动初始化、内存管理、进程调度 zImage、sun8iw20p1.dtb root= 参数、init 路径
Rootfs 提供用户空间、库、应用 rootfs.tar.gz / .img 通过 /dev、/proc 与内核交互
提示:设备树(DTB)是 Kernel 与硬件之间的“说明书”,U-Boot 只负责把 DTB 放到内存并告知内核地址,真正解析和使用它的是 Kernel。

四、全志 BSP 目录结构

全志 T113 SDK 的目录结构通常如下,理解它有助于快速定位修改点:

t113-sdk/
├── brandy/              # U-Boot 源码(全志定制)
│   ├── u-boot-2018.05/
│   └── spl/
├── kernel/              # Linux 内核源码
│   ├── linux-5.4/
│   └── linux-5.4/arch/arm/boot/dts/
├── buildroot/           # 根文件系统构建
├── device/              # 板级配置
│   └── config/
│       └── t113-xxx/
├── out/                 # 编译输出
├── tools/               # 打包与烧录工具
└── build.sh             # 顶层编译脚本

其中 device/config/ 下存放板级差异配置,如 sys_config.fex、board.dts、分区表等;brandy/ 对应 U-Boot;kernel/ 对应内核;buildroot/ 对应 rootfs。编译时通常执行 ./build.sh 并选择配置,脚本会自动完成三者的构建与打包。

五、常见误区与复盘

误区一:认为 BSP 就是内核源码。实际上 BSP 包含 U-Boot、内核、rootfs、工具链和板级配置,缺一不可。
误区二:修改了设备树却忘记重新编译 DTB,导致内核仍使用旧硬件描述。
误区三:U-Boot 的 bootargs 中 root= 指向错误分区,内核找不到 rootfs 而 panic。
误区四:把 rootfs 当成“可有可无”的部分,实际上没有 rootfs 内核无法进入用户空间。

复盘时建议按“上电→BootROM→SPL→U-Boot→Kernel→Rootfs→应用”的顺序逐级排查,先确认串口有输出,再确认内核是否解压成功,最后确认 rootfs 挂载和 init 是否执行。掌握这条链路,后续的驱动移植和系统裁剪就会事半功倍。