基于Linux系统实现DragonBoard 410c GPIO的控制
一、 DragonBoard 410c GPIO口分布情况及测试硬件连线
如图1所示,在 DragonBoard 410c 开发板上,其GPIO口通过接口进行了预留,用户在开发测试过程中可以方便的通过排针或者排线接入到 DragonBoard 410c 的GPIO口,实现与外设的连接,对外设进行控制,同时也可以通过下载 DragonBoard 410c GPIO PDF和使用说明文档查看其GPIO详细信息,在410c资料包中的SchemaTIcas_DragonBoard.pdf文件中对410c板子的GPIO口设计有详细的说明,如下图1给出了开发板的GPIO硬件接口J8的详细设计,通过该图可以知道整个410c开发板的GPIO外部接口连接情况。

图1 DragonBoard 410c外部GPIO口引出接口J8的连接原理图
根据上述原理图,可以在板子上用杜邦线连接,本文在测试过程中选取的是GPIO_36和GPIO_12两个GPIO口作为控制,其中GPIO12控制LED灯,GPIO_36用于接收按键信号,检测开关是否被按下,开关每次按下LED灯状态改变一次,整个控制电路硬件连接如图2所示。

图2 DragonBoard 410c按键控制LED灯硬件连接示意图
二、程序设计
1)在linux环境下用vim编辑器建立工程程序文件key_led_test.c,该文件是测试工程的主文件,起命令如下:
mkdir key_led_test
vim key_led_test.c
通过GPIO口控制LED和检测按键信号的基本原理如下:
首先需要对使用的GPIO口进行导入,完成导入后的GPIO口才可以进读写,起导入GPIO口的函数机代码如下:
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口进行读写数据,其中读写的实现函数及代码如下:
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(fd<0)
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(fd<0)
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(fd<0)
return -1;
// Read the GPIO value
read(fd, &val, 1);
*value = atoi(&val);
close(fd); return 0;
}
最后,完成GPIO的读写操作后,需要导出GPIO口,起实现函数及代码如下:
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口的核心函数及实现过程,接着利用这些核心函数的调用和设计简单的逻辑就可以完成对连接410c板子上的按键进行检测同事控制LED等的状态,其中按键检测的实现函数如下:
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认为按键按下,不是干扰或者误按
return KEY_DOWN;
}
else return KEY_UP;
}
完成按键检测后,就可以根据按键来实现对LED的控制,其中LED的控制是通过输出高电平来点亮LED,输出低
DragonBoard 410c Linux 相关文章:
