3. 全志T113 SDK源码结构:lichee目录分析、brandy/boot0/uboot/kernel分区、设备树dts文件位置

全志T113的SDK源码包(通常以 t113_linux_sdk_vX.X.X.tar.gz 命名)解压后,其顶层目录结构清晰,遵循全志一贯的“lichee + brandy + 工具链”布局。理解这一结构是进行驱动开发、内核裁剪和系统定制的基础。

3.1 SDK顶层目录概览

SDK根目录下主要包含以下核心目录和文件:

目录/文件 说明 重要性
lichee/ 核心源码目录,包含boot0、uboot、kernel、buildroot等 ★★★★★
brandy/ 全志自研的启动引导组件,包含boot0和uboot的补丁/配置 ★★★★☆
out/ 编译输出目录,生成镜像、dtb、ko模块等 ★★★★☆
tools/ 烧录工具、打包脚本、签名工具等 ★★★☆☆
build/ 顶层编译脚本和配置文件 ★★★☆☆
device/ 芯片级和板级配置,包括分区表、sys_config.fex等 ★★★★★
开发提示: 日常驱动调试和内核修改主要集中在 lichee/linux-5.4(或对应内核版本)目录下。而启动流程相关的问题则需要关注 brandy 和 lichee/boot0 目录。

3.2 lichee目录深度分析

lichee 目录是SDK中代码量最大、结构最复杂的部分,它几乎包含了从芯片上电到Linux用户空间启动的所有源码。其典型结构如下:

lichee/
├── boot0/                  # 一级启动引导程序源码
│   ├── sun8iw20p1/         # T113对应芯片系列
│   │   ├── boot0_nand/     # NAND Flash启动版本
│   │   └── boot0_sdcard/   # SD卡/eMMC启动版本
│   └── tools/              # boot0打包工具
├── uboot/                  # U-Boot 2018.x 源码
│   ├── board/sunxi/        # 全志板级支持代码
│   ├── configs/            # defconfig配置文件
│   └── arch/arm/           # ARM架构相关代码
├── linux-5.4/              # Linux内核源码(版本可能为5.4或4.9)
│   ├── arch/arm/boot/dts/  # 设备树源文件(.dts/.dtsi)
│   ├── drivers/            # 驱动源码目录
│   └── include/            # 内核头文件
├── buildroot/              # 根文件系统构建工具
│   ├── package/            # 软件包配置
│   └── target/             # 目标板配置
└── tools/                  # 编译辅助脚本
关键点: 全志T113的启动流程是 boot0 → uboot → kernel → rootfs。其中boot0负责最底层的硬件初始化(DRAM、时钟、存储控制器),uboot负责加载内核和设备树,内核负责驱动管理和进程调度。
lichee/ 目录核心结构 lichee/ boot0/ uboot/ linux-5.4/ buildroot/ sun8iw20p1/ board/sunxi/ arch/arm/boot/dts/ package/ 启动流程与目录对应关系 boot0 (一级引导) → uboot (二级引导) → kernel (操作系统) → buildroot (根文件系统) 每个阶段对应lichee下的一个子目录,形成完整的启动链

3.3 brandy/boot0/uboot/kernel分区详解

全志T113的存储介质(NAND/eMMC/SD卡)采用固定分区布局。分区表定义在 device/config/chips/t113/configs/xxx/sys_partition.fex 文件中。以下是典型的分区结构:

分区名称 起始地址(偏移) 大小 存储内容 对应源码目录
boot0 8KB (0x2000) 32KB 一级启动引导,初始化DRAM和时钟 lichee/boot0/ + brandy/
uboot 40KB (0xA000) 512KB ~ 1MB 二级启动引导,加载内核和设备树 lichee/uboot/ + brandy/
boot 1MB ~ 2MB 16MB ~ 32MB 内核镜像(zImage/Image) + 设备树(.dtb) lichee/linux-5.4/
rootfs boot分区之后 剩余空间 根文件系统(ext4/squashfs) lichee/buildroot/
private 可选 可变 用户数据、配置、日志等 N/A
注意: 分区大小和偏移量因Flash类型和板级配置而异。例如,NAND Flash的uboot分区通常为1MB,而eMMC可能为2MB。修改分区表后需要同步更新 sys_config.fex 中的配置。

3.4 设备树dts文件位置与组织

全志T113的设备树文件采用“芯片级dtsi + 板级dts”的层级结构。所有dts/dtsi文件位于内核源码的 arch/arm/boot/dts/ 目录下。

3.4.1 文件命名规则

  • 芯片级dtsi: sun8iw20p1.dtsi — 定义T113芯片的SoC内部资源(CPU、GIC、DMA、时钟控制器等)。
  • 板级dts: sun8iw20p1-t113-xxx.dts — 定义具体开发板的外设(网口、音频、LCD、摄像头等)。
  • 公共头文件: sunxi-common-regulators.dtsi、sunxi-common-clk.dtsi 等。

3.4.2 典型文件列表

arch/arm/boot/dts/
├── sun8iw20p1.dtsi                    # T113 SoC基础定义
├── sun8iw20p1-t113-evbm1.dts          # 官方评估板
├── sun8iw20p1-t113-evbm1-xxx.dts      # 评估板变体(如带不同LCD)
├── sun8iw20p1-t113-customer.dts       # 客户定制板
├── sunxi-common-regulators.dtsi       # 公共电源管理
├── sunxi-common-clk.dtsi              # 公共时钟配置
└── sunxi-common-pinctrl.dtsi          # 公共引脚复用配置
设备树文件层级关系 sun8iw20p1.dtsi 芯片级:CPU、GIC、DMA、时钟、中断控制器 regulators.dtsi 电源管理 clk.dtsi 时钟配置 pinctrl.dtsi 引脚复用 sun8iw20p1-t113-evbm1.dts 板级:网口、音频、LCD、摄像头、GPIO 编译时通过 #include 机制将 dtsi 文件包含到 dts 中 最终生成一个完整的 .dtb 二进制文件供uboot加载

3.5 编译输出与镜像文件

执行 ./build.sh 或 make 后,编译产物会输出到 out/ 目录。以下是关键输出文件及其来源:

输出文件 路径示例 来源目录
boot0_sdcard.fex out/t113/evbm1/boot0_sdcard.fex lichee/boot0/
u-boot.fex out/t113/evbm1/u-boot.fex lichee/uboot/
boot.fex out/t113/evbm1/boot.fex lichee/linux-5.4/ (包含zImage + dtb)
rootfs.fex out/t113/evbm1/rootfs.fex lichee/buildroot/
sun8iw20p1-t113-evbm1.dtb out/t113/evbm1/linux-5.4/arch/arm/boot/dts/ lichee/linux-5.4/arch/arm/boot/dts/
vmlinux out/t113/evbm1/linux-5.4/vmlinux lichee/linux-5.4/ (未压缩内核,带符号表)
调试技巧: 当需要单独编译设备树时,可以进入 lichee/linux-5.4/ 目录执行 make dtbs,生成的dtb文件位于 arch/arm/boot/dts/ 下。使用 dtc -I dtb -O dts -o output.dts sun8iw20p1-t113-evbm1.dtb 可以反编译dtb为可读的dts格式。

3.6 本章小结

  • lichee/ 是SDK的核心,包含boot0、uboot、kernel、buildroot四大源码模块。
  • brandy/ 提供全志特有的启动补丁和配置,与lichee配合使用。
  • 存储分区遵循 boot0 → uboot → boot → rootfs 的固定布局,分区表定义在 sys_partition.fex 中。
  • 设备树采用 芯片级dtsi + 公共模块dtsi + 板级dts 的三层结构,所有文件位于 arch/arm/boot/dts/ 下。
  • 编译输出统一存放在 out/ 目录,便于打包和烧录。