Linux GPIO操作

在 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 WiKiicon-default.png?t=N7T8https://wiki.friendlyelec.com/wiki/index.php/Main_Page#CPU_Boards

        查看引脚图链接:

NanoPi NEO Core - FriendlyELEC WiKiicon-default.png?t=N7T8https://wiki.friendlyelec.com/wiki/index.php/NanoPi_NEO_Core#Layoutgpio readall

### 注意事项

- **权限**:修改 GPIO 配置文件通常需要 root 权限,确保使用 `sudo` 或在脚本中添加 `sudo`。
- **设备树配置**:如果是基于设备树的 GPIO 配置,确保设备树正确配置并重新编译加载。
- **GPIO 号**:确保使用正确的 GPIO 号,避免冲突或错误操作。

通过上述方法,你可以在 Linux 系统中灵活配置和使用 GPIO 的中断功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值