GPIO 同样也是通过 sysfs 方式进行操控,进入到/sys/class/gpio 目录下,
- export:用于将指定编号的 GPIO 引脚导出。在使用 GPIO 引脚之前,需要将其导出,导出成功之后才能使用它。注意 export 文件是只写文件,不能读取,将一个指定的编号写入到 export 文件中 即可将对应的 GPIO 引脚导出
- unexport:将导出的 GPIO 引脚删除。当使用完 GPIO 引脚之后,我们需要将导出的引脚删除,同样该文件也是只写文件、不可读。
- direction:配置 GPIO 引脚为输入或输出模式。该文件可读、可写,读表示查看 GPIO 当前是输入还是输出模式,写表示将 GPIO 配置为输入或输出模式;读取或写入操作可取的值为"out"(输出模式)和"in"(输入模式)
- value:在 GPIO 配置为输出模式下,向 value 文件写入"0"控制 GPIO 引脚输出低电平,写入"1"则控制 GPIO 引脚输出高电平。在输入模式下,读取 value 文件获取 GPIO 引脚当前的输入电平状态
/*** @brief 设置 gpio 为输出,拉高或拉低* @param gpio : 引脚* @param value : 0/1*/
DT_PUBLIC int dt_gpio_set(int gpio, int value) {char gpio_file[128] = {0}; // 用于存储 gpio 相关文件路径的字符数组char buff[8] = {0}; // 用于存储写入文件的内容的字符数组int fd = -1; // 文件描述符,初始化为 -1/* 打开对应 gpio */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d", gpio);// 检查指定的 gpio 文件是否存在,如果不存在则进行后续操作if (access(gpio_file, F_OK)!= 0) {fd = open("/sys/class/gpio/export", O_WRONLY);// 如果打开文件失败,返回 falseif (fd < 0) {return false;}snprintf(buff, sizeof(buff), "%d", gpio);write(fd, buff, strlen(buff));close(fd);fd = -1;// 再次检查 gpio 文件是否存在,如果仍不存在,返回 falseif (access(gpio_file, F_OK)!= 0) {return false;}}// usleep(1*1000);/* 设置方向 */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d/direction", gpio);fd = open(gpio_file, O_RDWR);// 如果打开文件失败,返回 falseif (fd < 0) {return false;}snprintf(buff, sizeof(buff), "out");write(fd, buff, strlen(buff));close(fd);fd = -1;/* 设置值 */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d/value", gpio);fd = open(gpio_file, O_RDWR);// 如果打开文件失败,返回 falseif (fd < 0) {return false;}snprintf(buff, sizeof(buff), "%d", value);write(fd, buff, strlen(buff));close(fd);fd = -1;return true;
}
/*** @brief 设置gpio为输入, 读电平* @return 0/1, 若为-1, 则读失败*/
DT_PUBLIC int dt_gpio_read(int gpio)
{char gpio_file[128] = {0};int fd = -1;char buff[8] = {0};int value = 0;/* 打开对应gpio */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d", gpio);if (access(gpio_file, F_OK) != 0) {fd = open("/sys/class/gpio/export", O_WRONLY);if (fd < 0) {return -1;}snprintf(buff, sizeof(buff), "%d", gpio);write(fd, buff, strlen(buff));close(fd);fd = -1;if (access(gpio_file, F_OK) != 0) {return -1;}}// usleep(1*1000);/* 设置方向 */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d/direction", gpio);fd = open(gpio_file, O_RDWR);if (fd < 0) {return -1;}snprintf(buff, sizeof(buff), "in");write(fd, buff, strlen(buff));close(fd);fd = -1;/* 读取值 */snprintf(gpio_file, sizeof(gpio_file), "/sys/class/gpio/gpio%d/value", gpio);fd = open(gpio_file, O_RDONLY);/* 只读方式打开 */if (fd < 0) {return -1;}read(fd, buff, strlen(buff));sscanf(buff, "%d", &value);close(fd);fd = -1;return value;
}