本文介绍Linux系统通过libgpiod读写GPIO。
从Linux 4.8后,官方不再推荐使用sysfs操作GPIO,目前,libgpiod是操作GPIO的首选方法。本文以Raspberry Pi 4开发板为例简要介绍通过libgpiod读写GPIO。
1.libgpiod简介
libgpiod是用于Linux环境下与GPIO交互的C库和工具,它封装了ioctl调用和简单的API接口。与sysfs方式相比,libgpiod可以保证所有分配的资源,在关闭文件描述符后得到完全释放,并且拥有sysfs方式接口中不存在的功能(如时间轮询,一次设置/读取多个gpio值)。此外,libgpiod还包含一组命令行工具,允许用户使用脚本对gpio进行操作。
2.安装libgpiod
要使用libgpiod需先安装相应的命令行开发工具及库,命令如下:
sudo apt-get install gpiod libgpiod-dev -y命令行工具主要提供如下命令:
1)gpiodetect
检测系统存在的gpiochips,名称,GPIO管脚数量,如树梅派的:

2)gpioinfo
查看gpio详细信息,在操作gpio时非常有用,如树梅派的:

3)gpioget
读取gpio值,如读取line 23,line 25这2个GPIO值,命令如下:
gpioget gpiochip0 23 254)gpioset
写gpio值,如设置line 24为1,line 25为0, 命令如下:
gpioset gpiochip0 24=1 25=05)gpiofind
根据名称查询line,如上图line 5的名称为“GPIO5”,命令如下:
gpiofind GPIO5返回如下:

和上面的gpio信息一致。
6)gpiomon
监听GPIO上的时间,用于读取GPIO状态,如监听line 23,命令如下:
gpiomon gpiochip0 23命令会阻塞在那里,当GPIO状态发生变化时会打印出来。
3.使用libgpiod编程
这里以C代码为例,参考代码如下:
#include <gpiod.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(void)
{
    const char *chipname = "gpiochip0";
    struct gpiod_chip *chip;
    struct gpiod_line *line;
    int ret;
    int value;
    chip = gpiod_chip_open_by_name(chipname);  //open chip
    if (chip == NULL) {
        printf("gpiod open failed\r\n");
    }
    line = gpiod_chip_get_line(chip, 23);  //get gpio line
    if (line == NULL) {
        printf("gpiod get line failed\r\n");
    }
    /*
    ret = gpiod_line_request_output(line, "Consumer", 0);  //set gpio output mode
    if (ret < 0) {
        printf("gpiod request output failed\r\n");
    }
    */
    /*
    ret = gpiod_line_set_value(line, 1);  //output 1
    if (ret < 0) {
        printf("gpiod set value failed\r\n");
    }
    */
    /*
    ret = gpiod_line_set_value(line, 0);  //output 0
    if (ret < 0) {
        printf("gpiod set value failed\r\n");
    }
    */
    
    ret = gpiod_line_request_input(line, "Consumer");  //set gpio input mode
    if (ret < 0) {
        printf("gpiod request input failed\r\n");
    }
    value = gpiod_line_get_value(line);  //read gpio
    printf("gpiod value:%d\r\n", value);
    gpiod_line_release(line);  //release gpio line
    gpiod_chip_close(chip);  //chose chip
    return 0;
}编译的时候别忘里引入“-lgpiod”库,如使用gcc编译:
gcc -o gpio gpio.c -lgpiod总结,本文介绍了Linux系统通过libgpiod读写GPIO。

![[2025]基于微信小程序慢性呼吸系统疾病的健康管理(源码+文档+解答)](https://i-blog.csdnimg.cn/direct/a0087e55af2c410caf5fe1d1c809308e.png)

















