在 Linux 系统中,`/sys/class/gpio` 目录提供了用于操作 GPIO(通用输入输出)引脚的接口。以下是 `/sys/class/gpio` 目录中常见的文件和配置项的详细描述:
### 基本目录结构
- **导出和取消导出**
- `echo [GPIO_NUMBER] > /sys/class/gpio/export`:导出指定的 GPIO 引脚到用户空间。
- `echo [GPIO_NUMBER] > /sys/class/gpio/unexport`:取消导出指定的 GPIO 引脚。
- **目录示例**
```
/sys/class/gpio/
├── export
├── unexport
└── gpio[N]/
├── direction
├── edge
├── value
├── active_low
├── name
└── uevent
```
### 详细配置项
1. **`/sys/class/gpio/export`**
- **作用**:导出 GPIO 引脚到用户空间。
- **使用方法**:`echo [GPIO_NUMBER] > /sys/class/gpio/export`
2. **`/sys/class/gpio/unexport`**
- **作用**:取消导出 GPIO 引脚,释放资源。
- **使用方法**:`echo [GPIO_NUMBER] > /sys/class/gpio/unexport`
3. **`/sys/class/gpio/gpio[N]/direction`**
- **作用**:设置 GPIO 的方向。
- **取值**:
- `in`:设置为输入模式。
- `out`:设置为输出模式。
- **使用方法**:`echo "in" > /sys/class/gpio/gpio[N]/direction`
4. **`/sys/class/gpio/gpio[N]/edge`**
- **作用**:设置中断触发方式。
- **取值**:
- `none`:不触发中断。
- `rising`:上升沿触发。
- `falling`:下降沿触发。
- `both`:两种触发方式(上升沿和下降沿)。
- **使用方法**:`echo "rising" > /sys/class/gpio/gpio[N]/edge`
5. **`/sys/class/gpio/gpio[N]/value`**
- **作用**:读取或写入 GPIO 的值。
- **取值**:
- 读取:`cat /sys/class/gpio/gpio[N]/value`
- 写入:`echo [0/1] > /sys/class/gpio/gpio[N]/value`
- **使用方法**:
- 读取:`cat /sys/class/gpio/gpio[N]/value`
- 写入:`echo "1" > /sys/class/gpio/gpio[N]/value`
6. **`/sys/class/gpio/gpio[N]/active_low`**
- **作用**:设置 GPIO 的低电平触发(可选)。
- **取值**:
- `0`:不反转,正常逻辑。
- `1`:反转逻辑,低电平触发。
- **使用方法**:`echo "1" > /sys/class/gpio/gpio[N]/active_low`
7. **`/sys/class/gpio/gpio[N]/name`**
- **作用**:显示 GPIO 的名称。
- **使用方法**:`cat /sys/class/gpio/gpio[N]/name`
8. **`/sys/class/gpio/gpio[N]/uevent`**
- **作用**:显示 GPIO 的设备事件信息,通常不需要修改。
- **使用方法**:`cat /sys/class/gpio/gpio[N]/uevent`
### 示例脚本
下面是一个示例脚本,演示如何使用这些接口:
```bash
#!/bin/bash
GPIO_NUMBER=16
# 导出 GPIO
echo $GPIO_NUMBER > /sys/class/gpio/export
# 设置 GPIO 为输入模式
echo "in" > /sys/class/gpio/gpio$GPIO_NUMBER/direction
# 设置中断触发方式为上升沿
echo "rising" > /sys/class/gpio/gpio$GPIO_NUMBER/edge
# 查看中断触发方式
cat /sys/class/gpio/gpio$GPIO_NUMBER/edge
# 设置 GPIO 输出高电平
echo "1" > /sys/class/gpio/gpio$GPIO_NUMBER/value
# 查看 GPIO 的值
cat /sys/class/gpio/gpio$GPIO_NUMBER/value
# 设置 GPIO 输出低电平
echo "0" > /sys/class/gpio/gpio$GPIO_NUMBER/value
# 取消导出 GPIO
echo $GPIO_NUMBER > /sys/class/gpio/unexport
```
C代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <poll.h>
int main() {
int fd, ret;
struct pollfd pfd;
char buf[64];
fd = open("/sys/class/gpio/gpio16/value", O_RDONLY);
if (fd < 0) {
perror("open");
return fd;
}
pfd.fd = fd;
pfd.events = POLLPRI;
while (1) {
lseek(fd, 0, SEEK_SET);
read(fd, buf, sizeof(buf));
ret = poll(&pfd, 1, -1);
if (ret > 0) {
if (pfd.revents & POLLPRI) {
lseek(fd, 0, SEEK_SET);
read(fd, buf, sizeof(buf));
printf("GPIO interrupt: value=%s\n", buf);
}
}
}
close(fd);
return 0;
}
例:操作NanoPi GPIO,以操作GPIOA6脚为例,对应Linux系统中的引脚编号为6(BCM编码)。
导出GPIO命令:echo 6 > /sys/class/gpio/export
查看板子信息链接:FriendlyELEC WiKihttps://wiki.friendlyelec.com/wiki/index.php/Main_Page#CPU_Boards
查看引脚图链接:
NanoPi NEO Core - FriendlyELEC WiKihttps://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO_Core#Layoutgpio readall
### 注意事项
- **权限**:修改 GPIO 配置文件通常需要 root 权限,确保使用 `sudo` 或在脚本中添加 `sudo`。
- **设备树配置**:如果是基于设备树的 GPIO 配置,确保设备树正确配置并重新编译加载。
- **GPIO 号**:确保使用正确的 GPIO 号,避免冲突或错误操作。
通过上述方法,你可以在 Linux 系统中灵活配置和使用 GPIO 的中断功能。