1. 课程导入

欢迎进入《全志T113 Linux BSP开发》课程。全志T113是一款面向工业控制、智能家居、车载终端与边缘计算场景的高集成度SoC,采用双核Cortex-A7架构,主频可达1.2GHz,并集成Mali-G31 GPU、DDR3/DDR3L控制器、丰富的外设接口与多媒体编解码单元。对于嵌入式Linux开发者而言,T113不仅是一颗"能跑Linux的芯片",更是一个需要从BootROM、U-Boot、Kernel、设备树到根文件系统完整打通的BSP工程对象。本课程的目标,是让你具备从零搭建、裁剪、调试并量产化T113 Linux BSP的能力。

一、T113芯片架构:从CPU到外设的总线视角

理解BSP开发,首先要理解芯片的"数据通路"和"控制通路"。T113内部采用多总线互联结构:CPU、GPU、DMA、显示控制器、存储控制器等主设备通过AXI/AHB总线访问DDR和片上SRAM;而GPIO、I2C、SPI、UART、PWM、ADC等低速外设则挂在APB总线上,通过时钟控制器(CCU)和复位控制器统一管理。BSP开发中大量工作,本质上是在配置这些总线上的控制器寄存器、时钟树和引脚复用关系。

从启动角度看,T113上电后先执行片内BootROM,根据BROM引脚或eFuse配置选择启动介质(SPI NOR、SPI NAND、eMMC、SD卡),加载并校验Boot0/SPL,再进入U-Boot proper,最终引导Linux内核。这条链路中的每一环,都是BSP需要适配和验证的对象。

全志T113 芯片架构与 Linux BSP 启动链路 T113 SoC 内部 双核 Cortex-A7 1.2GHz · NEON Mali-G31 GPU OpenGL ES 3.2 AXI / AHB 高速总线互联 DDR3 / DDR3L 控制器 最大 2GB · 16bit 位宽 存储控制器 SPI NOR / NAND · eMMC · SD APB 低速外设总线 外设控制器 UART · I2C · SPI · PWM · GPIO · ADC USB OTG · Ethernet MAC · CAN · TWI Display Engine · Video Decoder · Audio Codec Linux BSP 启动链路 ① BootROM 选择启动介质 · 校验引导头 ② Boot0 / SPL 初始化 DDR · 时钟 · 引脚 ③ U-Boot 加载内核 · 传递设备树 ④ Linux Kernel 驱动初始化 · 挂载根文件系统 ⑤ RootFS + 应用 BusyBox · systemd · 业务程序 BSP 工程师负责全链路适配与调试 启动

二、Linux BSP开发目标:从"能启动"到"可量产"

很多初学者把BSP开发理解为"编译内核、烧录镜像、串口能打印"。这只是起点。真正的BSP开发目标包含四个层次:

  • 可启动:BootROM→SPL→U-Boot→Kernel→RootFS全链路无卡死,串口有完整启动日志。
  • 可驱动:DDR、eMMC、以太网、USB、显示、音频、Wi-Fi等关键外设均能正常工作,设备树描述与硬件原理图一致。
  • 可裁剪:根据产品需求裁剪内核模块、文件系统组件与启动时间,满足成本与性能约束。
  • 可量产:支持批量烧录、OTA升级、分区保护、启动失败回滚与产测接口。

核心判断标准:一块T113板子是否完成BSP适配,不看"能不能亮屏",而看"换一块同型号板子、换一批DDR颗粒、换一个启动介质,是否仍能稳定启动并识别全部外设"。

三、整体学习路线:五阶段递进

本课程按"环境→启动→内核→驱动→产品化"五阶段推进,每阶段都有明确的交付物:

阶段 核心内容 关键交付物
阶段一:环境搭建 Ubuntu开发机、交叉编译工具链、串口/ADB调试、源码获取 可编译出第一个T113镜像
阶段二:启动链路 BootROM、SPL、U-Boot移植与启动参数 串口完整启动日志与U-Boot命令行
阶段三:内核与设备树 Kernel配置、DTS编写、时钟与引脚复用 内核启动到RootFS并识别基础外设
阶段四:驱动开发 GPIO、I2C、SPI、USB、显示、音频驱动适配 各外设功能验证通过
阶段五:产品化 裁剪、OTA、分区、产测、稳定性测试 可量产BSP发布包

四、实战环境搭建:开发机与目标板

推荐使用Ubuntu 20.04/22.04 LTS作为开发主机,安装全志官方或社区维护的交叉编译工具链。以下是最小化环境准备命令:

# 安装基础依赖
sudo apt update
sudo apt install -y build-essential git bc bison flex libssl-dev \
    libncurses5-dev device-tree-compiler python3 python3-pip \
    minicom picocom android-tools-adb

# 获取T113 SDK(以社区Longan SDK为例)
git clone https://github.com/Tina-Linux/tina-sdk.git
cd tina-sdk
source envsetup.sh

目标板侧需要准备:T113开发板、USB转TTL串口模块(波特率115200)、Type-C数据线(用于FEL烧录或ADB)、TF卡或eMMC。首次上电建议先通过串口确认BootROM是否输出信息,再进入FEL模式进行烧录验证。

调试建议:串口是BSP开发的"生命线"。在U-Boot和Kernel阶段都保留完整日志输出,不要过早关闭console。遇到启动卡死时,先看最后一行日志定位阶段,再决定是改DDR参数、改设备树还是改启动介质配置。

五、常见误区与复盘

初学者最容易踩的三个坑:

  1. 跳过BootROM阶段直接改内核:如果SPL阶段DDR初始化失败,内核根本不会被加载,改内核配置毫无意义。应先确认SPL日志。
  2. 设备树与原理图脱节:DTS中的引脚、时钟、电源域必须与硬件原理图一一对应,否则驱动probe失败却难以定位。
  3. 忽视启动介质差异:SPI NOR、SPI NAND、eMMC的分区布局和烧录方式不同,同一份镜像不能无差别套用。

复盘要点:每次启动失败,记录"最后一条日志 + 当前启动阶段 + 最近一次修改",形成自己的BSP调试日志。这比反复重编译更能快速收敛问题。

完成本章环境搭建后,你应当能够:在Ubuntu上编译出T113的U-Boot与Kernel镜像,通过串口看到BootROM和SPL的输出,并成功进入U-Boot命令行。这是后续所有驱动与产品化工作的基础。