樹莓派、龍芯智龍這類mini開發板上的Linux系統,通常都提供了像Arduino同樣操做引腳電路的功能,統稱GPIO接口(General-purpose input/output,通用目的輸入輸出)。但與Arduino不一樣,使用上涉及稍複雜的Linux內核概念。不一樣於Arduino直接將物理硬件暴露給用戶的形式(直接進行編程和操做,並燒寫芯片),Linux系統必須經過一個叫「驅動」的程序將物理硬件進行封裝,而後把其包裝好的接口按照linux文件系統的方式,提供給用戶進行操做,用戶操做硬件的時候必須經過這個文件系統進行輸入輸出,也就是所謂的「用戶態編程」。總結起來就是3種方式:html
(用戶態編程,此時龍芯智龍V2上的LED對應的GPIO口爲51號)linux
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(void){ FILE *p=NULL; int i=0; int port=51; p = fopen("/sys/class/gpio/export","w"); fprintf(p,"%d",port); fclose(p); p = fopen("/sys/class/gpio/gpio51/direction","w"); fprintf(p,"out"); fclose(p); for(i=0;i<100;i++){ p = fopen("/sys/class/gpio/gpio51/value","w"); fprintf(p,"%d",1); sleep(1); fclose(p); p = fopen("/sys/class/gpio/gpio51/value","w"); fprintf(p,"%d",0); sleep(1); fclose(p); } p = fopen("/sys/class/gpio/unexport","w"); fprintf(p,"%d",port); fclose(p); return 0; }
在VMware虛擬機安裝的Kylin Ubuntu上經過交叉編譯工具進行編譯:編程
mipsel-linux-gcc led51.c -o led51_mips
將編譯好的led51_mips可執行文件考到u盤,經過u盤考到智龍主板上,遠程連接智龍並進入智龍的linux系統,輸入./led51_mips運行該可執行文件,能夠看到智龍主板上5顆led燈在不停地閃爍,說明程序成功。bash
(用戶態編程,此時龍芯智龍V2上的S3按鍵對應的GPIO口爲92號):工具
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int main(void){ FILE *p=NULL; char i[100]={0,}; p = fopen("/sys/class/gpio/export","w"); fprintf(p,"%d",92); fclose(p); p = fopen("/sys/class/gpio/gpio92/direction","w"); fprintf(p,"in"); //配置成輸入 fclose(p); while(1){ //以只讀方式打開 p = fopen("/sys/class/gpio/gpio92/value","r"); //使文件讀寫定位到0位置 fseek(p , 0 , 0); #if 0 //將文件內容輸出到存儲器i中,注意要以字符串的方式,不然會出錯 fscanf(p,"%s",i); #else //從文件中讀出數據到存儲器i中 fread(i , 1, 1 ,p); #endif //以字符的方式將讀到的值打印出 printf("key = %c \r\n",i[0]); sleep(1); //注意這裏必需要關閉,而後再次讀時再從新打開,這樣只面的內容纔會更新 fclose(p); } return 0; }
在VMware虛擬機安裝的Kylin Ubuntu上經過交叉編譯工具進行編譯:ui
mipsel-linux-gcc button92.c -o button92_mips
將編譯好的button92_mips可執行文件考到u盤,經過u盤考到智龍主板上,遠程連接智龍並進入智龍的linux系統,輸入./button92_mips運行該可執行文件,能夠看到程序在不斷地打印按鈕的狀態,咱們按下智龍主板上的按鍵,就會看到按鈕的狀態會在一、0之間變化,說明程序成功了。spa
參考:操作系統