全志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_SOC | System Type → ARM Sunxi SoCs | y | 全志SoC核心支持,必须开启 |
CONFIG_SUN8IW20P1 | System Type → Allwinner SoC Variant | y | 选择T113-S3/D1-H芯片变体 |
CONFIG_SUNXI_GMAC | Device Drivers → Network device support → Ethernet driver support | y/m | 千兆以太网控制器驱动 |
CONFIG_SUNXI_NAND | Device Drivers → Memory Technology Device (MTD) support | y | NAND Flash控制器驱动 |
CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND | CPU Power Management → CPU Frequency scaling | y | 动态调频调压,降低功耗 |
注意: 修改配置后,务必执行
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
编译产物说明:
| 文件 | 路径 | 大小参考 | 说明 |
|---|---|---|---|
zImage | arch/arm/boot/zImage | ~4.5 MB | 自解压内核镜像,包含解压头和压缩后的内核 |
vmlinux | 源码根目录 | ~12 MB | 未压缩的ELF内核,用于调试(gdb、addr2line) |
sun8iw20p1-t113.dtb | arch/arm/boot/dts/ | ~35 KB | T113-S3通用设备树 |
sun8iw20p1-t113-xxx.dtb | arch/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 内核编译与烧录流程总览
下图展示了从源码到烧录的完整流程,包含配置、编译、打包、烧录四个阶段,以及各阶段的输入输出产物。
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平台内核的配置、编译与烧录全流程,为后续驱动调试和内核日志分析打下基础。