概述
Linux内核的GPIO子系统通过gpiolib来实现,gpiolib始于2.6.24版本,这里是gpiolib的初始提交信息,这里是gpiolib的初始代码。下面是子系统的架构图:
gpiolib向上为使用gpio的设备驱动程序提供了统一的接口,向下为SoC的gpio控制器提供注册到系统的接口。gpiolib为驱动程序提供的服务包括:-
系统中GPIO信息的管理,比如有多少个GPIO,每个GPIO的编号是什么等;
GPIO的申请、释放;
IO的输入、输出方向的设置;IO电平的输出或者输入设置;以及GPIO与中断号的相互转换;
DTS中关于GPIO相关的配置信息的解析;
gpio系统与sysfs文件系统的交互;
gpio系统与debugfs文件系统的交互等。
-
将GPIO控制器抽象为gpio_chip,并提供接口将gpio_chip注册到系统中;
gpio_chip抽象了关于GPIO执行申请、释放、方向设置、IO电平输出等接口,特定SoC芯片的GPIO控制器驱动程序需要实现这些接口,从而使设备驱动程序可以正常使用gpio;
-
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
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的访问控制的。 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子系统。