一 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 中也对此有详细说明。