增加 Linux Input 子系统详解.

Signed-off-by: rick.chan <chenyang@autoai.com>
This commit is contained in:
rick.chan 2020-10-13 13:30:16 +08:00
parent e16082796f
commit 2d612ee39f
2 changed files with 47 additions and 0 deletions

View File

@ -0,0 +1,47 @@
# Linux Input 子系统详解
## 1.Input 子系统框架
Input 子系统由驱动层、Input Core、Input Event 三部分组成。一个输入事件,如鼠标移动通过 Driver->Input core->Event handler->user space 的顺序到达用户控件的应用程序。
![Input 子系统框架](./img/Linux_Input_子系统详解/001.png)
* 驱动层将底层的硬件输入转化为统一事件形式向输入核心Input Core汇报
* Input Core承上启下, 为驱动层 提供输入设备注册与操作接口input_register_device 通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息。
* Input Event主要是和用户空间交互。Linux 中在用户空间将所有的设备都当初文件来处理,由于在一般的驱动程序中都有提供 fops 接口,以及在 /dev 下会生成相应的设备文件 nod这些操作在输入子系统中由事件处理层完成
实现设备驱动核心工作是向系统报告按键等输入事件event通过 input_event 结构描述),不再需要关心文件操作接口(如何理解)。驱动报告事件经过 inputCore 和 Eventhandler 到达用户空间。
## 2.驱动相关的函数
### 2.1.设备注册和初始化
* input_allocate_device分配一块input_dev结构体类型大小的内存
* input_set_capability设置输入设备可以上报哪些输入事件
* input_register_device向 Input Core 层注册设备
* input_unregister_device注销输入设备函数
* input_register_handle注册一个 handle
* set_bit()告诉input输入子系统支持哪些事件哪些按键。例如set_bit(EV_KEY,button_dev.evbit)其中button_dev是 struct input_dev类型
### 2.3.报告事件
用于报告EV_KEY,EV_REL,EV_ABS事件的函数分别为:
void input_report_key (struct input_dev *dev, unsigned int code, int value)
void input_report_rel (struct input_dev *dev, unsigned int code, int value)
void input_report_abs (struct input_dev *dev, unsigned int code, int value)
### 2.4.报告结束
input_sync() 同步用于告诉 input core 子系统报告结束。
### 2.5.一次完整个报告过程
```cpp
input_reprot_abs(input_dev,ABS_X,x); // x 坐标
input_reprot_abs(input_dev,ABS_Y,y); // y 坐标
input_reprot_abs(input_dev,ABS_PRESSURE,1);
input_sync(input_dev); // 同步结束
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 477 KiB