diff --git a/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/Linux_Input_子系统详解.md b/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/Linux_Input_子系统详解.md new file mode 100644 index 0000000..d2288ed --- /dev/null +++ b/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/Linux_Input_子系统详解.md @@ -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); // 同步结束 +``` diff --git a/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/img/Linux_Input_子系统详解/001.png b/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/img/Linux_Input_子系统详解/001.png new file mode 100644 index 0000000..6e4fc1c Binary files /dev/null and b/Software/Development/OperatingSystem/Linux/Kernel/Modules/Input/img/Linux_Input_子系统详解/001.png differ