Linux输入设备事件,如何检索初始状态

Linux输入设备事件,如何检索初始状态,第1张

概述我正在使用 gpio-keys设备驱动程序来处理运行Linux的嵌入式设备中的一些按钮.用户空间中的应用程序只需打开/ dev / input / eventX并在循环中读取输入事件. 我的问题是如何获得按钮的初始状态.有一个ioctl调用(EVIOCGKEY)可用于此,但是如果我首先检查这个然后开始从/ dev / input / eventX读取,则无法保证状态之间没有变化. 有什么建议? e 我正在使用 gpio-keys设备驱动程序来处理运行linux的嵌入式设备中的一些按钮.用户空间中的应用程序只需打开/ dev / input / eventX并在循环中读取输入事件.

我的问题是如何获得按钮的初始状态.有一个ioctl调用(EVIocgKEY)可用于此,但是如果我首先检查这个然后开始从/ dev / input / eventX读取,则无法保证状态之间没有变化.

有什么建议?

解决方法 evdev设备 queue events直到你读()它们,所以在大多数情况下打开设备,做ioctl()并立即开始从它读取事件应该工作.如果驱动程序从队列中删除了一些事件,那么它就是 sends you a SYN_DROPPED event,因此您可以检测到发生这种情况的情况. The libevdev documentation对如何处理这种情况有一些想法;我读它的方式你应该只是重试,即删除所有挂起的事件,并重做ioctl(),直到没有更多的SYN_DROPPED事件.

我使用此代码验证此方法是否有效:

#include <stdio.h>#include <fcntl.h>#include <sys/ioctl.h>#include <linux/input.h>#include <string.h>#define EVDEV "/dev/input/event9"int main(int argc,char **argv) {    unsigned char key_states[KEY_MAX/8 + 1];    struct input_event evt;    int fd;    memset(key_states,sizeof(key_states));    fd = open(EVDEV,O_RDWR);    ioctl(fd,EVIocgKEY(sizeof(key_states)),key_states);    // Create some inconsistency    printf("Type (lots) Now to make evdev drop events from the queue\n");    sleep(5);    printf("\n");    while(read(fd,&evt,sizeof(struct input_event)) > 0) {        if(evt.type == EV_SYN && evt.code == SYN_DROPPED) {            printf("Received SYN_DROPPED. Restart.\n");            fsync(fd);            ioctl(fd,key_states);        }        else if(evt.type == EV_KEY) {            // Ignore repetitions            if(evt.value > 1) continue;            key_states[evt.code / 8] ^= 1 << (evt.code % 8);            if((key_states[evt.code / 8] >> (evt.code % 8)) & 1 != evt.value) {                printf("Inconsistency detected: Keycode %d is reported as %d,but %d is stored\n",evt.code,evt.value,(key_states[evt.code / 8] >> (evt.code % 8)) & 1);            }        }    }}

启动后,程序会故意等待5秒钟.在那段时间点击一些键来填充缓冲区.在我的系统上,我需要输入大约70个字符来触发SYN_DROPPED. EV_KEY处理代码检查事件是否与EVIocgKEY ioctl报告的状态一致.

总结

以上是内存溢出为你收集整理的Linux输入设备事件,如何检索初始状态全部内容,希望文章能够帮你解决Linux输入设备事件,如何检索初始状态所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1026657.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存