linux通用GPIO驱动,写GPIO文件不立即生效问题解决

时间:2021-11-19 17:56:45

Linux开发平台实现了通用GPIO的驱动,用户通过,SHell或者系统调用能控制GPIO的输出和读取其输入值。其属性文件均在/sys/class/gpio/目录下,该目录下有export和unexport两个属性文件,其余都是连接文件,如gpiochipN等。

export文件导出某个GPIO,unexport将导出的GPIO从/sysfs中删除。向export文件写入要操作的GPIO序号N可以导出对应的GPIO设备目录,例如:

#echo 68>/sys/class/gpio/export

通过以上操作,在/sys/class/gpio/目录下生成gpio68/目录。通过读写该目录下的属性文件就可以操作该GPIO引脚。该目录具有一下属性文件:

1、active_low:具有读写属性,决定value中的值是否翻转,0不翻转,1翻转。

2、edge:具有读写属性,设置GPIO中断或检测中断是否发生。

3、subsystem:符号链接,指向父目录。

4、value:具有读写属性,GPIO引脚电平属性读取或者设置

5、direction:具有读写属性,用于设置或查看GPIO引脚输入输出方向

6、power:设备与供电方面相关的信息

7、uevent:内核与(udev,自动设备发现程序)之间的通信接口。

输入输出设置:

#echo out>/sys/class/gpio/gpioN/direction   #设置输出

#echo in>/sys/class/gpio/gpioN/direction   #设置输入

输入读取:

#echo in>/sys/class/gpio/gpioN/direction #设置输入

#cat /sys/class/gpio/gpioN/value  #查看电平

输出控制:

#echo out>/sys/class/gpio/gpioN/direction

#echo 0>/sys/class/gpio/gpioN/value  #输出低电平

#echo 1>/sys/class/gpio/gpioN/value #输出高电平

在C中操作GPIO

int fd_export=open("/sys/class/gpio/export",0_RDWR);//打开GPIO导出设备

write(fd_export,"N",,strlen("N"));

close(fd_export);

int fd_direcction = open("/sys/class/gpio/gpioN/direction",o_RDWR);

write(fd_direction,"out",strlen("out"));//设置为输出

close(fd_direction);

int fd_value=open("/sys/'class/gpio/gpioN/value",O_RDWR);

write(fd_value,"1",strlen("1"));

close(fd_value);

 

2018年3月14日:

     最近在用文件读写的方式操着GPIO引脚的应用中发现写操作不能及时生效,linux系统再读写文件时默认是再内存中先缓存的,设备文件也比例外,所以偶尔一块应用中会出现操作写设备文件不生效。如果要及时生效可以采用一下几个方法之一:

   1、条用系统命令:system("sync");

 2、再打开文件时添加:QIODevice::Unbuffered标志,如  open(QIODevice::ReadWrite | QIODevice::Unbuffered);

   3、写动作完成之后立即读取。

   个人建议采用第2种,第一种资源开销太大;第三种太耗费时间。