现代linux gpio编程接口(by deepseek)

一 linux gpioinfo用的什么接口编程gpio

gpioinfo 命令基于 libgpiod 库和 Linux 内核的 GPIO 字符设备接口 (/dev/gpiochipX) 实现。

这是现代 Linux 系统上操作 GPIO 的标准方式,自内核 4.8 版本起已完全替代了传统的 sysfs 接口 (/sys/class/gpio)。

新旧接口对比

为了方便你理解,这里对比一下新旧两种方式:

特性 现代接口 (libgpiod) 传统接口 (sysfs)
访问路径 /dev/gpiochipX 字符设备 /sys/class/gpio/ 文件系统
核心库/工具 libgpiod 库及 gpioinfo 等命令行工具 直接操作文件 (echo/cat)
内核版本 Linux 4.8 及以后 Linux 4.8 之前 (现已弃用)
编程特点 功能丰富、支持事件监听、API 稳定 操作简单但性能差、已过时
推荐度 强烈推荐 不推荐在新项目中使用

如何自己编写 GPIO 控制程序?

如果你想自己写代码控制 GPIO,最直接的方法就是使用 libgpiod 库。

1. 准备工作

首先,在你的系统上安装开发库和工具:

bash

复制代码
sudo apt update
# 安装命令行工具
sudo apt install gpiod -y
# 安装C语言开发库
sudo apt install libgpiod-dev -y
# 安装Python3绑定
sudo apt install python3-libgpiod -y
2. C语言编程示例

这是一个简单的C程序,演示如何打开一个GPIO引脚并将其设置为高电平。

c

复制代码
#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
    // 1. 打开GPIO控制器,例如 /dev/gpiochip0
    struct gpiod_chip *chip = gpiod_chip_open("/dev/gpiochip0");
    if (!chip) {
        perror("打开芯片失败");
        return 1;
    }

    // 2. 获取你要操作的引脚(偏移量,例如第19号引脚)
    struct gpiod_line *line = gpiod_chip_get_line(chip, 19);
    if (!line) {
        perror("获取引脚失败");
        gpiod_chip_close(chip);
        return 1;
    }

    // 3. 将引脚申请为输出模式,并设置初始值为0(低电平),"my-led"是自定义的使用者标签
    int ret = gpiod_line_request_output(line, "my-led", 0);
    if (ret < 0) {
        perror("申请引脚为输出失败");
        gpiod_chip_close(chip);
        return 1;
    }

    // 4. 设置引脚值为1(高电平)
    gpiod_line_set_value(line, 1);
    printf("引脚已设置为高电平,等待3秒...\n");
    sleep(3);

    // 5. 清理资源
    gpiod_line_release(line);
    gpiod_chip_close(chip);

    return 0;
}

编译时,需要链接 gpiod 库:

bash

复制代码
gcc my_gpio.c -o my_gpio -lgpiod
3. Python编程示例

如果你更习惯用Python,操作会非常直观,利用了 python3-libgpiod 包:

python

复制代码
import gpiod
import time

# 1. 打开芯片0
chip = gpiod.Chip('0')

# 2. 获取引脚19
line = chip.get_line(19)

# 3. 申请为输出,初始值为0,请求标签为"my-led"
line.request(consumer="my-led", type=gpiod.LINE_REQ_DIR_OUT, default_vals=[0])

# 4. 设置值为1
line.set_value(1)
print("引脚已设置为高电平,等待3秒...")
time.sleep(3)

# 5. 释放资源
line.release()

注意:python3-libgpiod 的API在不同版本间可能有差异,上述示例适用于较新的版本。

掌握更多信息:常用命令行工具

除了编程,libgpiod 提供的那套命令行工具本身就非常强大,建议你先用它们熟悉一下硬件:

  • gpiodetect:列出系统上所有的GPIO控制器及其引脚数量。

  • gpioinfo [控制器名]:查看特定控制器上所有引脚的详细状态、方向和当前使用者。这也是你在问题中提到的命令。

  • gpioget <控制器> <偏移量>:读取一个引脚的值。

  • gpioset <控制器> <偏移量>=<值>:设置一个引脚的值。

  • gpiomon <控制器> <偏移量>:监控一个引脚的电平变化事件。

二 linux 3.x版本用不了这种方式对吗

是的,你的理解完全正确。

Linux 3.x 内核(以及更早的版本)不支持 libgpiod 和字符设备接口 (/dev/gpiochipX)。

在这个时代,操作 GPIO 的标准方法是 sysfs 接口 (位于 /sys/class/gpio)。

直到 Linux 4.8 内核发布(2016 年左右),libgpiod 才正式成为官方推荐方式,sysfs 接口也从此被标记为过时(Deprecated) 。

🆚 新旧接口核心差异

为了方便你快速理解两者的本质区别,可以参考下面的对比:

特性 旧方式:sysfs (Linux 3.x) 新方式:libgpio / 字符设备 (Linux 4.8+)
操作路径 /sys/class/gpio/ 文件系统 /dev/gpiochipX 字符设备
使用方式 通过 echo 和 cat 命令读写文件 使用 gpioset、gpioget 等专用命令
编程接口 标准 C 文件操作 (open, read, write) 专用 API (libgpiod)
内核支持 Linux 2.6.27 至 4.8 版本 Linux 4.8 及更高版本

💻 如何在 Linux 3.x 上操作 GPIO

如果你的板子必须使用 3.x 内核,那么你需要用 sysfs 的方式来操作 GPIO。基本步骤如下:

1. 进入 GPIO 目录

bash

复制代码
cd /sys/class/gpio

2. 导出你要使用的 GPIO 引脚

假设你想操作 GPIO 编号为 195 的引脚(编号计算方式见后文):

bash

复制代码
echo 195 > export

成功执行后,会生成一个名为 gpio195 的新目录。

3. 设置引脚方向并读写

bash

复制代码
cd gpio195

# 设置为输出模式,并输出高电平
echo out > direction
echo 1 > value

# 设置为输入模式,并读取电平
echo in > direction
cat value

4. 使用完毕后释放引脚

bash

复制代码
cd /sys/class/gpio
echo 195 > unexport

🔢 GPIO 编号的计算方法(重要)

在 sysfs 中,GPIO 编号是一个全局整数,并不是简单的物理引脚号。你需要根据 GPIO 控制器(Bank) 和 引脚偏移 来精确计算。

不同厂商的芯片计算方式略有不同,这里给你一个通用的计算公式,具体参数务必参考你手上的芯片数据手册:

text

复制代码
GPIO编号 = (Bank号) × (每个Bank的引脚数) + (组内偏移)
  • 每个Bank的引脚数:通常是 32。

  • 组内偏移 :对于每个 Bank 内的 A/B/C/D 小组,每个小组通常占 8 个引脚(A组:0-7,B组:8-15,依此类推)。

例如,Rockchip 平台的 GPIO3_D0 引脚:

  • Bank号 = 3

  • 偏移 = D组起始位24 + 0 = 24

  • 计算 = 3 × 32 + 24 = 120

建议: 最简单可靠的方法是查阅你手中开发板的内核文档或厂商提供的 GPIO 映射表。

📌 关键注意事项

  • 资源冲突 :如果某个 GPIO 引脚已经被内核中的其他驱动程序(如 LCD、SD卡、按键)占用,你在尝试 export 时会失败,报错 Device or resource busy 。

  • 权限问题 :通常需要 root 权限才能操作 /sys/class/gpio 下的文件。

对于 Linux 3.x 内核,在应用层用 sysfs 操作 GPIO 是唯一标准且可靠的方法,内核文档 Documentation/gpio/sysfs.txt 中也对此有详细说明。

相关推荐
夜听莺儿鸣7 小时前
502-003_Linux 中断与异常(一):从Linux角度理解中断与异常
linux·中断与异常·linux中断
杨云龙UP8 小时前
TDengine 3.4.2.8 Community 三节点三副本生产集群部署实战(DNode/MNode/taosAdapter/Explorer)
大数据·linux·运维·数据库·tdengine·时序库
向成科技9 小时前
XC3576H工控主板|深度适配Ubuntu 26.04 LTS,释放边缘AI与工业开发新潜能
linux·人工智能·ubuntu·机器人·硬件·主板·边缘ai
Fcy6489 小时前
Linux下 进程间关系与守护进程
linux·运维·服务器·守护进程
码农小韩10 小时前
Linux驱动理论(二)——Linux字符设备驱动
linux·嵌入式软件开发·linux操作系统·linux应用开发·linux驱动理论
well061210 小时前
Linux粘滞位与Makefile机制深度解析
linux·运维·服务器
再写一行代码就下班10 小时前
linux sh脚本在windows修改导致无法使用解决方式
java·linux·centos
额额额对了10 小时前
SPI通信
linux·c语言·汇编·单片机·嵌入式硬件·arm
子木HAPPY阳VIP11 小时前
Ubuntu 关闭防火墙操作步骤
linux·运维·ubuntu
王振超wzc11 小时前
嵌入式开发环境搭建--WM软件安装,Ubuntu操作系统安装
linux·运维·ubuntu