linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)

来源:互联网 发布:c语言的就业前景 编辑:程序博客网 时间:2024/05/16 01:14

本系列导航:

linux驱动由浅入深系列:输入子系统之一(input子系统概述、应用层读取event)

linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)

linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)


在上一篇文章中编写了gpio_key的驱动,可以看到每次gpio_key按下会上报event到/dev/input /event7节点。其实在应用层是可以完全模拟出这个按键过程的,原理是向EV_KEY类型的eventX消息节点write event将会被重新返回到eventX节点上,产生与按键按下相同的效果。(另外EV_LED、EV_SND类型的event通道驱动层会有对应的消息处理函数去点亮led,驱动蜂鸣器等)。下面是应用层通过对event7节点的写操作模拟按键的程序。

#include <string.h>#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <linux/input.h>#include <linux/uinput.h>#include <stdio.h>#include <sys/time.h>#include <sys/types.h>#include <unistd.h>void simulate_key(int fd,int kval){    struct input_event event;    event.type = EV_KEY;    event.value = 1;    event.code = kval;    gettimeofday(&event.time,0);    write(fd,&event,sizeof(event)) ;event.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;write(fd, &event, sizeof(event));memset(&event, 0, sizeof(event));gettimeofday(&event.time, NULL);event.type = EV_KEY;event.code = kval;event.value = 0;write(fd, &event, sizeof(event));event.type = EV_SYN;event.code = SYN_REPORT;event.value = 0;write(fd, &event, sizeof(event));}void main(){    int fd_kbd;     fd_kbd = open("/dev/input/event7",O_RDWR);    if(fd_kbd<=0){        printf("error open keyboard:/n");        return -1;    }printf("send simulate event!\n");    simulate_key(fd_kbd, 0x73);    close(fd_kbd);}

程序比较简单,打开event7节点后,组织event结构体的数据,最后通过write函数写入event7节点。

结果:


使用busyboxhexdump /dev/input /event7 命令查看该节点中的二进制消息,当执行上述程序后如下图(相关解析参照“linux驱动由浅入深系列:输入输出子系统之一”)



1 0
原创粉丝点击