Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发
在前面几章,我们分析了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的定义
Platform driver的代码
如下即是虚拟input设备的platform driver,在其probe函数中,完成input device的注册,并完成相应sysfs属性文件的注册。
虚拟input设备的sysfs属性定义
如下即为虚拟input设备的属性定义,其中vinput_key_value_store即用于模拟接收按钮事件并分发的功能,在具体的input设备驱动中,该函数实现的内容应由具体的中断处理函数实现。然后调用input_report_key、input_sync即实现事件的分发(注意此处若不调用input_sync,则事件不会及时分发,若不调用input_sync,则必须等到该input_device存储的事件大于等于max_event_size-2时才会发送)。
应用测试程序代码
测试程序代码如下,当接收到按键事件后,打印key code和key value
测试验证
向属性文件vinput_key中写入1
测试程序接收的事件打印如下:
其中code0为report事件,可以在应用程序过滤掉即可。
通过以上测试,说明虚拟input device驱动工作正常。
以上就是本文的全部内容,主要是通过实现一个虚拟的input设备,理解input 设备驱动的开发流程,针对按键等需求,可以通过input device实现。
本篇文章相关的测试代码地址如下: