Linux的GPIO子系统(gpiolib)的原理详解【每个GPIO控制器对应于一个gpio_chip结构体】【如何查看每个GPIO控制器的详细情况】【如何利用其操作具体的GPIO口】

引言

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 控制器(比如 gpiochip0gpiochip1)。
  • 提供 /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, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值