本系列导航:
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驱动由浅入深系列:输入输出子系统之一”)