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

    return 0;
}

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

gcc -o gpio gpio.c -lgpiod

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

嵌入式Linux中,可以通过sysfs文件系统读写GPIO。sysfs是Linux内核提供的一种虚拟文件系统,可以让用户空间程序访问内核数据结构。GPIO在sysfs中的路径为/sys/class/gpio。 以下是使用C语言读取GPIO的步骤: 1. 在/sys/class/gpio目录中创建GPIO节点,命名格式为gpioN,其中N为GPIO的编号。 2. 设置GPIO方向为输入或输出。在GPIO节点目录下,将direction文件写入in或out。 3. 读取或写入GPIO状态。在GPIO节点目录下,读取value文件可以获取GPIO的当前状态,写入value文件可以设置GPIO的状态。 下面是一个简单的示例程序,读取GPIO1的状态: ```c #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #define GPIO_DIR "/sys/class/gpio" #define GPIO_NUM "1" int main(void) { int fd; char buf[10]; // 创建GPIO节点 fd = open(GPIO_DIR "/export", O_WRONLY); sprintf(buf, "%d", 1); write(fd, buf, strlen(buf)); close(fd); // 设置GPIO方向为输入 fd = open(GPIO_DIR "/gpio" GPIO_NUM "/direction", O_WRONLY); write(fd, "in", 2); close(fd); // 读取GPIO状态 fd = open(GPIO_DIR "/gpio" GPIO_NUM "/value", O_RDONLY); read(fd, buf, 1); close(fd); if (buf[0] == '0') printf("GPIO1 is low\n"); else printf("GPIO1 is high\n"); return 0; } ``` 需要注意的是,在使用GPIO之前,需要先将GPIO对应的引脚配置为GPIO模式,否则无法读写GPIO。具体的引脚配置方法和GPIO编号与引脚对应关系需要根据嵌入式系统的硬件平台和相关文档来确定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值