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