type
date
slug
category
icon
password
设备树中关系表述解析工作机制设备树编写指南Pin Controller 节点编写GPIO Controller 节点编写Client Device 节点编写实例分析-LED 设备各平台 pin controller 和 GPIO Controller 节点差异pin controller 节点格式GPIO Controller 节点格式设备节点示例参考通用示例i.MX6ULL 示例
GPIO (General Purpose Input/Output) 和 Pinctrl (Pin Controller) 是 Linux 内核中两个关键的子系统,它们共同管理 SOC 上的物理引脚。GPIO 负责将引脚用作通用输入/输出接口,而 Pinctrl 则负责引脚的多路复用功能和电气特性配置。
这两个子系统在 Linux 内核的发展过程中经历了多次演变:
- 在早期 Linux 版本中,GPIO 和引脚复用功能通常混合在一起
- Linux 3.x 开始,引入了独立的 Pinctrl 子系统
- Linux 4.x 进一步完善了两个子系统的协作机制
- 现代 Linux 内核中,GPIO 和 Pinctrl 成为两个独立但紧密协作的子系统
它们在嵌入式设备和单板计算机中应用广泛,控制着从 LED、按键到各种通信接口的物理连接。
典型使用场景
- LED 控制:如上例所示,用于控制状态或指示灯
- 按键输入:配置为输入模式,通常带有中断功能
- 电源控制:控制外部设备的电源开关
- SPI/I2C 设备片选:作为片选或使能信号
- 硬件复位控制:控制设备的硬件复位引脚

设备树中关系表述
在嵌入式 Linux 系统的设备树中,Pin Controller、GPIO Controller 和 Client Device 构成了一个层次化的关系模型,用于描述和管理系统的 I/O 引脚:
三者的基本职责
- Pin Controller (PINCTRL)
- 管理 SoC 引脚的多路复用和基本电气特性
- 控制引脚的功能选择(如 GPIO、UART、I2C 等)
- 配置引脚的电气属性(如上拉/下拉、驱动强度等)
- GPIO Controller
- 管理配置为 GPIO 功能的引脚
- 提供读取/设置 GPIO 引脚值的能力
- 处理 GPIO 中断
- Client Device
- 使用 GPIO 或其他特定功能的引脚的
- 通过 pinctrl 和 gpio 属性引用所需的引脚配置
GPIO Controller 与 Pin Controller 的关系
- 对于集成度较高的SoC,GPIO Controller 作为 Pin Controller子模块,共享相同寄存器空间。现实的芯片中,并没有Pinctrl这样的硬件,它的功能大部分是在GPIO模块中实现的。Pinctrl是一个软件虚拟处理的概念,它的实现本来就跟GPIO密切相关。甚至一些引脚默认就是GPIO功能。按理说,一个引脚可能被用作GPIO,也可能被用作I2C,GPIO和I2C这些功能时相同低位的。但是Pinctrl和GPIO关系密切,当你使用gpiod_get获得GPIO引脚时,它就
偷偷地
通过Pinctrl把引脚复用为GPIO功能了。这也就是为什么在STM32MP157 设备树配置工具STM32CubeMX
即使把引脚配置为GPIO功能,它也不会在设备树中出现。
- 扩展 GPIO 或特殊用途的 GPIO 控制器,GPIO Controller 作为独立的硬件模块,有自己的寄存器空间。
通过这种结构,Linux 系统能够有效管理 SoC 的硬件资源,避免引脚冲突,同时提供统一的编程接口给上层应用。
解析工作机制
当系统启动并加载上述设备树时,发生的过程如下:
设备树编写指南
Pin Controller 节点编写
Pin Controller 节点通常包含以下关键部分:
Pin Controller 常用属性和状态
- pinmux: 定义引脚的复用功能
- bias-pull-up/down/disable: 上拉、下拉或禁用上下拉
- drive-strength: 驱动强度,通常以mA为单位
- input-enable/disable: 启用/禁用输入缓冲器
- output-high/low: 设置初始输出电平
- slew-rate: 配置转换速率
GPIO Controller 节点编写
GPIO Controller 通常是 Pin Controller 的子系统或独立系统:
GPIO Controller 常用参数
- #gpio-cells: 通常为2,第一个参数是引脚号,第二个是标志
- gpio-ranges: 定义GPIO范围与Pin Controller的映射关系
- gpio-line-names: 定义GPIO线的名称,便于调试
详细解释 gpio-ranges
gpio-ranges
属性用于定义 GPIO Controller 管理的 GPIO 编号与 Pin Controller 管理的物理引脚之间的映射关系。基本语法如下:
这个属性包含四个参数:
&pinctrl
: 指向 Pin Controller 的引用
0
: GPIO Controller 的起始 GPIO 编号
0
: Pin Controller 的起始引脚编号
32
: 映射的 GPIO 数量
简单映射示例
复杂映射示例
映射关系的工作原理
Client Device 节点编写
Client Device 节点通过引用 Pin Controller 和 GPIO Controller 来使用所需的引脚:
GPIO 引用中的常用标志
- GPIO_ACTIVE_HIGH/LOW: 高/低电平有效
- GPIO_OPEN_DRAIN/SOURCE: 开漏/开源输出
- GPIO_PULL_UP/DOWN: 启用上拉/下拉电阻
实例分析-LED 设备
下面是一个基于 LED 设备的完整示例,展示了 Pin Controller、GPIO Controller 和 LED Client Device 的关系:
详细解释
- Pin Controller 配置 (
pinctrl@10000000
) - 定义了一个引脚配置组
led_pins
,将引脚 42 配置为 GPIO 功能 - 设置了推挽输出模式,驱动强度为 8mA,初始状态为低电平
- GPIO Controller 配置 (
gpio@10001000
) - 声明了一个 GPIO 控制器,管理 GPIO 引脚
- 设置
#gpio-cells = <2>
表示每个 GPIO 引用需要两个参数:引脚号和标志 - 配置了中断控制器功能,用于处理 GPIO 中断
- LED 设备配置 (
leds
) - 使用标准的
gpio-leds
驱动 - 通过
pinctrl-0
引用了 Pin Controller 中的led_pins
配置 - 定义了一个绿色状态 LED,使用 GPIO 42,设置为低电平有效
- 配置了
heartbeat
触发器,使 LED 按照系统心跳闪烁
各平台 pin controller 和 GPIO Controller 节点差异
pin controller 节点格式
pin controller 节点的格式,没有统一的标准!!!!每家芯片都不一样。甚至上面的 group、function 关键字也不一定有,但是概念是有的。上面 LED设备树示例,更适合 Allwinner、Rockchip 等开源友好的平台。
下面给出常用平台 pin controller 节点完整范例,代码在基本节点结构、引脚配置格式、分组方式方面有显著差异。
STM32MP157 pin controller设备树
IMX6ULL pin controller设备树
Rockchip (RK3399) pin controller设备树
GPIO Controller 节点格式
在设备树中,“GPIO 组”就是一个 GPIO Controller,这通常都由芯片厂家设置好。下表对比了常用平台 GPIO Controller 节点差异
特性 | STM32MP157 | IMX6ULL | Rockchip (如 RK3399) |
GPIO 基础架构 | 使用独立的 GPIO 控制器,每个端口(A-K)一个控制器 | 集成在 IOMUXC 中,按组织成组 | 集成在 GRF (General Register File) 中 |
设备树节点 | 每个 GPIO 端口单独的节点 | GPIO 组被组织为子节点 | GPIO 端口被组织为子节点 |
控制器数量 | 最多 11 个端口 (GPIO A-K) | 5 个 GPIO 组 (GPIO1-GPIO5) | 通常 5-9 个端口,因芯片而异 |
引脚数/组 | 每端口最多 16 个引脚 | 每组最多 32 个引脚 | 每端口最多 32 个引脚 |
编号方式 | 使用端口字母和引脚编号 (例如 PA0) | 使用组号和引脚编号 (例如 GPIO1_IO02) | 使用端口号和引脚编号 (例如 GPIO4_A5) |
下面是一些芯片的 GPIO 控制器节点示例,它们一般都是厂家定义好,在 xxx.dtsi 文件中:
STM32MP157 GPIO Controller 设备树
IMX6ULL GPIO Controller 设备树
Rockchip (RK3399) GPIO Controller 设备树
设备节点示例参考
通过以上分析,我们对两个子系统关系,工作机制,设备树编写细节以及不同平台差异有了详细了解,下面给出 给出 LED,按键输入、电源控制、SPI/I2C 等设备示例作为参考,既是小结也是速查表。示例分为通用示例和i.MX6ULL 示例。
通用示例
i.MX6ULL 示例
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/linux_drv_goio_pinctrl_dts
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!