Linux内核驱动基础(8)gpio用户空间另一使用案例
来源:互联网 发布:行测怎么提高常识 知乎 编辑:程序博客网 时间:2024/06/06 07:24
一 概述
嵌入式设备中间,单个按键的使用都依赖于gpio的支持,在用户空间使用gpio对于编程测试都较为方便,下面介绍另外一种用户空间gpio使用
二 具体使用
长按某个按键导致某个功能的触发,短按则不会有任何效果。比如手机关机或者开机都依赖于长按某个按键实现
下面看看详细代码
intgpio_fd;
int ret;
unsignedchar value;
structpollfd fds[1];
system("echofalling > /sys/class/gpio/gpio22/edge");
//定义该gpio的中断触发方式
gpio_fd =open("/sys/class/gpio/gpio22/value",O_RDONLY);
if( gpio_fd== -1 )
err_print("open");
fds[0].fd = gpio_fd;
fds[0].events= POLLPRI;
ret = lseek(gpio_fd,0,SEEK_SET);
if( ret ==-1 )
err_print("lseek");
ret =read(gpio_fd,&value,1);
if (ret ==-1 )
err_print("read");
while (1) {
ret = poll(fds,1,-1);
if (ret == -1 )
err_print("poll");
if ( fds[0].revents & POLLPRI ){
sleep(2);
ret = lseek(gpio_fd,0,SEEK_SET);
if( ret == -1 )
err_print("lseek");
ret= read(gpio_fd,&value,1);
if( ret == -1 )
err_print("read");
if ( value == '0')
return 1;
}
}
1 上述代码在调用poll之前使用read和lseek主要是将gpio上面的数据清空,防止干扰正常的数据触发
2 每次poll函数返回都表示gpio状态发生了改变,此时记住必须调用lseek函数,这样才能使得稍后的read函数能够读取到正确的值
3 由于需要检测按键长按的效果,所以采取了延时处理(记住必须延时后进行lseek()和read()调用),延时2秒后发现按键依然处于按下状态(read读出的数据位’0’)说明为长按按键,此时函数返回进入gpio长按需要继续进行的处理。
4 poll返回后可以重复读写gpio,但是必须依次调用lseek()和read()
转载,请注明 匠牛社区AM5728开发板
- Linux内核驱动基础(8)gpio用户空间另一使用案例
- Linux内核驱动基础(9)gpio的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统-GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- Linux内核驱动之GPIO子系统(一)GPIO的使用
- 使用ruby的gem安装gem包的SSL证书错误
- Unable to locate package错误解决
- hdu_2838_Cow Sorting(树状数组求逆序对)
- IOS编码规范
- android使用NFC的读模式
- Linux内核驱动基础(8)gpio用户空间另一使用案例
- 浅析STM32的hex文件
- 关于runlevel后的显示3或者5
- Android BottomSheet:List列表或Grid网格展示(3)
- 冒险岛
- Gtest在vs 2010上的配置
- setResult和onActivityResult的用法小记
- 广播 (Broadcast)
- VVDocumenter安装不成功的解决办法