没有合适的资源?快使用搜索试试~ 我知道了~
input输入子系统 - 涛少& - 博客园1
需积分: 0 0 下载量 35 浏览量
2022-08-04
16:08:21
上传
评论
收藏 1.07MB PDF 举报
温馨提示
试读
15页
2. 触摸屏 3. C++标 2. C++标 3. 三路快
资源详情
资源评论
资源推荐
2018/3/31 input输入子系统 - 涛少& - 博客园
https://www.cnblogs.com/deng-tao/p/6094049.html 1/15
涛少&
昵称:涛少&
园龄:1年11
个月
粉丝:12
关注:0
+加关注
搜索
找找看
谷歌搜索
常用链接
我的随笔
我的评论
我的参与
最新评论
我的标签
随笔分类
ARM裸机
(13)
C(8)
C++(8)
GNU-ARM
汇编
Linux驱动
(24)
Linux应用
编程(5)
Makefile
Qt基础
Shell脚本
语言
uboot
根文件系统
(1)
嵌入式
Linux(3)
算法与数据
结构(7)
随笔档案
2017年3月
(5)
2017年2月
(9)
2016年12
月 (10)
2016年11
月 (18)
2016年10
月 (27)
2016年5月
(1)
2016年4月
(2)
文章分类
根文件系统
相册
SPI总线(5)
最新评论
1. Re:Linu
x驱动学习
博客园 | 首页 | 新随笔 | 联系 | 订阅 | 管理
INPUT输入子系统
一、什么是input输入子系统?
1、Linux系统支持的输入设备繁多,例如键盘、鼠标、触摸屏、手柄或者是一些输入设备像体感输入等等,
Linux系统是如何管理如此之多的不同类型、不同原理、不同的输入信息的
输入设备的呢?其实就是 通过input输入子系统这套软件体系来完 成的。从整体上来说,input输入子系统 分为
3层:上层(输入事件驱动层)、中层(输入核心层)、
下层(输入设备驱动层),如下图所示:
联系之前学过的驱动框架 做对比,input输入子系统其实就是input输 入设备的驱动框架,与之前的学过的 驱动
框架不同的是,input输入子系统分为3层:上、中、下,所以他的复杂度
要高于之前讲的lcd、misc、fb等的驱动框架。
2、图中Drivers对应的就是下层设备驱动层,对应各种各样不同的输入 设备,Input Core对应的 就是中层核
心层,Handlers对应的就是上层输入事件驱动层,最右边的代表的是用户空间。
(1)从图中可以看出,系统中可以注册多个输入设 备,每个输入设备的可以 是不同的,例如一台电脑上可以带
有鼠标,键盘....。
(2)上层中的各个handler(Keyboard/Mouse/Joystick/Event)是属 于平行关系,他们 都是属于上层。不
同的handler下对应的输入设备在应用层中的接口命名方式不一样,例如
Mouse下的输入设备在应用层的接口是 /dev/input/mousen (n代表0、1、2...),Joystick下的输入设备
在应用层的接口是 /dev/input/jsn(n代表0、1、2...),
Event下 的输入设备在应用层的接口是 /dev/input/eventn(n代表0、1、2...),这个是在input输入子系
统中实现的,下面会分析其中的原由。
(3)输入核心层其实是负责协调上层和下层,使得 上层和下层之间能够完成 数据传递。当下层发生输入事件的
时候,整个系统就被激活了,事件就会通过核心层传递到上层对应的一个/多个
handler中,最终会传递到应用空间。
3、输入子系统解决了什么问题?
2018/3/31 input输入子系统 - 涛少& - 博客园
https://www.cnblogs.com/deng-tao/p/6094049.html 2/15
之什么是驱
动?
对于目前市
场来说更多
的是嵌入式
高端人才,
低端人才的
趋于饱和,
工资肯定会
降,所以提
高自身知识
是关键,如
果你有C基
础和嵌入式
的入门知
识,推荐去
华清星创客
高端班深造
再出来,工
资肯定会高
很多。ww
w.sup
e......
--不知不觉
1
2. Re:SPI
通信协议
(SPI总
线)学习
楼主,总结
的不错,学
习了!我也
锦上添花分
享一个《驱
动第一课》
--HQ-星创
客
3. Re:SPI
通信协议
(SPI总
线)学习
谢谢楼主终
于看懂了
--Slience
AndJava
4. Re:inpu
t输入子系
统
那好可惜,
找了好多,
你的输入子
系统写的最
棒!
--竹林海宝
5. Re:inpu
t输入子系
统
@竹林海宝
现在工作有
点忙,暂时
不会更新
了...
--涛少&
阅读排行榜
1. SPI通信
协议(SPI
总线)学习
(29572)
2. 触摸屏
基本原理介
绍(6691)
3. C++标
准模板库
(STL)和
容器(467
0)
4. Linux设
备驱动模型
之platform
(平台)总线
详解(392
7)
5. arm交
叉编译器gn
(1)在GUI界面中,用户的自由度太大了,可以做的事情太多了,可以响应不同的输入类设备,而且还能够对
不同的输入类设备的输入做出不同的动作。例如window中的一个软
件既可以响应鼠标输入事件,也可以相应键盘输入事件,而且这些事件都是预先不知道的。
(2)input子系统解决了不同的输 入类设备的输入事件与应用层之间的 数据传输,使得应用层能够获取到各 种不
同的输入设备的输入事件,input输入子系统能够囊括所有的不同种
类的输入设备,在应用层都能够感知到所有发生的输入事件。
4、input输入子系统如何工作?
例如以一次鼠标按下事件为例子来说明我们的input输入子系统的工作过程:
当我们按下鼠 标左键的时候就会触发中断(中断是早就注册好的),就会去执行中断所绑定的处理函数,在函
数中就会去读取硬件寄存器来判断按下的是哪个按键和状态 ---->
将按键信息上报给input core层 ---> input core层处理好了之后就会上报给input event层,在这里会将我
们的输入事件封装成一个input_event结构体放入一个缓冲区中 --->
应用层read就会将缓冲区中的数据读取出去。
5、相关的数据结构
1 struct input_dev {
2 const char *name; // input设备的名字
3 const char *phys; //
4 const char *uniq; //
5 struct input_id id; //
6
7 // 这些是用来表示该input设备能够上报的事件类型有哪些 是用位的方式来表示的
8 unsigned long evbit[BITS_TO_LONGS(EV_CNT)];
9 unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];
10 unsigned long relbit[BITS_TO_LONGS(REL_CNT)];
11 unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];
12 unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];
13 unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];
14 unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];
15 unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];
16 unsigned long swbit[BITS_TO_LONGS(SW_CNT)];
17
18 unsigned int keycodemax;
19 unsigned int keycodesize;
20 void *keycode;
21 int (*setkeycode)(struct input_dev *dev,
22 unsigned int scancode, unsigned int keycode);
23 int (*getkeycode)(struct input_dev *dev,
24 unsigned int scancode, unsigned int *keycode);
25
26 struct ff_device *ff;
27
28 unsigned int repeat_key;
29 struct timer_list timer;
30
31 int sync;
32
33 int abs[ABS_CNT];
34 int rep[REP_MAX + 1];
35
36 unsigned long key[BITS_TO_LONGS(KEY_CNT)];
37 unsigned long led[BITS_TO_LONGS(LED_CNT)];
38 unsigned long snd[BITS_TO_LONGS(SND_CNT)];
39 unsigned long sw[BITS_TO_LONGS(SW_CNT)];
40
41 int absmax[ABS_CNT];
42 int absmin[ABS_CNT];
43 int absfuzz[ABS_CNT];
44 int absflat[ABS_CNT];
45 int absres[ABS_CNT];
46
47 int (*open)(struct input_dev *dev); // 设备的open函数
48 void (*close)(struct input_dev *dev);
49 int (*flush)(struct input_dev *dev, struct file *file);
50 int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value); // 上报事件
51
52 struct input_handle *grab;
53
54 spinlock_t event_lock;
2018/3/31 input输入子系统 - 涛少& - 博客园
https://www.cnblogs.com/deng-tao/p/6094049.html 3/15
ueabi、no
ne-eabi、
arm-eab
i、gnueabi
hf等的区别
(2388)
评论排行榜
1. input输
入子系统
(5)
2. SPI通信
协议(SPI
总线)学习
(2)
3. .hex文
件和.bin文
件的区别
(2)
4. Linux驱
动学习之什
么是驱动?
(1)
推荐排行榜
1. Linux设
备驱动模型
之platform
(平台)总线
详解(1)
2. C++标
准模板库
(STL)和
容器(1)
3. 三路快
速排序算法
(1)
Powered by 博客
园
55 struct mutex mutex;
56
57 unsigned int users;
58 bool going_away;
59
60 struct device dev; // 内置的device结构体变量
61
62 struct list_head h_list; // 用来挂接input_dev 设备连接的所有handle 的一个链表头
63 struct list_head node; // 作为链表节点挂接到 input_dev_list 链表上 (input_dev_list链表是input核心层维护的一个用来挂
接所有input设备的一个链表头)
64 };
1 struct input_handler {
2
3 void *private; // 私有数据
4
5 void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value); // handler用于向上层上
报输入事件的函数
6 bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
7 bool (*match)(struct input_handler *handler, struct input_dev *dev); // match 函数用来匹配handler 与
input_dev 设备
8 int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id); // 当
handler 与 input_dev 匹配成功之后用来连接
9 void (*disconnect)(struct input_handle *handle); // 断开handler 与 input_dev 之间的连接
10 void (*start)(struct input_handle *handle);
11
12 const struct file_operations *fops; // 一个file_operations 指针
13 int minor; // 该handler 的编号 (在input_table 数组中用来计算数组下标) input_table数
组就是input子系统用来管理注册的handler的一个数据结构
14 const char *name; // handler的名字
15
16 const struct input_device_id *id_table; // 指向一个 input_device_id 类型的数组,用来进行与input设备匹配时用到的信息
17
18 struct list_head h_list; // 用来挂接handler 上连接的所有handle 的一个链表头
19 struct list_head node; // 作为一个链表节点挂接到 input_handler_list 链表上(input_handler_list 链表是一个由上层
handler参维护的一个用来挂接所有注册的handler的链表头)
20 };
1 struct input_handle {
2
3 void *private; // handle 的私有数据
4
5 int open; // 这个也是用来做打开计数的
6 const char *name; // 该handle 的名字
7
8 struct input_dev *dev; // 用来指向该handle 绑定的input_dev 结构体
9 struct input_handler *handler; // 用来指向该handle 绑定的 handler 结构体
10
11 struct list_head d_node; // 作为一个链表节点挂接到与他绑定的input_dev ->hlist 链表上
12 struct list_head h_node; // 作为一个链表节点挂接到与他绑定的handler->hlist 链表上
13 };
1 struct input_device_id {
2
3 kernel_ulong_t flags; // 这个flag 表示我们的这个 input_device_id 是用来匹配下面的4个情况的哪一项
4 // flag == 1表示匹配总线 2表示匹配供应商 4表示匹配产品 8表示匹配版本
5 __u16 bustype;
6 __u16 vendor;
7 __u16 product;
8 __u16 version;
9
10 kernel_ulong_t evbit[INPUT_DEVICE_ID_EV_MAX / BITS_PER_LONG + 1];
11 kernel_ulong_t keybit[INPUT_DEVICE_ID_KEY_MAX / BITS_PER_LONG + 1];
12 kernel_ulong_t relbit[INPUT_DEVICE_ID_REL_MAX / BITS_PER_LONG + 1];
13 kernel_ulong_t absbit[INPUT_DEVICE_ID_ABS_MAX / BITS_PER_LONG + 1];
14 kernel_ulong_t mscbit[INPUT_DEVICE_ID_MSC_MAX / BITS_PER_LONG + 1];
15 kernel_ulong_t ledbit[INPUT_DEVICE_ID_LED_MAX / BITS_PER_LONG + 1];
16 kernel_ulong_t sndbit[INPUT_DEVICE_ID_SND_MAX / BITS_PER_LONG + 1];
17 kernel_ulong_t ffbit[INPUT_DEVICE_ID_FF_MAX / BITS_PER_LONG + 1];
18 kernel_ulong_t swbit[INPUT_DEVICE_ID_SW_MAX / BITS_PER_LONG + 1];
剩余14页未读,继续阅读
卡哥Carlos
- 粉丝: 27
- 资源: 300
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0