当前位置:   article > 正文

GPIO子系统、Pinctrl子系统和Input子系统

gpio子系统
GPIO子系统

gpio子系统是linux内核当中用于管理GPIO 资源的一套系统,它提供了很多GPIO相关的API接口。设备驱动程序中使用GPIO之前需要向gpio子系统申请,申请成功之后才可以使用,例如设置GPIO的输入、输出方向,设置GPIO输出高或低电平、读取GPIO输入电平等等。

gpio子系统的主要目的就是方便驱动开发者使用gpio,驱动开发者在设备树中添加gpio相关信息,然后就可以在驱动程序中使用gpio子系统提供的API函数来操作GPIO,Linux 内核向驱动开发者屏蔽掉了GPIO的设置过程,极大的方便了驱动开发者使用GPIO。

Pinctrl子系统

Linux内核针对PIN的(复用)配置推出了pinctrl子系统,对于GPIO的配置推出了gpio子系统,所以说到这里就知道了,pinctrl子系统是内核中专门用于管理、配置PIN的一套子系统。

配置PIN的复用功能和电器特性也是通过控制硬件寄存器来实现的,所以 pinctrl子系统最终也是如此。有gpio驱动程序,那必然也有pinctrl驱动程序,pinctrl驱动程序中实现了PIN的配置方法并,并注册到pinctrl子系统,所以pinctrl驱动程序就负责实现配置PIN的底层代码(主要就是寄存器控制),并注册到内核pinctrl子系统中由pinctrl子系统进行统一管理。

在内核源码drivers/pinctrl目录下有很多的 pinctrl-xxx.c文件,它们都是不同SoC所对应的pinctrl驱动程序源文件,例如对于 ZYNQ来说,pinctrl-zynq.c就是它的pinctrl驱动程序文件。

对于ZYNQ来说,我们使用了vivado图形化完成了对PIN的配置并在fsbl阶段将配置信息写入了硬件寄存器中,所以不需要在内核阶段进行配置。

Input子系统

input就是输入的意思,因此input子系统就是管理输入的子系统,所以input子系统就是输入类设备对应的驱动框架,和pinctrl和 gpio子系统一样,都是Linux内核针对某一类设备而创建的驱动框架。比如按键输入、键盘、鼠标、触摸屏等等这些都属于输入设备,不同的输入设备所代表的含义不同,按键和键盘就是代表按键信息,鼠标和触摸屏代表坐标信息,因此在应用层的处理就不同,对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可。为此input子系统分为input驱动层、input核心层、input事件处理层,最终给用户空间提供可访问的设备节点,input子系统框架如图所示:
在这里插入图片描述

input 子系统结构图

上图中左边就是最底层的具体设备,比如按键、USB键盘/鼠标等,中间部分属于Linux内核空间,分为驱动层、核心层和事件层,最右边的就是用户空间,所有的输入设备以文件的形式供用户应用程序使用。可以看出input子系统用到了我们前面讲解的驱动分层模型,我们编写驱动程序的时候只需要关注中间的驱动层、核心层和事件层,这三个层的分工如下:

  • 驱动层:输入设备的具体驱动程序,比如按键驱动程序,向内核层报告输入内容。
  • 核心层:承上启下,为驱动层提供输入设备注册和操作接口。通知事件层对输入事件进行处理。
  • 事件层:主要和用户空间进行交互。
本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/545254
推荐阅读
  

闽ICP备14008679号