概述
输入子系统:主要为输入设备弄的一套框架,比如键盘、鼠标、触摸屏等,这些设备有数据后就上报给子系统,然后子系统再根据类型再做出处理,然后再发送到应用层。
使用input子系统的流程:
1、定义一个 struct input_dev *idev; 结构体
2、实现代码流程,在input子系统中不需要注册 file_operations结构体(也就是不需要编写 read 、write那些函数),这些都会在input子系统中自动完成
static void inputdev_timer_function(unsigned long arg)
{
struct input_key_dev *dev = (struct input_key_dev *)arg;
static int status = 0;
if(status == 0){
/* 向 input子系统上报数据 */
input_report_key(inputdev.idev,KEY_0,1);
input_sync(inputdev.idev); /* 每次上报完数据后都要一个同步信号 */
}
if(status == 1){
/* 向 input子系统上报数 */
input_report_key(inputdev.idev,KEY_0,0);
input_sync(inputdev.idev);
}
status = !status;
mod_timer(&inputdev.timer,jiffies + msecs_to_jiffies(5000));
}
static int __init inputdev_init(void)
{
int ret = 0;
init_timer(&inputdev.timer);
inputdev.timer.function = inputdev_timer_function;
inputdev.idev = input_allocate_device(); /* 分配内存 */
inputdev.idev->name = "key0_input";
/* 设置事件和事件号的方法有三种 这是其中的一种 */
__set_bit(EV_KEY, inputdev.idev->evbit); /* 设置产生按键事件 */
__set_bit(EV_REP, inputdev.idev->evbit); /* 重复事件,比如按下去不放开,就会一直输出信息 */
/* 初始化input_dev,设置产生哪些按键 */
__set_bit(KEY_0, inputdev.idev->keybit);
/* 注册输入设备 */
ret = input_register_device(inputdev.idev);
if (ret) {
printk("register input device failed!rn");
goto err_free_input_dev;
//return ret;
}
mod_timer(&inputdev.timer,jiffies + msecs_to_jiffies(5000)); /* 以5秒的方式上报数据 */
return 0;
}
static void __exit inputdev_exit(void)
{
del_timer_sync(&inputdev.timer); /* 删除定时器 */
/* 释放input_dev */
input_unregister_device(inputdev.idev);
input_free_device(inputdev.idev);
}
3、insmod 加载 input 设备后,会在 /dev/input/下生成 event设备(带编号),应用层就可以open对应的设备文件了。
4、测试驱动能不能工作:用 hexdump 命令
测试后的数据是以小端模式显示出来
5、应用层测试代码
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
/*
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};
*/
int main(int argc, char **argv)
{
int fd;
char *file;
int len = 0;
file = argv[1];
struct input_event event;
fd = open(file,O_RDWR);
if(fd < 0){
perror("open error:");
}
while(1){
len = read(fd,&event,sizeof(struct input_event));
if(len < 0){
perror("read error:");
continue;
}
switch(event.type){
case EV_KEY:
if(event.code == KEY_0){
printf("key value %d %sn", event.value, event.value ? "pressed" : "released");
}
break;
case EV_SYN:
printf("synn");
break;
default:
printf("unknown eventn");
}
}
close(fd);
return 0;
}
最后
以上就是含糊小伙为你收集整理的Linux input 输入子系统的全部内容,希望文章能够帮你解决Linux input 输入子系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复