引言
GPIO是高频使用的硬件资源,所以Linux专门搞了一套GPIO子系统来对其进行管理,目的就是方便大家使用片上或板上的GPIO资源。
虽然之前已经利用GPIO子系统来实现过LED的驱动和按键的中断驱动了,但是对GPIO子系统的原理和结构还是比较模糊的,所以在这篇博文中仔细学习一下GPIO子系统。
之前用GPIO子系统来实现LED的驱动和按键的中断驱动的博文链接如下:
https://blog.youkuaiyun.com/wenhao_ir/article/details/145119224
https://blog.youkuaiyun.com/wenhao_ir/article/details/145176361
重要概念:对各个GPIO口的操作,是通过GPIO控制器实现的
对各个 GPIO 口(GPIO 引脚)的操作,是通过 GPIO 控制器(GPIO Controller)实现的。
在 Linux 内核中,GPIO 控制器由 GPIO 控制器驱动 管理,并通过 GPIO 子系统(gpiolib) 统一提供 API,使用户空间和其他内核驱动可以方便地访问 GPIO 口。
GPIO 控制器(GPIO Controller) 是一个管理多个 GPIO 引脚的硬件模块,通常集成在 SoC(如 IMX6ULL)中。它的主要作用是:
- 通过 寄存器 控制 GPIO 口的 输入/输出 模式
- 允许 使能/禁用 GPIO 口
- 提供 中断控制(如果支持)
- 管理 复用功能(Muxing)(部分引脚可能被复用为其他功能,如 I2C、UART、PWM)
在 Linux 中,GPIO 控制器通常会注册为一个 gpio_chip
,并由 GPIO 子系统(gpiolib)
进行统一管理。对于 IMX6ULL,GPIO 控制器由 gpio-mxc
驱动管理。
GPIO子系统(gpiolib)的原理
问:gpiolib
是不是就是我们所说的GPIO子系统?
是的,gpiolib
就是我们通常所说的 GPIO 子系统(GPIO Subsystem)!
1. 什么是 gpiolib
?
gpiolib
(GPIO Library)是 Linux 内核中的 GPIO 子系统,它提供了一套 统一的 GPIO 处理框架,用于管理不同 SoC 平台的 GPIO 控制器。
它的主要功能包括:
- 管理 GPIO 控制器(gpiochip):支持多个 GPIO 控制器(比如
gpiochip0
、gpiochip1
)。 - 提供
/sys/class/gpio/
接口(Legacy sysfs,较老的方法)。 - 支持
gpiod_*()
API(更现代的libgpiod
接口)。 - 支持 GPIO 消息通知(如
gpio_request_irq()
处理中断)。 - 抽象不同硬件的 GPIO 访问方式(比如基于 I2C、SPI、SoC 内部 GPIO 控制器)。
2. gpiolib
与 GPIO 子系统的关系
在 Linux 内核架构中:
- GPIO 子系统 =
gpiolib
+ 各个 GPIO 驱动 - GPIO 控制器(gpiochip)是具体的硬件设备,而
gpiolib
负责提供管理框架。
可以简单理解为:
Linux 内核
└── GPIO 子系统(gpiolib)
├── GPIO 控制器驱动(如 `fsl-imx6ul-gpio`)
├── GPIO 用户接口(sysfs、libgpiod、device tree)
├── GPIO 虚拟总线(/sys/bus/gpio/)
3.gpio_chip
结构体的介绍(核心数据结构)
gpio_chip
结构体是 Linux 内核 GPIO 子系统(gpiolib) 用来表示 GPIO 控制器(GPIO Controller) 的数据结构,每个 GPIO 控制器都必须有一个对应的 gpio_chip
结构体。可以说它是GPIO 子系统(gpiolib)的核心数据结构。
struct gpio_chip {
const char *label; // 控制器名称
struct device *parent; // 父设备
int base; // GPIO 编号基地址(-1 代表动态分配)
u16 ngpio; // 控制的 GPIO 数量
struct module *owner; // 所属驱动模块
int (*direction_input)(struct gpio_chip *chip, unsigned offset);
int (*direction_output)(struct gpio_chip *chip,