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
- linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)
- linux驱动由浅入深系列:输入子系统之一(input子系统概述、应用层读取event)
- linux驱动由浅入深系列:输入子系统之二(编写一个gpio_key驱动)
- LINUX设备驱动之输入子系统(三)
- LINUX设备驱动之输入子系统(三)
- LINUX设备驱动之输入子系统(三)
- linux驱动由浅入深系列:usb子系统之三(usb系统中的设备、配置、接口、端点概念及代码解释)
- Linux输入子系统(6):设备驱动层之LED驱动
- Linux输入子系统(6):设备驱动层之LED驱动
- linux驱动由浅入深系列:usb子系统之四(android平台鼠标驱动代码分析)
- linux驱动由浅入深系列:显示子系统之二(高通平台lcd驱动代码分析)
- linux驱动由浅入深系列:usb子系统之二(枚举过程)
- linux驱动之输入子系统
- linux驱动之--输入子系统
- Linux驱动之输入子系统
- linux驱动之输入子系统
- linux驱动子系统之输入子系统(1)
- linux驱动子系统之输入子系统(2)
- Android基础之WifiManager
- VGA原理
- 图像检索服务器编写问题记录——用单例模式确保log类、server类只返回一个实例
- 正则表达式常见实用大全(有你想要的)
- Lottie安卓开源动画库使用
- linux驱动由浅入深系列:输入子系统之三(应用层模拟input_event)
- linux里安装redis以及redis的安全设置
- 多出口IP指定
- 遇到Windows2003无法连接远程桌面问题怎么办? 按照以下步骤来一一排除问题吧!
- iosiOS开发多线程GCD
- java transient
- jQuery如何根据元素值删除数组元素
- 用PyInstaller将python转成可执行文件exe笔记
- Android屏幕分辨率,颜色、像素的使用(技巧)(必看)