Linux之GPIO应用

目录

一、sysfs 文件系统

二、LED标准接口

三、GPIO标准接口

1.gpiochipX

2.export

①direction

​②value

③active_low

④edge

 3.unexport


在 Linux 系统下,一切皆文件。应用层操控底层硬件可以通过文件 I/O 的方式来实现,应用层通过对设备文件的 I/O 操作来操控硬件设备,设备文件其实是与硬件设备相互对应的。设备文件通常在/dev/目录下,/dev 目录下的文件称为设备节点。这也是驱动开发中常用的测试驱动程序方法。

还有另外一种方式可以通过 sysfs 文件系统对硬件设备进行操控。
 

一、sysfs 文件系统

sysfs 是一个基于内存的文件系统, 同  proc 文件系统一样,称为虚拟文件系统。它的作用是将内核信息以文件的方式提供给应用层使用。sysfs 文件系统的主要功能便是对系统设备进行管理,它可以产生一个包含所有系统硬件层次的视图。

sysfs 文件系统把连接在系统上的设备和总线组织成为一个分级的文件、 展示设备驱动模型中各组件的层次关系。 sysfs 提供了一种机制,可以显式的描述内核对象、对象属性及对象间关系, 用来导出内核对象(kernel object,硬件设备)的数据、属性到用户空间,以文件目录结构的形式为用户空间提供对这些数据、属性的访问支持

内核对象、对象属性及对象间关系在用户空间 sysfs 中的的表现:

内核中的组成要素sysfs中的表现
内核对象(硬件设备)目录
对象属性(设备属性)文件
对象关系链接文件

sysfs 文件系统挂载在/sys 目录下 

sysfs 文件系统中的目录包括 block、 bus、 class、 dev、 devices、 firmware、 fs、 kernel、
modules、 power 等,每个目录下又有许多文件或子目录。

目录说明:

/sys子目录说明
block块设备存放目录(过时),系统的所有设备存放在devices下,block下的文件通常链接到devices下的文件
 
bus系统中的所有设备按照总线类型分类放置的目录结构,同样也链接到devices下
class系统中的所有设备按照其功能分类放置的目录结构
dev按照设备号的方式放置的目录结构
devices系统中所有设备存放的目录, 系统中的所有设备在 sysfs 中的表现,也是 sysfs 管理设备的最重要的目录结构。
firmware描述了内核中的固件
fs用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点
kernel内核中所有可调参数的位置
mudule系统中所有模块的信息
power系统中电源选项,有一些属性可以用于控制整个系统的电源状态

系统中所有的设备(对象)都会在/sys/devices 体现出来,是 sysfs 文件系统中最重要的目录结构;而/sys/bus、 /sys/class、 /sys/dev 分别将设备按照挂载的总线类型功能分类以及设备号的形式将设备组织存放在这些目录中,这些目录下的文件都是链接到了/sys/devices 中

设备的一些属性、数据通常会通过设备目录下的文件体现出来。设备的数据、属性会导出到用户空间,以文件形式为用户空间提供对这些数据、属性的访问支持

将这些文件称为属性文件,属性文件就表示读取设备的属性信息属性文件表示对设备的属性进行设置、以控制设备的状态

小结:

应用层对底层硬件进行操控:

①/dev/目录下的设备文件(设备节点)


②/sys/目录下设备的属性文件

具体使用哪种方式需要根据不同功能类型设备进行选择,有的设备只能通过设备节点进行操控,而有的设备只能通过 sysfs 方式进行操控;这跟设备驱动具体的实现方式有关。

通常情况下,一般简单地设备会使用 sysfs 方式操控,其设备驱动在实现时会将设备的一些属性导出到用户空间 sysfs 文件系统,以属性文件的形式为用户空间提供对这些数据、属性的访问支持,如 LED、 GPIO 。

二、LED标准接口

Linux 内核中为了尽量降低驱动开发者难度以及接口标准化,就出现了设备驱动框架的概念;Linux 针对各种常见的设备进行分类,如 LED 类设备、输入类设备、 FrameBuffer 类设备、 video 类设备,并为每一种类型的设备设计了一套成熟的、标准的、典型的驱动实现的框架, 这个就叫做设备驱动框架。 设备驱动框架为驱动开发和应用层提供了一套统一的接口规范

对LED 类设备来说, 内核提供了 LED 设备驱动框架,驱动工程师编写 LED 驱动时,使用 LED 驱动框架来开发自己的 LED 驱动程序,能够对上层应用层提供统一、标准化的接口、 同时又降低了驱动开发工程师的难度。

通常情况下,杂项设备驱动程序向应用层提供的接口通常都不是标准化接口、它是一种非标准接口,具体如何去操控这个设备通常只有驱动工程师。

进入/sys/class/leds目录下,存放了所有的 LED 类设备。led文件夹下有brightness、max_brightness 以及 trigger 三个文件,这三个文件都是 LED 设备的属性文件。

①brightness(亮度):此属性文件是用于设置 LED的亮度等级或者获取当前 LED 的亮度等级,brightness 等于 0 表示 LED 灭, brightness 为正整数表示 LED 亮,其值越大、 LED 越亮

②max_brightness:用于获取 LED 设备的最大亮度等级
 

③trigger:触发模式,读表示获取 LED 当前的触发模式,写表示设置 LED 的触发模式。 不同的触发模式其触发条件不同, LED会根据不同的触发条件自动控制其亮、灭状态,通过 cat 命令查看该属性文件,可获取 LED 支持的所有触发模式以及 LED 当前被设置的触发模式

所以操作LED,只需要在应用空间中对以上属性文件进行读写操作即可。

三、GPIO标准接口

进入到/sys/class/gpio 目录


 该目录下包含两个文件 export、 unexport 以及 2 个 gpiochipX(X 等于 1020,902)命名的文件夹。

1.gpiochipX

当前 SoC 所包含的 GPIO 控制器,每一个 gpiochipX 文件夹用来管理一组 GPIO。
进入到其中某个目录下:

 主要关注base、 label、 ngpio 这三个属性文件,这三个属性文件均是只读、不可写。

base: 与 gpiochipX 中的 X 相同,表示该控制器所管理的这组 GPIO 引脚中最小的编号。每一个 GPIO引脚都会有一个对应的编号, Linux 下通过这个编号来操控对应的 GPIO 引脚

 label: 该组 GPIO 对应的标签或者名字

ngpio: 该控制器所管理的GPIO 引脚的数量(所以引脚编号范围是: base ~ base+ngpio-1) 

2.export

用于将指定编号的 GPIO 引脚导出。 在使用 GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。 注意 export 文件是只写文件,不能读取,将一个指定的编号写入到 export 文件中即可将对应的 GPIO 引脚导出

echo  1021  <  export   # 导出编号为1021的GPIO引脚

注意 < : 输出重定向 ,覆盖的方式写入;<< :输出重定向追加的方式写入。

导出成功之后会发现在/sys/class/gpio 目录下生成了一个名为 gpio1021 的文件夹这个文件夹就是导出来的 GPIO 引脚对应的文件夹,用于管理、控制该 GPIO 引脚。
 进入gpio1021文件夹

 主要使用active_low、 direction、 edge 以及 value 这四个属性文件。

①direction

配置 GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看 GPIO 当前是输入还是输出模式,写表示将 GPIO 配置为输入或输出模式;读取或写入操作可取的值为out(输出模式)in输入模式)

echo  out    <  direction     #将该gpio设置为输出模型



 ②value

在 GPIO 配置为输出模式下,向 value 文件写入0控制 GPIO 引脚输出低电平,写入1则控制 GPIO 引脚输出高电平。在输入模式下,读取 value 文件获取 GPIO 引脚当前的输入电平状态。

# 获取 GPIO 引脚的输入电平状态

echo   in   >  direction 

cat   value

# 控制 GPIO 引脚输出高电平
echo   out   > direction

echo    1  > value 

③active_low

用于控制极性, 可读可写,默认情况下为 0。

# active_low 等于 0 时
echo  0   > active_low
echo out > direction
echo 1    > value         #输出高
echo 0    > value          #输出低

# active_low 等于 1 时
echo  1   > active_low
echo  out > direction
echo  1    > value      #输出低
echo  0  > value       #输出高

edge

控制中断的触发模式,该文件可读可写。 在配置 GPIO 引脚的中断触发模式之前,需将其设置为输入模式。

非中断引脚: echo   none  > edge
上升沿触发: echo  rising  > edge
下降沿触发: echo  falling  > edge
边沿触发: echo      both    > edge

 3.unexport

将导出的 GPIO 引脚删除。当使用完 GPIO 引脚之后,需要将导出的引脚删除。

echo 1021 > unexport    # 删除导出的编号为 1021 的 GPIO 引脚

 删除成功之后,之前生成的 gpio1021 文件夹就会消失。

注意:并不是所有 GPIO 引脚都可以成功导出, 如果对应的 GPIO 已经在内核中被使用了, 就无法成功导出

 

 所以一般对GPIO的操作分为三步:

①导出IO:/sys/class/gpio/export

echo    1021  >  export

②配置IO:/sys/class/gpio/direction

echo     out    >   direction     # 输出

echo     in    >   direction       # 输入

③控制IO:/sys/class/gpio/value

echo     1   > value        #输出高电平

echo     0   > value        #输出低电平

 


 


版权声明:本文为qq_53144843原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。