1、查看linux系统下gpio是否存在,计算gpio号
cat /sys/kernel/debug/gpio
如果存在,需查一下这个gpio口是否能用(可以和硬件工程师沟通,也可以看datesheet),能用就排查设备树,将其屏蔽掉。
一般gpio是32个为组例如
- 1、imx6ull板子
GPIOx_y的编号 = 控制引脚的寄存器基数(32 * (x-1))+ 控制引脚寄存器位数(y)。比如: GPIO4_26的GPIO号=32 * (4 -1) + 26=122; GPIO4_24的GPIO号=32 * (4 -1) + 24=120。 - 2、rk的板子
关于芯片RK3399的io控制中一个重要参数GPIO_number的计算方法为例;
A对应的是0 B对应的是1 C对应的是2以此类推
GPIOx_Ky x * 32 + (K -A) * 8 + y
GPIO1_B1 = 1 * 32 + (B-A) * 8 + 1 = 32 + 8 + 1 = 41;
GPIO2_B2 = 2 * 32 + (B-A) * 8 + 2 = 32 + 8 + 1 = 74。
2、如何设置gpio
以imx6ull板子GPIO4_26为例:
32 * 3 + 26 = 122;
- 1、创建gpio
echo 122 > /sys/class/gpio/export
如果成功了可以在/sys/class/gpio的目录下看见 gpio122 - 2、设置gpio为输入还是输出,如果为输入使用权就不在我们这边,不能手动拉高拉低
out —> 输出
in -----> 输入 (这个状态一般是板子自己拉高拉低,我们只去读他的状态就可以了,不能去设置高低电平)
echo out > /sys/class/gpio/gpio122/direction //输出
echo in > /sys/class/gpio/gpio122/direction //输出 - 3、设置gpio的高低电平
0 —> 低电平
1 —> 高电平
echo 0 > /sys/class/gpio/gpio122/value //设置为低电平
echo 1 > /sys/class/gpio/gpio122/value //设置为高电平 - 4、如何看gpio状态是高电平还是低电平
cat /sys/class/gpio/gpio122/value - 5、如何设置中断方式
none表示引脚为输入,不是中断引脚
rising —>上升沿触发
falling —>下降沿触发
both —> 边沿触发
echo none > /sys/class/gpio/gpio122/edge //不是中断引脚
echo rising > /sys/class/gpio/gpio122/edge //上升沿触发
echo falling > /sys/class/gpio/gpio122/edge //下降沿触发
echo both > /sys/class/gpio/gpio122/edge //边沿触发
3、linux应用程序控制gpio示例代码
注意用system的方式比较消耗资源,linux下一切皆文件,也可以用读写文件的方式,后面补充上来
//初始化gpio函数
void Init_Gpio(void)
{
system("echo 1021 > /sys/class/gpio/export"); //创建gpio
system("echo out > /sys/class/gpio/gpio1021/direction"); //设置gpio为输出 如果是in就是输入
system("echo 0 > /sys/class/gpio/gio1021/value"); //设置gpio为低电平
}
//设置某一个gpio的状态函数
int Set_Gpio_Value(int value, int gpio_num)
{
if(gpio_num < 0){
return -1;
}
char buf[30] = {0};
int ret = 0;
FILE * fd;
sprintf(buf, "/sys/class/gpio/gio%d/value", gpio_num);
fd = fopen(buf, "r+");
if(fd < 0){
return -1;
}
if(fwrite(&value, 1, 1, fd)< 0){
return -1;
}
fclose(fd);
return 0;
}
//读取gpio的值
int Get_Gpio_Value(int gpio_num)
{
if(gpio_num < 0){
return -1;
}
FILE *fd;
int value = 0;
char buf1[50] = {0};
sprintf(buf1, "/sys/class/gpio/gpio%d/value", gpio_num);
fd = fopen(buf1, "r");
if(fd < 0){
return -1;
}
char buf[10] = {0};
if(fread(buf, 10, 1, fd) < 0){
return -1;
}
value = atoi(buf);
fclose(fd);
return value;
}