全志T113 Linux设备树解析与GPIO驱动开发实战 - 第1节
1. 课程导论
全志T113是一颗面向嵌入式Linux工业、车载与消费电子市场的高集成度双核ARM Cortex-A7处理器。其核心优势在于高性价比、低功耗与丰富的外设接口,使其成为国产化替代方案中的热门选择。
1.1.1 芯片核心规格
| 参数项 | 规格描述 |
|---|---|
| CPU | 双核 ARM Cortex-A7 @ 1.2GHz |
| GPU | Mali-400 MP2,支持OpenGL ES 2.0 |
| 视频编解码 | H.264 1080p@60fps 解码 / 编码 |
| 内存接口 | DDR3/DDR3L/LPDDR3,最大2GB |
| 存储接口 | SD/MMC、NAND Flash、SPI NOR/NAND |
| 网络 | 内置 10/100M EMAC + RMII |
| 显示输出 | RGB/LVDS/MIPI DSI,最大1080p |
| 音频 | 内置 2路 I2S、1路 DAC、1路 ADC |
| 封装 | BGA 282,13mm × 13mm |
1.1.2 芯片架构概览
下图展示了全志T113芯片内部主要功能模块的互联关系,重点关注CPU核心、内存控制器、外设总线与GPIO控制器的层级结构。
开发提示:全志T113的GPIO控制器挂载在APB总线上,通过设备树中的
pinctrl 节点进行引脚功能复用配置。后续章节将深入解析每个GPIO bank的寄存器布局。
1.2 Linux设备树概念
设备树(Device Tree)是一种描述硬件资源的数据结构,用于将板级硬件信息从Linux内核源码中解耦出来。在ARM Linux社区,自内核3.x版本起,设备树已成为必须的板级描述方式。
1.2.1 为什么需要设备树?
- 减少内核源码中的板级硬编码:传统ARM Linux在
arch/arm/mach-xxx中包含大量板级文件,设备树将这些信息移至外部.dts文件。 - 同一内核镜像支持多款硬件:通过更换设备树二进制(DTB),无需重新编译内核即可适配不同板卡。
- 标准化硬件描述语言:设备树使用节点(node)和属性(property)的树形结构,语法简洁、可读性强。
1.2.2 设备树文件体系
| 文件类型 | 扩展名 | 作用 |
|---|---|---|
| 设备树源文件 | .dts |
描述具体板卡的硬件拓扑,是开发者直接编辑的文件 |
| 设备树头文件 | .dtsi |
包含SoC级通用定义,可被多个 .dts 包含引用 |
| 设备树二进制 | .dtb |
编译后的二进制文件,由Bootloader加载并传递给内核 |
| 设备树覆盖 | .dtbo |
运行时动态加载的硬件描述片段,用于FPGA或扩展板 |
1.2.3 设备树节点结构示例
以下是一个典型的全志T113 GPIO控制器节点定义,展示了设备树如何描述硬件寄存器地址、中断和引脚功能:
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
ranges;
pinctrl: pinctrl@02000000 {
compatible = "allwinner,sun8i-t113-pinctrl";
reg = <0x02000000 0x400>;
interrupts = <GIC_SPI 43 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <3>;
interrupt-controller;
#interrupt-cells = <3>;
uart0_pins: uart0-pins {
pins = "PB8", "PB9";
function = "uart0";
};
};
};
关键字段解读:
compatible:驱动匹配的关键字符串,内核通过它找到对应的pinctrl驱动。reg:GPIO控制器的寄存器基地址(0x02000000)和地址范围(0x400字节)。gpio-controller:声明该节点是一个GPIO控制器。#gpio-cells:描述引用GPIO时需要3个参数(bank、偏移、标志)。uart0_pins:子节点定义引脚复用功能,将PB8/PB9配置为UART0功能。
1.3 GPIO子系统概述
Linux GPIO子系统为内核和用户空间提供了统一的、标准化的GPIO操作接口。它将硬件差异封装在芯片级驱动中,上层开发者无需关心具体寄存器操作。
1.3.1 GPIO子系统三层架构
| 层级 | 组件 | 职责 |
|---|---|---|
| 用户空间 | /sys/class/gpio / libgpiod |
通过文件系统或字符设备接口控制GPIO |
| 内核通用层 | GPIO Core / gpiolib | 提供统一的API框架、sysfs接口、中断管理 |
| 硬件驱动层 | pinctrl + GPIO控制器驱动 | 操作具体寄存器,实现引脚复用、方向、电平控制 |
1.3.2 GPIO操作流程
- 引脚复用配置:通过pinctrl子系统将引脚设置为GPIO功能。
- 方向设置:配置引脚为输入或输出模式。
- 电平读写:输出高/低电平,或读取输入电平值。
- 中断注册:将GPIO配置为中断源,注册中断处理函数。
注意事项:在编写GPIO驱动时,务必确认设备树中pinctrl的引脚复用配置是否正确。错误的复用配置可能导致GPIO无法正常控制,甚至损坏外部器件。建议在调试初期使用
gpioinfo 命令验证引脚状态。
1.4 课程目标与学习路径
1.4.1 课程目标
通过本课程的学习,你将掌握以下核心能力:
- 理解设备树语法:能够独立编写和调试全志T113平台的设备树文件。
- 掌握GPIO子系统框架:从设备树节点到内核驱动的完整链路。
- 实战驱动开发:基于T113开发板,实现LED、按键、中断等典型GPIO驱动。
- 调试与优化:使用内核调试手段(devicetree overlays、gpio debugfs、tracepoint)定位问题。
1.4.2 学习路径图
1.4.3 推荐学习资源
| 资源类型 | 名称 | 用途 |
|---|---|---|
| 官方文档 | Linux内核文档 Documentation/devicetree/ |
设备树语法与绑定规范 |
| 芯片手册 | 全志T113 Datasheet / User Manual | 寄存器地址、引脚功能表、电气特性 |
| 内核源码 | drivers/pinctrl/sunxi/ + drivers/gpio/gpiolib.c |
驱动实现参考与调试 |
| 开发工具 | dtc(Device Tree Compiler)、libgpiod、gpio-event-mon | 设备树编译、GPIO调试与事件监控 |
学习建议:建议在开始本课程前,先搭建好全志T113的交叉编译环境,并准备一块T113开发板(如芒果派MangoPi MQ-R或全志官方T113 EVB)。动手实践是掌握设备树和GPIO驱动的最佳途径。