在前面几章,我们分析了input子系统的框架,以及input handler的注册与实现,本章我们通过一个虚拟的input device驱动,说明如何开发一个input device驱动。本章涉及的内容如下:
- Platform device、driver的使用
- Input device的注册与注销;
- sysfs下属性文件的注册与注销。
一、input device驱动开发流程
针对input device的驱动开发主要涉及如下几个开发步骤:
- 调用input_allocate_device,申请一个input device
- 设置该input device的支持事件类型,主要设置input_dev->evbit变量以及该事件类型对应的code值等;
- 若该input device支持输出事件,则需要实现event函数;
- 调用input_register_device将该事件注册至系统中;
- 当该input device接收到一个事件后(一般是发生了中断),可在中断处理函数中调用input_report将该事件分发给具体的input_handler(至于分发过程,请参考之前的文章)。
基本上实现以上功能,即可完成一个input device。
二、虚拟input device驱动实现说明
此处我们实现的input device,主要支持如下功能:
- 我们实现EV_KEY类型的事件,主要是实现key的上报;
- 因是虚拟设备,因此我们通过向sysfs的属性文件写入数据,模拟按键事件的发生(即模拟按键中断),而在sysfs的store接口中,我们通过调用input_report_key,实现事件的分发;
- 在应用层通过打开/dev/input/eventX文件,并通过读取事件,监控按键事件;
- 我们在platform driver的probe接口中,完成input device的注册、sysfs属性文件的注册操作。
数据结构
如下即为虚拟input device定义的数据结构,其中key表示key id,key_value用于记录key值
typedef struct virtual_input_info_s
{
struct input_dev *input_dev;
int key_value;
int key;
}virtual_input_info_t;
Platform device的代码
如下即是本次虚拟input设备的platform device的定义
![5a2cdb80f1529dc0363b7ca8db03c503.png](https://i-blog.csdnimg.cn/blog_migrate/33b21ab0052908b15ab924e906ab64a2.jpeg)
Platform driver的代码
如下即是虚拟input设备的platform driver,在其probe函数中,完成input device的注册,并完成相应sysfs属性文件的注册。
![39a80b016303fa172f142d63f0336372.png](https://i-blog.csdnimg.cn/blog_migrate/4a10f0205243961c8f753f43b5e291b6.jpeg)
虚拟input设备的sysfs属性定义
如下即为虚拟input设备的属性定义,其中vinput_key_value_store即用于模拟接收按钮事件并分发的功能,在具体的input设备驱动中,该函数实现的内容应由具体的中断处理函数实现。然后调用input_report_key、input_sync即实现事件的分发(注意此处若不调用input_sync,则事件不会及时分发,若不调用input_sync,则必须等到该input_device存储的事件大于等于max_event_size-2时才会发送)。
![601dfad73e2f41145b5b9f0e0445b644.png](https://i-blog.csdnimg.cn/blog_migrate/86b19ab775f46503165635cdd664d62c.jpeg)
应用测试程序代码
测试程序代码如下,当接收到按键事件后,打印key code和key value
![e02028a4de28931b44d93512416223fa.png](https://i-blog.csdnimg.cn/blog_migrate/99b69eb7df6ff80630d238f6d47c793b.jpeg)
测试验证
向属性文件vinput_key中写入1
![1f58337908cb66ab21c1813eeeae77fb.png](https://i-blog.csdnimg.cn/blog_migrate/b4511025b56655db5c6064520b3e44f3.jpeg)
测试程序接收的事件打印如下:
![4b906a5d3fa6713e1e53e16d1060f414.png](https://i-blog.csdnimg.cn/blog_migrate/1bd1de1d248de0ef59d3e2f0d2c3d840.jpeg)
其中code0为report事件,可以在应用程序过滤掉即可。通过以上测试,说明虚拟input device驱动工作正常。
以上就是本文的全部内容,主要是通过实现一个虚拟的input设备,理解input 设备驱动的开发流程,针对按键等需求,可以通过input device实现。至此我们完成了input子系统的代码分析及驱动开发验证工作。