基于Linux系統(tǒng)實現(xiàn)DragonBoard 410c GPIO的控制
一、 DragonBoard 410c GPIO口分布情況及測試硬件連線
如圖1所示,在 DragonBoard 410c 開發(fā)板上,其GPIO口通過接口進(jìn)行了預(yù)留,用戶在開發(fā)測試過程中可以方便的通過排針或者排線接入到 DragonBoard 410c 的GPIO口,實現(xiàn)與外設(shè)的連接,對外設(shè)進(jìn)行控制,同時也可以通過下載 DragonBoard 410c GPIO PDF和使用說明文檔查看其GPIO詳細(xì)信息,在410c資料包中的SchemaTIcas_DragonBoard.pdf文件中對410c板子的GPIO口設(shè)計有詳細(xì)的說明,如下圖1給出了開發(fā)板的GPIO硬件接口J8的詳細(xì)設(shè)計,通過該圖可以知道整個410c開發(fā)板的GPIO外部接口連接情況。
本文引用地址:http://m.butianyuan.cn/article/201710/365557.htm圖1 DragonBoard 410c外部GPIO口引出接口J8的連接原理圖
根據(jù)上述原理圖,可以在板子上用杜邦線連接,本文在測試過程中選取的是GPIO_36和GPIO_12兩個GPIO口作為控制,其中GPIO12控制LED燈,GPIO_36用于接收按鍵信號,檢測開關(guān)是否被按下,開關(guān)每次按下LED燈狀態(tài)改變一次,整個控制電路硬件連接如圖2所示。
圖2 DragonBoard 410c按鍵控制LED燈硬件連接示意圖
二、程序設(shè)計
1)在linux環(huán)境下用vim編輯器建立工程程序文件key_led_test.c,該文件是測試工程的主文件,起命令如下:
mkdir key_led_test
vim key_led_test.c
通過GPIO口控制LED和檢測按鍵信號的基本原理如下:
首先需要對使用的GPIO口進(jìn)行導(dǎo)入,完成導(dǎo)入后的GPIO口才可以進(jìn)讀寫,起導(dǎo)入GPIO口的函數(shù)機代碼如下:
int Export_GPIO(int gpio) {
int fd;
char buf[MAX_BUF];
sprintf(buf, “%d”, gpio);
fd = open(“/sys/class/gpio/export”, O_WRONLY);
if(fd 0)
return -1;
write(fd, buf, strlen(buf));
close(fd); return 0; }
}
然后對GPIO口進(jìn)行讀寫數(shù)據(jù),其中讀寫的實現(xiàn)函數(shù)及代碼如下:
int Write_GPIO(int gpio, int value) {
int fd; char buf[MAX_BUF]; //Set the direcTIon of the GPIO to output
sprintf(buf, “/sys/class/gpio/gpio%d/direcTIon”, gpio);
fd = open(buf, O_WRONLY); if(fd0)
return -1;
write(fd, “out”, 3);// Set out direcTIon
close(fd);
sprintf(buf, “/sys/class/gpio/gpio%d/value”, gpio);
fd = open(buf, O_WRONLY);
if(fd0)
return -1; // Write the GPIO value
sprintf(buf, “%d”, value);
write(fd, buf, strlen(buf));
close(fd); return 0;
}
int Read_GPIO(int gpio, int *value) {
int fd; char val;
char buf[MAX_BUF];
sprintf(buf, “/sys/class/gpio/gpio%d/value”, gpio);
fd = open(buf, O_RDONLY);
if(fd0)
return -1;
// Read the GPIO value
read(fd, val, 1);
*value = atoi(val);
close(fd); return 0;
}
最后,完成GPIO的讀寫操作后,需要導(dǎo)出GPIO口,起實現(xiàn)函數(shù)及代碼如下:
int UnExport_GPIO(int gpio) {
int fd; char buf[MAX_BUF];
sprintf(buf, “%d”, gpio);
fd = open(“/sys/class/gpio/unexport”, O_WRONLY);
if(fd 0)
return -1;
write(fd, buf, strlen(buf));
close(fd); return 0;
}
以上就是操作GPIO口的核心函數(shù)及實現(xiàn)過程,接著利用這些核心函數(shù)的調(diào)用和設(shè)計簡單的邏輯就可以完成對連接410c板子上的按鍵進(jìn)行檢測同事控制LED等的狀態(tài),其中按鍵檢測的實現(xiàn)函數(shù)如下:
int get_key_status(int Key){
int tmp=1;
int time=0;
Write_GPIO(Key, 1) ;
do{
delay_ms(10);
if(Read_GPIO(Key, tmp)==0){
time++;
}
else return -1;
if(time>=100){
break; //按下時間超過1s,表示完成一次按動作,退出檢測。
}
}while(!tmp)
if(time>=50){ //大于0.5s認(rèn)為按鍵按下,不是干擾或者誤按
return KEY_DOWN;
}
else return KEY_UP;
}
完成按鍵檢測后,就可以根據(jù)按鍵來實現(xiàn)對LED的控制,其中LED的控制是通過輸出高電平來點亮LED,輸出低電平來熄滅LED,其實現(xiàn)函數(shù)如下:
int set_led_status(int Led,int status){
if(Write_GPIO(led, status)==0){
return 0;
}
else return -1;
}
基于對GPIO的讀寫函數(shù)完成上述KEY的狀態(tài)讀取和LED的狀態(tài)控制函數(shù)后,就可以利用這兩個函數(shù)方便的構(gòu)建按鍵控制LED的程序,其中.c中的部分核心代碼如下:
#include
#include
#include
#include
#include
#define MAX_BUF 10
#define GPIO_A 36
#define GPIO_B 12
#define KEY_DOWN 1;
#define KEY_UP 0;
#define LED_LIGHT;
#define LED_EXTING;
int Export_GPIO(int gpio);
int UnExport_GPIO(int gpio);
int Write_GPIO(int gpio, int value);
int Read_GPIO(int gpio, int *value);
int get_key_status(int Key);
int set_led_status(int Led,int status);
int main(void) {
int KeyStatus=KEY_UP;
int LedStatus=LED_EXTING;
ret = Export_GPIO(GPIO_A);
if(ret != 0)
printf(“Error exporting GPIO_%d”, GPIO_A);
ret = Export_GPIO(GPIO_B);
if(ret != 0)
printf(“Error exporting GPIO_%d”, GPIO_B);
printf(“you can press key to change LED statusn”);
while(1) {
KeyStatus=get_key_status(GPIO_A);
if(keyStatus!=-1) LedStatus=KeyStatus;
else{
printf(“get_key_status erro!n”);
return -1;
if(-1== set_led_status(GPIO_B, LedStatus)) {
printf(“set_led_status erro!n”);
return -1;
}
}
ret = UnExport_GPIO(GPIO_A);
if(ret != 0)
printf(“Error UnExporting GPIO_%d”, GPIO_A);
ret = UnExport_GPIO(GPIO_B);
if(ret != 0)
printf(“Error UnExporting GPIO_%d”, GPIO_B); return 0;
}
以上就是整個利用410c開發(fā)板在linux操作系統(tǒng)環(huán)境下實現(xiàn)對GPIO的操作,通過GPIO口讀取按鍵信息實現(xiàn)對LED的控制。
三、程序編譯和運行
在linux環(huán)境下,可以通過arm-linux-gcc交叉編譯工具來編譯平臺的程序,生成可執(zhí)行的程序文件,然后下載到開發(fā)板上運行,其中編譯命令參考如下:
arm-linux-gcc -o key_led_test key_led_test.c
完成編譯后生成key_led_test文件,執(zhí)行下面命令改變其權(quán)限,使得其成為可執(zhí)行文件:
chmod 777 key_led_test
最后執(zhí)行key_led_test即可在板子上通過按按鍵控制LED燈。
評論