gpio操作可以通过sys文件系统接口,文件系统 gpio 操作 在文件系统操作 GPIO 时,必须先检查想要操作的 GPIO 是否被其他驱动占用,如果 被占用,后续操作会报 busy 的警告。
以操作拓展脚的一个接口为例,使用万用表测 量电压。(ECSPI2_MOSI_3V3, GPIO5_IO11,139)
导出 GPIO
root@myd-jx8mp:~# echo 139 > /sys/class/gpio/export
导出成功后会在/sys/class/gpio/目录下生成 gpio139 这个目录。
设置/查看 GPIO 方向 设置输出,输入以下命令:
root@myd-jx8mp:~# echo out > /sys/class/gpio/gpio139/direction
或者设置输入:
root@myd-jx8mp:~# echo in > /sys/class/gpio/gpio139/direction
查看 gpio 方向:
root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/direction out
返回 in 表示输入,返回 out 表示输出。
设置/查看 GPIO 的值 设置输出低:
root@myd-jx8mp:~# echo "0" > /sys/class/gpio/gpio139/value
或者设置输出高:
root@myd-jx8mp:~# echo "1" > /sys/class/gpio/gpio139/value
查看 gpio 的值:
root@myd-jx8mp:~# cat /sys/class/gpio/gpio139/value 1
可以看到 GPIO5_IO11 输出高电平,然后可以用万用表测量 J25 扩展 IO 的 ECSPI2_MOSI_3V3 引脚,可以看到电压为 3.3V 左右
GPIO68各属性文件的用途
文件名 |
路径 |
作用 |
active_low |
/sys/class/gpio/gpio139/active_low |
具有读写属性。用于决定value中的值是否翻转——0不翻转,1翻转。 |
edge |
/sys/class/gpio/gpio139/edge |
具有读写属性。设置GPIO中断,或检测中断是否发生。 |
subsystem |
/sys/class/gpio/gpio139/subsystem |
符号链接,指向父目录。 |
value |
/sys/class/gpio/gpio139/value |
具有读写属性。GPIO的电平状态设置或读取。 |
direction |
/sys/class/gpio/gpio139/direction |
具有读写属性。用于查看或设置GPIO输入输出 |
power |
/sys/class/gpio/gpio139/power |
设备供电方面的相关信息 |
uevent |
/sys/class/gpio/gpio139/uevent |
内核与udev(自动设备发现程序)之间的通信接口 |
device |
/sys/class/gpio/gpio139/device |
符号链接,指向父目录。 |
实际应用中,通过c语言读写linux系统文件的方式对gpio进行操作,示例代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
#include <string.h>
#define DEV_PATH "/sys/class/gpio/gpio139/value" // 输入输出电平值设备
#define EXPORT_PATH "/sys/class/gpio/export" // GPIO设备导出设备
#define DIRECT_PATH "/sys/class/gpio/gpio139/direction" // GPIO输入输出控制设备
#define OUT "out"
#define IN "in"
#define GPIO "139" //gpio号
#define HIGH_LEVEL "1"
#define LOW_LEVEL "0"
int main(int argc, char ** argv)
{
static int fd_dev, fd_export, fd_dir, ret;
char buf[10], direction[4];
fd_export = open(EXPORT_PATH, O_WRONLY); // 打开GPIO设备导出设备
if(fd_export < 0) {
perror("open export:");
return -1;
}
write(fd_export, GPIO, strlen(GPIO));
fd_dev = open(DEV_PATH, O_RDWR); // 打开输入输出电平值设备
if(fd_dev < 0) {
perror("open gpio:");
return -1;
}
fd_dir = open(DIRECT_PATH, O_RDWR); // 打开GPIO输入输出控制设备
if(fd_dir < 0) {
perror("open direction:");
return -1;
}
ret = read(fd_dir, direction, sizeof(direction)); // 读取GPIO输入输出方向
if(ret < 0) {
perror("read direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
printf("default direction:%s", direction);
strcpy(buf, IN);
ret = write(fd_dir, buf, strlen(IN));
if(ret < 0) {
perror("write direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
ret = read(fd_dir, direction, sizeof(direction));
if(ret < 0) {
perror("read direction:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
ret = read(fd_dev, buf, sizeof(buf)); // 读取GPIO输入电平值
if(ret < 0) {
perror("read gpio:");
close(fd_export);
close(fd_dir);
close(fd_dev);
return -1;
}
printf("current direction:%sinput level:%s", direction, buf);
close(fd_export);
close(fd_dir);
close(fd_dev);
return 0;
}