linux输入子系统(6)--- evdev_handler的实现
来源:互联网 发布:php array 遍历 编辑:程序博客网 时间:2024/06/07 03:29
2.3 evdev_handler 的实现
Linux 输入子系统已经建立好了几个 handler ,用来处理几类常见的事件,如鼠标、键盘、摇杆等。其中最为基础的是 evdev_handler,它是在 driver/input/evdev.c 中实现的。它能够接收任意类型的事件,任意id 的设备都可以和它匹配连接,它对应的设备节点为 /dev/eventX ,次设备号的范围为 64 ~95 。
2.3.1 初始化和 input_device_id
如 程序清单 2 .6 所示。
程序清单2. 6 evdev_handler
/* driver/input/evdev.c */
static const struct input_device_id evdev_ids[] = {
{ .driver_info = 1 }, /* Matches all devices */
{ }, /* Terminating zero entry */
};
MODULE_DEVICE_TABLE(input, evdev_ids);
static struct input_handler evdev_handler = {
.event = evdev_event,
.connect = evdev_connect,
.disconnect = evdev_disconnect,
.fops = &evdev_fops,
.minor = EVDEV_MINOR_BASE,
.name = "evdev",
.id_table = evdev_ids,
};
static int __init evdev_init(void)
{
return input_register_handler(&evdev_handler);
}
static void __exit evdev_exit(void)
{
input_unregister_handler(&evdev_handler);
}
module_init(evdev_init);
module_exit(evdev_exit);
初始化的过程非常简单,就是将 evdev_handler 进行注册,注册的过程已经在 2.2 小节讲过了。
evdev_handler 只初始化了 id_table , 根据 程序清单1 .11 第 ⑴ 步的分析,我们可以知道这样的 input_device_id 可以和任意的设备 id 相匹配。
由 2.2 小节我们知道次设备号的最高3 比特用来对每个 handler在 input_table 中寻址,那么每个 handler 拥有的次设备号数就是最低 5 比特对应的个数,共32 个。所以 evdev_handler最多能够支持 32 个输入设备与之建立连接。
2.3.2 建立连接
evdev_handler 建立连接的函数原型如下:
static int evdev_connect(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
它的主要任务是申请一个 input_handle 结构体将handler 和 dev 连接起来。同时建立连接的设备占用一个次设备号,这个次设备号是64 ~ 95 中空闲的最小值,如果没有空闲的次设备号可用则连接失败。
2.3.3 打开设备节点
由于每个与 evdev_handler 建立连接的设备都占用了设备号,所以可以建立对应他们的设备节点。每次打开设备节点,都建立一个fifo 环形消息缓冲区,能够存储 64 个消息。
2.3.4 用户空间读写消息
用户空间可以往 evdev_handler 连接的设备节点上写入消息,写入数据的格式如程序清单 1 .2 ,写入的长度是数据的字节数。缓冲区写满之后从头开始写,直接覆盖之前的消息并且不会通知用户程序。由于写入消息是通过input core 分发的,所以写入的无效消息根本不会进入消息缓冲区。
另外需要注意,虽然每个打开节点的线程都有一个消息缓冲区,写入的消息却会传给打开同一节点的每一个线程。同时也会传给同一个input_dev 对应的其它设备节点。
读取消息则只从自己的消息缓冲区中读取。读取的消息格式也是如 程序清单1 .2 中的 input_event 一样。每个消息只能被读一次。
2.3.5 事件处理
evdev_handler 从 input core 接收到一个事件之后会将它发送给独占设备的线程 ( 如果有 ) 或者所有打开设备的线程。事件分发之前会先打包成 input_event 的格式,并加上时间戳。
2.3.6 同步消息
每个 input_dev 都默认支持同步事件(EV_SYN )。但是 evdev_handler并不使用用同步事件,只是将它作为一个一般的事件写入缓冲区。由于每次的写入都是及时的,所以也不需要同步。
2.3.7 evdev_handler 适用范围
evdev_handler 仅仅将消息打包成 input_event 的格式,此外不做任何处理。所有设备发送的事件报告都能为用户空间所见。需要直接使用设备原始事件的程序可以读取eventX ,对于鼠标类或者更复杂的设备, evdev_handler 并不合适。
- linux输入子系统(6)---evdev_handler的实现
- linux输入子系统(6)--- evdev_handler的实现
- linux输入子系统(6)--- evdev_handler的实现
- linux输入子系统(7)--mouse_handler的实现
- linux输入子系统(7)--mouse_handler的实现
- linux输入子系统(7)--mouse_handler的实现
- linux 2.6 输入子系统 键盘驱动的实现
- linux 2.6 输入子系统之键盘驱动的实现
- linux的input输入子系统
- 基于Tiny4412的Linux按键输入子系统驱动的实现(一)
- 基于Tiny4412的Linux按键输入子系统驱动的实现(二)
- linux输入子系统(1)
- linux输入子系统(2)
- linux输入子系统(3)
- linux输入子系统(4)
- linux输入子系统(5)
- linux输入子系统(1)
- linux输入子系统(2)
- Win7上vmare 6打开winxp拷贝过来的镜像 无图形界面
- thrift安装
- 腾讯移动游戏掀起狂欢 合作游戏或将陆续上线
- android开发学习笔记——稍复杂控件 RadioGroup,CheckBox,Toast
- 字符,字节和编码
- linux输入子系统(6)--- evdev_handler的实现
- java 关键字
- gdb调试
- 手动wifi连接
- cgroup--内存 限制内存测试
- printf in KEIL C51
- excel vba调用windows API快速查找文件
- IOS开发中单例模式使用详解
- COUNT(*)与COUNT(列名)的区别