全志T113 Linux外设驱动开发与内核故障调试 - 第4节

4.1 内核源码获取与解压

全志T113平台的内核基于Linux 5.4 LTS分支,全志官方在github.com/allwinner-zh维护了适配T113-S3/D1-H等芯片的完整内核源码仓库。推荐使用longterm分支,该分支经过全志内部测试,稳定性最高。

源码获取命令:
# 克隆完整内核源码(含全志补丁)
git clone -b longterm https://github.com/allwinner-zh/linux-5.4.git t113-linux-5.4
cd t113-linux-5.4

# 查看当前分支与提交
git branch -a
git log --oneline -5

源码目录结构关键路径说明:

路径说明
arch/arm/boot/dts/设备树源文件(.dts / .dtsi),T113平台文件为 sun8iw20p1.dtsi
arch/arm/configs/默认内核配置文件,T113对应 sun8iw20p1_linux_defconfig
drivers/驱动源码目录,包含全志自研IP驱动(如DE、G2D、CODEC)
scripts/编译脚本、dtc设备树编译器、打包工具

4.2 内核配置(menuconfig)

内核配置是驱动开发的第一步,决定了哪些功能被编译进内核、哪些作为模块、哪些被排除。全志T113平台使用menuconfig图形化配置界面,基于Kconfig语法树。

4.2.1 加载默认配置

# 加载全志T113官方默认配置
make ARCH=arm sun8iw20p1_linux_defconfig

# 查看当前配置差异(与默认配置对比)
make ARCH=arm menuconfig
提示: 首次配置务必先加载defconfig,否则menuconfig会使用内核源码的通用默认配置,缺少全志平台特定选项(如SUNXI_SOC、SUN8I_WATCHDOG等)。

4.2.2 menuconfig 操作要点

  • 搜索符号: 按 / 键输入驱动名或配置项名(如 CONFIG_SUNXI_GMAC),快速定位配置位置。
  • 三态选择: [*] 编译进内核,[M] 编译为模块,[ ] 不编译。驱动调试阶段建议先编为模块(M),方便动态加载/卸载。
  • 依赖关系: 选中某项时,其依赖项会自动被选中;取消某项时,依赖它的项会变灰不可选。
  • 保存配置: 退出时选择 Save,配置写入 .config 文件。

4.2.3 T113平台关键配置项

配置项路径推荐值说明
CONFIG_SUNXI_SOCSystem Type → ARM Sunxi SoCsy全志SoC核心支持,必须开启
CONFIG_SUN8IW20P1System Type → Allwinner SoC Varianty选择T113-S3/D1-H芯片变体
CONFIG_SUNXI_GMACDevice Drivers → Network device support → Ethernet driver supporty/m千兆以太网控制器驱动
CONFIG_SUNXI_NANDDevice Drivers → Memory Technology Device (MTD) supportyNAND Flash控制器驱动
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMANDCPU Power Management → CPU Frequency scalingy动态调频调压,降低功耗
注意: 修改配置后,务必执行 make ARCH=arm savedefconfig 生成精简的 defconfig 文件,用于版本管理。不要直接提交 .config(体积大且包含临时路径)。

4.3 内核编译生成 zImage 与 dtb

全志T113平台使用ARM 32位架构,编译目标为zImage(压缩内核镜像)和设备树文件.dtb。编译过程分为内核镜像编译和设备树编译两个独立步骤。

4.3.1 编译环境准备

# 设置交叉编译工具链(以arm-linux-gnueabihf为例)
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

# 确认工具链可用
arm-linux-gnueabihf-gcc --version
推荐工具链: 全志官方提供基于GCC 8.4的交叉编译器,下载地址:https://github.com/allwinner-zh/toolchain。也可使用Linaro的gcc-arm-8.3-2019.03-x86_64-arm-linux-gnueabihf。

4.3.2 编译内核镜像

# 编译内核(多线程加速,-jN 中N为CPU核心数×2)
make -j8 zImage

# 编译设备树
make -j8 dtbs

# 查看生成文件
ls -lh arch/arm/boot/zImage
ls -lh arch/arm/boot/dts/sun8iw20p1-t113*.dtb

编译产物说明:

文件路径大小参考说明
zImagearch/arm/boot/zImage~4.5 MB自解压内核镜像,包含解压头和压缩后的内核
vmlinux源码根目录~12 MB未压缩的ELF内核,用于调试(gdb、addr2line)
sun8iw20p1-t113.dtbarch/arm/boot/dts/~35 KBT113-S3通用设备树
sun8iw20p1-t113-xxx.dtbarch/arm/boot/dts/~35 KB不同板级(如evb1、evb2)的专用设备树

4.3.3 编译常见错误与解决

  • 错误: *** No rule to make target 'zImage' → 未设置 ARCH=arm,或源码未配置(先执行 make defconfig)。
  • 错误: undefined reference to `xxx` → 驱动依赖的某个配置未开启,回 menuconfig 检查依赖链。
  • 错误: DTC: dts->dtb on file "xxx.dts" 语法错误 → 检查设备树文件,常见错误为缺少分号、属性值类型不匹配。

4.4 烧录方法:fastboot 与 PhoenixSuit

全志T113平台支持两种主流烧录方式:fastboot(命令行,适合开发调试)和 PhoenixSuit(全志官方图形化工具,适合量产与整机烧录)。

4.4.1 fastboot 烧录

fastboot 是Android/Linux通用的刷机协议,T113平台的bootloader(如u-boot)支持fastboot功能。烧录前需将设备进入fastboot模式。

# 进入fastboot模式(在u-boot命令行执行)
# 方法1:上电时按住某按键(如KEY0),u-boot自动进入fastboot
# 方法2:在u-boot命令行输入:
fastboot 0

# 主机端烧录命令
# 烧录内核镜像到boot分区
fastboot flash boot arch/arm/boot/zImage

# 烧录设备树到dtb分区
fastboot flash dtb arch/arm/boot/dts/sun8iw20p1-t113.dtb

# 烧录根文件系统(如ext4镜像)
fastboot flash rootfs rootfs.ext4

# 重启设备
fastboot reboot
提示: fastboot烧录前,建议先执行 fastboot getvar all 查看设备分区表,确认分区名称(如 boot、dtb、rootfs)与u-boot中定义一致。

4.4.2 PhoenixSuit 烧录

PhoenixSuit是全志官方提供的Windows/Linux图形化烧录工具,支持一键烧录完整固件包(包含bootloader、内核、dtb、rootfs)。适用于量产场景。

步骤操作说明
1安装PhoenixSuit从全志开发者中心下载,Windows版直接安装,Linux版需解压运行
2准备固件包使用全志pack工具将zImage、dtb、rootfs打包为.img文件
3进入烧录模式按住设备上的FEL键(或UBOOT键)上电,设备进入USB下载模式
4加载固件点击PhoenixSuit的“选择固件”,选中.img文件
5开始烧录点击“立即升级”,工具自动识别设备并烧录,进度条走完即完成
注意: PhoenixSuit烧录会擦除整个Flash,包括bootloader分区。如果仅更新内核,推荐使用fastboot烧录单个分区,避免影响bootloader和配置分区。

4.5 内核编译与烧录流程总览

下图展示了从源码到烧录的完整流程,包含配置、编译、打包、烧录四个阶段,以及各阶段的输入输出产物。

内核编译与烧录流程总览 内核编译与烧录流程总览 1. 内核配置 menuconfig / defconfig 输出: .config 2. 内核编译 make zImage dtbs 输出: zImage + .dtb 3. 固件打包 pack 工具 输出: .img 固件包 4a. fastboot 烧录 单分区更新 适合开发调试 4b. PhoenixSuit 整机烧录 适合量产 选择建议 仅更新内核/dtb → fastboot 首次烧录/整机更新 → PhoenixSuit

4.6 烧录后验证与常见问题

4.6.1 验证烧录是否成功

# 通过串口查看内核启动日志
# 使用minicom或putty连接串口(波特率115200,8N1)
# 上电后观察输出,正常启动会看到:
[    0.000000] Booting Linux on physical CPU 0x0
[    0.000000] Linux version 5.4.xx (user@host) (gcc version 8.4.0) #1 SMP ...
[    0.000000] Machine model: Allwinner sun8iw20p1
...
# 检查内核版本与编译时间
cat /proc/version
# 检查设备树是否加载正确
ls /proc/device-tree/
cat /proc/device-tree/model

4.6.2 烧录失败排查表

现象可能原因解决方法
fastboot 无法识别设备未进入fastboot模式;USB驱动未安装检查u-boot中fastboot是否使能;Windows安装全志USB驱动
烧录后设备无法启动zImage与dtb不匹配;分区烧录位置错误确认zImage和dtb来自同一次编译;检查分区表
PhoenixSuit烧录卡在0%设备未进入FEL模式;固件包损坏按住FEL键重新上电;重新打包固件
内核启动时dtb解析失败dtb文件损坏;设备树中内存地址错误重新编译dtbs;检查dts中memory节点
调试技巧: 如果设备无法启动,使用串口工具(如minicom)在u-boot阶段中断启动,执行 printenv 查看bootargs和bootcmd,确认内核加载地址和dtb加载地址是否正确。T113平台典型加载地址:kernel=0x40080000,fdt=0x44a00000。

4.7 本章小结

本章完整覆盖了全志T113平台Linux内核从配置到烧录的四个核心环节:

  • 配置: 使用menuconfig加载默认配置并定制驱动选项,强调搜索符号和依赖关系。
  • 编译: 生成zImage和.dtb,区分内核镜像与设备树的编译命令,并给出常见编译错误解决方案。
  • 烧录: 对比fastboot(单分区更新,适合调试)和PhoenixSuit(整机烧录,适合量产)两种方法,提供具体命令和步骤。
  • 验证: 通过串口日志和/proc文件系统确认烧录结果,并给出烧录失败排查表。

掌握本章内容后,读者应能独立完成T113平台内核的配置、编译与烧录全流程,为后续驱动调试和内核日志分析打下基础。