IMX6ULL 移植
1 INPUT 子系统
INPUT 子系统的核心代码在 drivers/input/input.c 文件当中。
我们要使用 INPUT 子系统,只需要注册一个 input 设备即可。
input_dev 结构体表示 input 设备。
1 | // https://elixir.bootlin.com/linux/v7.1-rc7/source/include/linux/input.h#L45 |
其中 evbit 表示输入事件的类型。
1 | // https://elixir.bootlin.com/linux/v7.1-rc7/source/include/uapi/linux/input-event-codes.h#L52 |
本章需要使用按键,因此需要注册 EV_KEY。
另外由于需要使用按键事件,我们也要使用到 keybit。
https://elixir.bootlin.com/linux/v7.1-rc7/source/include/uapi/linux/input-event-codes.h#L76
1.1 INPUT 子系统的 API
input_allocate_device:
函数原型如下:
struct input_dev *input_allocate_device(void);
函数参数和返回值含义如下:
- 参数:无。
- 返回值:申请到的 input_dev 指针;如果申请失败则返回 NULL。
该函数用于申请一个 input_dev 结构体,后续需要对该结构体进行初始化。
input_free_device:
如果不再使用前面申请到的 input_dev,就需要调用 input_free_device 将其释放。函数原型如下:
void input_free_device(struct input_dev *dev);
函数参数和返回值含义如下:
- dev:需要释放的 input_dev。
- 返回值:无。
该函数一般用于申请成功后但尚未注册时,因后续初始化失败而进行资源释放。
input_register_device:
申请好一个 input_dev 以后,需要对其进行初始化。
初始化的内容通常包括事件类型 evbit 和事件值 keybit 等。
当 input_dev 初始化完成以后,就需要向 Linux 内核注册该 input 设备,此时需要用到 input_register_device 函数。其原型如下:
int input_register_device(struct input_dev *dev);
函数参数和返回值含义如下:
- dev:要注册的 input_dev。
- 返回值:
- 0:input_dev 注册成功。
- 负值:input_dev 注册失败。
input_unregister_device:
当驱动卸载时,需要将前面注册到内核中的 input_dev 注销掉,此时需要使用 input_unregister_device 函数。其原型如下:
void input_unregister_device(struct input_dev *dev);
函数参数和返回值含义如下:
- dev:要注销的 input_dev。
- 返回值:无。
1.1.1 使用流程总结
Linux input 设备的一般使用流程如下:
- 调用 input_allocate_device() 申请一个 input_dev。
- 初始化 input_dev 的相关成员变量,例如:
- 设备名称
- 事件类型 evbit
- 按键值 keybit
- 调用 input_register_device() 将设备注册到内核。
- 当驱动卸载时:
- 如果设备已经注册,则调用 input_unregister_device() 注销设备。
- 如果设备尚未注册但已经申请,则调用 input_free_device() 释放设备。
1.1.2 说明
需要注意的是:
- input_allocate_device() 与 input_free_device() 通常配套使用。
- input_register_device() 与 input_unregister_device() 通常配套使用。
- 如果 input_dev 已经成功注册,一般使用 input_unregister_device() 即可,不需要再单独调用 input_free_device()。
2 实例
开发板上的原理图。

首先修改设备树,承接上篇 LED 驱动。
1 | /* |
按键的相关驱动。把 KEY0 作为 EV_KEY/KEY_0 上报,GPIO 低电平表示按下,使用中断加 10ms 消抖。
1 |
|
给 LED 的 test 驱动添加了 read 接口,app 可以先读取当前灯状态,再做切换。
1 |
|
新增代码文件 key_led_app.c,监听 /dev/input/event* 中名为 atk-keyinput 的输入设备。
1 |
|
Makefile 当中新增对应的关键字,同时编译这些文件。
1 | KDIR ?= ../linux-imx-rel_imx_4.1.15_2.1.0_ga |
观察结果。
1 | [imx6ull:/]# insmod /lib/modules/4.1.15/extra/keyinput.ko |