linux设备驱动 按键几种写法总结

摘要:
对于基础按键的驱动,有如下几种写法:查询所谓查询方法,主要描述应用程序会在while里面一直read,如果没有数据会导致阻塞,占用CPU;这种方法是最差的。应用程序和查询法没有什么区别,但是驱动里面的read函数会调用wait_event_interruptible,直到按键产生中断并在中断里面唤醒,此时read会把数据返回给用户程序。异步通知指驱动程序主动通知应用程序。

对于基础按键的驱动,有如下几种写法:

(1)查询

所谓查询方法,主要描述应用程序会在while(1)里面一直read,如果没有数据会导致阻塞,占用CPU;这种方法是最差的。

(2)中断

中断配合休眠会避免查询法占用CPU的缺点。

应用程序和查询法没有什么区别, 但是驱动里面的read函数会调用wait_event_interruptible, 直到按键产生中断并在中断里面唤醒,此时read会把数据返回给用户程序。

(3)poll

poll机制和上面中断方式差不多, 在应用程序里面基本结构是:

while(1)
    {

        ret = poll(fds, 1, 5000);
        if(ret == 0)
        {
            printf("time out .
");
        }
        else{
            read(fd, &key_vals, 1);
            ...
        }        
    }

应用程序调用poll, 对于驱动程序里面的file_operations->poll,file_operations->poll里面首先调用poll_wait, 而poll_wait不会立即导致休眠。

驱动程序相对于中断方式来说,file_operations需要实现poll函数,如下:

static unsigned int buttons_poll (struct file *file, struct poll_table_struct *wait)
{
    unsigned int mask = 0;
    poll_wait(file, &buttons_waitq, wait); //不会立即休眠

    if(press_event)
        mask |= POLLIN |POLLRDNORM;

    returnmask;
}

(4)异步通知

上面三种对于应用程序来说,本质上都是查询,因为都在while(1)里面实现read按键值。异步通知指驱动程序主动通知应用程序。

应用程序里面:

signal(SIGIO, my_signal_handler);

void my_signal_handler(intsigid)
{
    ...
}

fcntl(fd, F_SETOWN, getpid());
Oflags = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, Oflags | FASYNC);

对应驱动程序里面需要实现file_operation->fasync

static int buttons_fasync (int fd, struct file *filp, inton)
{
    return fasync_helper (fd, filp, on, &buttons_async);        // 注册
}

相关中断里面发送信号

kill_fasync (&buttons_async, SIGIO, POLL_IN);

(5)input子系统

免责声明:文章转载自《linux设备驱动 按键几种写法总结》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Synchronization N层 使用WebService同步SQLCompact【转】 SpringCloud系列——Feign 服务调用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

linux负载均衡软件LVS-使用LVS+keepalived

5.安装配置keepalived Keepalived 是运行在 lvs 之上,它的主要功能是实现真实机的故障隔离及负载均衡器间的失败切换 FailOver.lvs 结合 keepalived,就实现了 3 层、4 层、5/7 层交换的功能。下面进行LVS第二种用法,LVS+keepalived。其中ipvsadm的安装及验证同本文第4.2章节(这种方式不...

linux中查看nginx、apache、php、mysql配置文件路径

linux高效、稳定,但是也带来维护上的一些问题。配置文件究竟在哪里?????       如何在linux中查看nginx、apache、php、mysql配置文件路径了,如果你接收一个别人配置过的环境,但没留下相关文档。这时该怎么判断找到正确的加载文件路径了。可以通过以下来判断1、判断apache 首先执行命令找到httpd路径 ps aux | gr...

Linux命令之sftp 安全文件传输命令行工具

用途说明 sftp命令可以通过ssh来上传和下载文件,是常用的文件传输工具,它的使用方式与ftp类似,但它使用ssh作为底层传输协议,所以安全性比ftp要好得多。 常用方式 格式:sftp <host> 通过sftp连接<host>,端口为默认的22,用户为Linux当前登录用户。 格式:sftp -oPort=<port&g...

主流服务器虚拟化技术简单使用——KVM(二)

通过Linux工具管理KVM 主流服务器虚拟化技术简单使用——KVM(一)部署了一台KVM主机,提到KVM可以通过命令行工具(virt-install、virsh)和GUI工具(virt-manager)管理虚拟机。实际上virt-install、virsh、virt-manager只是管理工具,如果部署多台KVM,并不需要每一台都安装这些管理工具,因为它...

linux下为目录和文件设置权限

Linux下为目录和文件设置权限,包括子目录的循环递归设置 chmod 命令可以改变所有子目录的权限,下面有2种方法 改变一个文件的权限: chmod mode file|dir 改变所有子目录的权限: chmod mode dir -R 注意后面加了个-R参数 参数就是权限模式 mode = 777 or 752 ,666,,, mode 的三...

Linux下Wi-Fi的实现:wireless_tools和wpa_supplicant

转载于:https://www.cnblogs.com/lidabo/p/6069455.html 平台为hi35XX,在Liunx下借助wireless_tools和wpa_supplicant(因为现在的无线WIFI网络大多是wpa加密。所以需要移植wpa_supplicant工具)等工具实现wifi的过程。 一、移植wireless_tools 1....