linux通用GPIO驅動,寫GPIO文件不立即生效問題解決


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種,第一種資源開銷太大;第三種太耗費時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM