Linux系统通过libgpiod读写GPIO

本文介绍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 25

4)gpioset

写gpio值,如设置line 24为1,line 25为0, 命令如下:

gpioset gpiochip0 24=1 25=0

5)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);  //close chip

    return 0;
}

编译的时候别忘里引入“-lgpiod”库,如使用gcc编译:

gcc -o gpio gpio.c -lgpiod

总结,本文介绍了Linux系统通过libgpiod读写GPIO。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值