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开发板


0 0