Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

在前面几章,我们分析了input子系统的框架,以及input handler的注册与实现,本章我们通过

一个虚拟的input device驱动,说明如何开发一个input device驱动。本章涉及的内容如下:

  1. Platform device、driver的使用
  2. Input device的注册与注销;
  3. sysfs下属性文件的注册与注销。

 

 

一、input device驱动开发流程

 

针对input device的驱动开发主要涉及如下几个开发步骤:

  1. 调用input_allocate_device,申请一个input device
  2. 设置该input device的支持事件类型,主要设置input_dev->evbit变量以及该事件类型对应的code值等;
  3. 若该input device支持输出事件,则需要实现event函数;
  4. 调用input_register_device将该事件注册至系统中;
  5. 当该input device接收到一个事件后(一般是发生了中断),可在中断处理函数中调用input_report将该事件分发给具体的input_handler(至于分发过程,请参考之前的文章)。

 

基本上实现以上功能,即可完成一个input device。

 

 

二、虚拟input device驱动实现说明

此处我们实现的input device,主要支持如下功能:

  1. 我们实现EV_KEY类型的事件,主要是实现key的上报;
  2. 因是虚拟设备,因此我们通过向sysfs的属性文件写入数据,模拟按键事件的发生(即模拟按键中断),而在sysfs的store接口中,我们通过调用input_report_key,实现事件的分发;
  3. 在应用层通过打开/dev/input/eventX文件,并通过读取事件,监控按键事件;
  4. 我们在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的定义

 

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

 

Platform driver的代码

如下即是虚拟input设备的platform driver,在其probe函数中,完成input device的注册,并完成相应sysfs属性文件的注册。

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

 

虚拟input设备的sysfs属性定义

         如下即为虚拟input设备的属性定义,其中vinput_key_value_store即用于模拟接收按钮事件并分发的功能,在具体的input设备驱动中,该函数实现的内容应由具体的中断处理函数实现。然后调用input_report_key、input_sync即实现事件的分发(注意此处若不调用input_sync,则事件不会及时分发,若不调用input_sync,则必须等到该input_device存储的事件大于等于max_event_size-2时才会发送)。

 

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

 

 

应用测试程序代码

测试程序代码如下,当接收到按键事件后,打印key code和key value

 

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

 

测试验证

 

向属性文件vinput_key中写入1

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

 

测试程序接收的事件打印如下:

Linux input子系统分析之五 从一个虚拟input device驱动掌握input device驱动开发

其中code0为report事件,可以在应用程序过滤掉即可。

 

通过以上测试,说明虚拟input device驱动工作正常。

 

 

      以上就是本文的全部内容,主要是通过实现一个虚拟的input设备,理解input 设备驱动的开发流程,针对按键等需求,可以通过input device实现。

 

   本篇文章相关的测试代码地址如下:

https://gitee.com/jerry_chg/virt_input.git