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