Bootstrap

linux 应用层gpio中断_Linux内核GPIO子系统分析

概述

Linux内核的GPIO子系统通过gpiolib来实现,gpiolib始于2.6.24版本,这里是gpiolib的初始提交信息,这里是gpiolib的初始代码。

下面是子系统的架构图:

f604782a5ef559b4efe722bf8ff2bc95.png

gpiolib向上为使用gpio的设备驱动程序提供了统一的接口,向下为SoC的gpio控制器提供注册到系统的接口。gpiolib为驱动程序提供的服务包括:
    • 系统中GPIO信息的管理,比如有多少个GPIO,每个GPIO的编号是什么等;

    • GPIO的申请、释放;

    • IO的输入、输出方向的设置;IO电平的输出或者输入设置;以及GPIO与中断号的相互转换;

    • DTS中关于GPIO相关的配置信息的解析;

    • gpio系统与sysfs文件系统的交互;

    • gpio系统与debugfs文件系统的交互等。

gpiolib为SoC芯片的GPIO控制器提供的服务包括:
    • 将GPIO控制器抽象为gpio_chip,并提供接口将gpio_chip注册到系统中;

    • gpio_chip抽象了关于GPIO执行申请、释放、方向设置、IO电平输出等接口,特定SoC芯片的GPIO控制器驱动程序需要实现这些接口,从而使设备驱动程序可以正常使用gpio;

3.12.0版本之后,社区对于GPIO子系统进行了重构,内核对于gpio的管理从基于gpio num的方式,修改为基于“opaque handlers”的方式,下面是gpiolib重构时代码提交信息:
    • gpio works with integers, whereas gpiod operates on opaque handlers which cannot be forged or used before proper acquisition

    • gpiod get/set functions are aware of the active low state of a GPIO

    • gpio consumers should now include to access the new interface, whereas chips drivers will use

这段提交信息中,说到了两种gpiolib子系统的工作原理,以及重构后,gpio消费者通过“”使用新版的gpio配置接口,gpio控制器芯片通过“”使用新版的gpio控制器配置接口。为了兼容之前的gpio相关的设备驱动,内核保留了重构之前的gpio接口,接口声明位于”“,该文件的开头的注释部分也说明了该文件中定义的接口已经被遗弃,该文件的作用是为了兼容之前的设备驱动程序, 对于新的驱动程序请使用“”中的接口。
  This is the LEGACY GPIO bulk include file, including legacy APIs. It is  used for GPIO drivers still referencing the global GPIO numberspace,  and should not be included in new code.   If you're implementing a GPIO driver, only include    If you're implementing a GPIO consumer, only include   see Documentation/driver-api/gpio/legacy.rst。

GPIO架构实现

gpiolib通过gpio_chip结构抽象了所有对于GPIO的操作,gpio chip驱动程序,实现这些抽象接口,并将gpio_chip注册到gpiolib子系统中。gpio驱动程序首先通过gpio申请接口,申请成功后,返回gpio的句柄,之后,通过这个句柄完成对于gpio的各种操作。下图表示gpio驱动程序如何通过gpiolib框架完成对于特定gpiochip的访问控制的。

21aceb5eb54a4136feef697b578f90c6.png

gpiolib子系统经过多年的发展,其对于gpio的管理方式产生了两种不同的机制,一种是基于gpio num的方式,另一种是基于gpio_desc的描述符形式。前一种机制由于种种问题,现在已经被废弃,但为了向后兼容,内核对于该机制进行了保留,但对于新的gpio驱动程序,内核 强烈建议使用新版的机制。下面的章节会介绍在编写gpio相关的驱动程序时常用到的数据结构和接口,其分为两部分:旧架构和新架构。旧架构主要讲述gpiolib重构之前的使用方式;新架构主要讲述gpiolib重构之后的使用方式。每部分都会分为四个小部分:数据结构、APIs、示例。本文所介绍的内核代码版本为5.8。

旧架构

需要声明的是,下面所说的gpio操作机制,已经在3.12.0版本的内核之后,被列为 历史遗迹,在新的gpio相关驱动中 不推荐使用。include/linux/gpio.h在4.17.0版本中,再次强调该文件中的接口已经成为 遗产, 对于gpio驱动,使用中的接口,对于gpio chip驱动,使用中的接口。
This is the LEGACY GPIO bulk include file, including legacy APIs. It isused for GPIO drivers still referencing the global GPIO numberspace,and should not be included in new code.If you're implementing a GPIO driver, only include If you're implementing a GPIO consumer, only include 
内核需要配置 CONFIG_GPIOLIB选项,用来启用gpiolib子系统。

数据结构

对于gpio相关的驱动来说,没有比较重要的数据结构,所有关于gpio的操作都时基于一个gpio num,这里就不涉及数据结构了。

APIs

当内核启用CONFIG_GPIOLI

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;