应用层控制GPIO

控制GPIO硬件有以下几种方法:

  • 编写驱动程序,在设备的IO操作里完成对GPIO的任意控制
  • 在应用层依靠GPIO子系统在/sys/class/gpio中为GPIO类设备的属性文件来进行简单控制

1.基于sysfs

进入到/sys/class/gpio 目录下可以看到GPIO控制器包含以下属性:

  • export
  • unexport
  • gpiochipX

在使用一个GPIO前,需要将一个GPIO导出到用户空间,这样才能使用它,通过将要导出的GPIO序号写入export属性文件即可完成导出,取消导出的话将要取消导出的GPIO序号写入到unexport属性文件即可。

在导出一个GPIO后,在/sys/class/gpio 目录下会新多出一个目录,代表此GPIO设备,该目录包含4个属性文件:

1.active_low:配置GPIO的极性,value的0/1到底代表高还是低电平由此属性决定( ==输入输出均是==)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
//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 //输出高

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

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

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

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

2.基于libgpiod

此库也是基于Linux内核GPIO子系统来实现的,可以在用户态控制GPIO的状态,底层主要是通过与/dev/gpiochipX设备节点通过ioctl()进行I/O操作来控制这些硬件的