18.1基于Linux的INPUT子系统实验(知识)_csdn
按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。
输入设备本质上还是字符设备,只是在此基础上套上了 input 框架,用户只需要负责上报输入事件,比如按键值、坐标等信息, input 核心层负责处理这些事件。
本章我们就来学习一下 Linux 内核中的 input 子系统。
1、input 子系统
1.1、input 子系统简介
1.2、input 驱动编写流程
在我看来,就是注册字符设备进行封装了。给了input子系统统一操作了。这就是核心层!
第 2498 行,注册一个 input 类,这样系统启动以后就会在/sys/class 目录下有一个 input 子目录,如图 38.1.2.1 所示:
第 2508~2509 行,注册一个字符设备,主设备号为 INPUT_MAJOR, INPUT_MAJOR 定义在 include/uapi/linux/major.h 文件中,定义如下:
1.2.1、注册 input_dev
1.编写申请注册子系统input设备:
2.编写注销子系统input设备:
申请好一个 input_dev 以后就需要初始化这个 input_dev,需要初始化的内容主要为事件类型(evbit)和事件值(keybit)这两种。 input_dev 初始化完成以后就需要向 Linux 内核注册 input_dev了,需要用到 input_register_device 函数,
此函数原型如下:
逻辑就是:
1、申请input_dev 结构体变量:
2、初始化input_dev:
需要初始化的内容主要为事件类型(evbit)和事件值(keybit)这两种(等等)
3、用到 input_register_device 函数:
初始化完成以后就需要向 Linux 内核注册 input_dev了。需要用到 input_register_device 函数。
4、注销一系列函数。
综上所述, input_dev 注册过程如下:
①、使用 input_allocate_device 函数申请一个 input_dev。
②、初始化 input_dev 的事件类型以及事件值。
③、使用 input_register_device 函数向 Linux 系统注册前面初始化好的 input_dev。
④、卸载input驱动的时候需要先使用input_unregister_device函数注销掉注册的input_dev,然后使用 input_free_device 函数释放掉前面申请的 input_dev。
input_dev 注册过程示例代码如下所示:
input_allocate_device()
函数返回的正是一个地址,更准确地说,它返回的是新分配的 struct input_dev
结构体实例在内存中的起始地址。
而struct input_dev *inputdev;
定义了个指针变量,其中inputdev就是用来存储地址的。
后面的inputdev->就是地址指向input_dev`类型中的结构。
1.2.2、上报输入事件
可以看出,第六行代码就是平常获取IO口的值,获取按键的键值,目前就是将驱动代码带过来的键值信息,通过input上传给内核,驱动层->核心层->事件层。
因为按键是低电平有效:
所以value所以等于0时,表示按键按下。
上报后还要提示内核上报结束!
1.2.3、input_event 结构体