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负责加载内核和设备树,内核负责驱动管理和进程调度。
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 # 公共引脚复用配置
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/目录,便于打包和烧录。