目录
一、设备树修改
1、跟按键中断驱动一样
二、初始化
1、设备树和硬件相关的初始化跟按键中断驱动一样;但注册设备节点不需要字符设备那一套,有自己的封装函数注册设备节点:
(1) 获取设备树信息,GPIO初始化,中断初始化,定时器初始化
(2) 申请input_dev 结构体,初始化事件类型(evbit)和事件值(keybit),向 Linux 内核注册注册输入设备( input_dev)
三、上报输入事件
1、需要在按键中断处理函数,或者消抖定时器中断函数中将按键值上报给 Linux 内核:
void input_report_key(struct input_dev *dev, unsigned int code, int value);
函数参数:
dev:需要上报的 input_dev。
code: 事件码,也就是我们注册的按键值,比如 KEY_0、 KEY_1 等等。
value:事件值,比如 1 表示按键按下, 0 表示按键松开。
2、当我们上报事件以后还需要使用 input_sync 函数来告诉 Linux 内核 input 子系统上报结束,input_sync 函数本质是上报一个同步事件:
void input_sync(struct input_dev *dev);
四、应用程序
1、 Linux 内核会使用 input_event 结构体来表示输入事件,所以我们要获取按键输入信息,那么必须借助于 input_event 结构体:
2、当我们向 Linux 内核成功注册 input_dev 设备以后,会在/dev/input 目录下生成一个名为“eventX(X=0….n)”的文件。
3、直接使用 hexdump 命令来查看/dev/input/event1 文件内容:hexdump /dev/input/event1
gitee代码链接:gitee_linux_driver: 个人理解编写的linux驱动 - Gitee.com
github代码链接:Can/20_input at master · CanvMo/Can · GitHub
附件:
1、Linux 内核也提供了其他的针对具体事件的上报函数,这些函数其实都用到了 input_event 函数
(1)void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value);
dev:需要上报的 input_dev。
type: 上报的事件类型,比如 EV_KEY。
code: 事件码,也就是我们注册的按键值,比如 KEY_0、 KEY_1 等等。
value:事件值,比如 1 表示按键按下, 0 表示按键松开。
input_event 函数可以上报所有的事件类型和事件值。
(2)void input_report_key(struct input_dev *dev, unsigned int code, int value); //提交按键事件的函数
(3)void input_report_rel(struct input_dev *dev, unsigned int code, int value); //提交相对坐标事件的函数
(4)void input_report_abs(struct input_dev *dev, unsigned int code, int value); //提交绝对坐标事件的函数
(5)void input_mt_sync(struct input_dev *dev); //隔离不同的触摸点数据信息,函数会触发SYN_MT_REPORT事件,此事件会通知接收者获取当前触摸数据,并且准备接收下一个触摸点数据
(6)void input_mt_slot(struct input_dev *dev, int slot); //区分不同的触摸点数据信息,input_mt_slot 函数会触发ABS_MT_SLOT事件,此事件会告诉接收者当前正在更新的是哪个触摸点 (slot) 的数据