sysfs接口是Linux内核提供的一种让用户空间程序访问和控制内核对象(包括设备、驱动等)信息的机制,它基于虚拟文件系统,将内核对象信息以文件系统的形式表现出来,用户或程序员可以通过读写这些文件来获取或修改内核对象的属性。对于GPIO(通用输入/输出)操作,早期Linux内核版本提供了基于/sys/class/gpio路径的sysfs接口,用户可以通过读写该目录下的虚拟文件来控制GPIO的方向(输入或输出)、值(高电平或低电平)以及中断触发方式等。
然而,从Linux 4.8版本开始,该GPIO sysfs接口已被标为过时(deprecated),并会在未来的版本中被移除,取而代之的是由chardev接口和用户空间库libgpiod组成的新方式。
尽管sysfs接口在一些情况下仍在使用,但由于其底层实现对用户不透明,易用性较差,且在未来可能被移除,因此通常推荐新项目使用更加现代和稳定的接口如libgpiod库来操作GPIO。
1. sysfs接口:
sysfs是一种在Linux内核中提供文件系统接口的方式,它可以用于控制和监视GPIO引脚。使用sysfs接口可以通过读写特定的文件来操作GPIO引脚。
首先,确保内核配置中已启用sysfs GPIO支持:
CONFIG_GPIO_SYSFS=y
然后,可以通过以下代码示例来控制GPIO引脚的输入输出状态:
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>#define GPIO_IN "/sys/class/gpio/gpioXX/value"
#define GPIO_OUT "/sys/class/gpio/gpioXX/value"int main()
{int fd;char value;// 导出GPIO引脚fd = open("/sys/class/gpio/export", O_WRONLY);write(fd, "XX", 2); // XX是引脚编号close(fd);// 设置GPIO引脚的方向fd = open("/sys/class/gpio/gpioXX/direction", O_WRONLY);write(fd, "out", 3); // 或者写"in"表示输入close(fd);// 设置GPIO引脚的值fd = open(GPIO_OUT, O_WRONLY);write(fd, "1", 1);close(fd);// 读取GPIO引脚的值fd = open(GPIO_IN, O_RDONLY);read(fd, &value, 1);close(fd);printf("GPIO value: %c\n", value);// 清除GPIO引脚fd = open("/sys/class/gpio/unexport", O_WRONLY);write(fd, "XX", 2);close(fd);return 0;
}
将代码中的XX替换为相应的GPIO引脚编号,即可进行控制。使用sysfs接口的好处是简单易用,但是对于高频率的操作可能会有性能问题。
2. libgpiod库:
libgpiod是一个用户空间用于控制GPIO的库,它提供了灵活的API来直接操作GPIO引脚,而无需依赖sysfs接口。
首先,确保已安装libgpiod库及其头文件。然后使用以下代码示例来控制GPIO引脚:
#include <stdio.h>
#include <gpiod.h>int main()
{struct gpiod_chip *chip;struct gpiod_line *line;int val;// 打开GPIO设备chip = gpiod_chip_open_by_number(0); // 0是设备编号,根据实际情况修改// 获取GPIO引脚line = gpiod_chip_get_line(chip, X); // 替换X为引脚编号// 设置GPIO引脚的方向gpiod_line_request_output(line, "gpio-example", GPIOD_LINE_ACTIVE_STATE_HIGH);// 设置GPIO引脚的值gpiod_line_set_value(line, 1); // 设置为高电平// 读取GPIO引脚的值val = gpiod_line_get_value(line);printf("GPIO value: %d\n", val);// 关闭GPIO设备gpiod_line_release(line);gpiod_chip_close(chip);return 0;
}
将代码中的X替换为相应的GPIO引脚编号,然后使用libgpiod提供的函数来控制GPIO引脚的方向和值。使用libgpiod库的好处是它提供了更灵活和高效的GPIO操作方式,适用于对性能要求较高的应用。