首页 > 系统服务 > 详细

Linux input子系统学习总结(一)---- 三个重要的结构体

时间:2015-12-16 18:51:40      阅读:591      评论:0      收藏:0      [点我收藏+]

 

一 、 总体架构 图

 

  技术分享

上层是图形界面和应用程序,通过监听设备节点,获取用户相应的输入事件,根据输入事件来做出相应的反应;eventX (X从0开始) 按键事件,mice 鼠标事件

 

Input core  ---  input 核心

Input event drivers --- input事件驱动(mousedev 、 evdev、keyboard)

Input device drivers --- input设备驱动(触摸屏、键盘、鼠标)

 

 技术分享

 

三个重要的结构体: include\linux\input.h

 

struct input_dev {  //// 表示input设备

         const char *name;///设备的名称

         const char *phys; ////设备在系统结构中的物理路径

         const char *uniq;///设备的唯一标识符

         struct input_id id;///描述设备的硬件属性(包括厂商信息、硬件版本号等)

 

         unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];///bitmap 比特映射的设备属性 BITS_TO_LONGS(INPUT_PROP_CNT)---bit(32)转化为 long

         unsigned long evbit[BITS_TO_LONGS(EV_CNT)];///支持的事件类型

         unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];///按键的类型 Keys and buttons

             .

             .

             .

             .

         int (*open)(struct input_dev *dev);

         void (*close)(struct input_dev *dev);

         int (*flush)(struct input_dev *dev, struct file *file);

         int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);

 

         struct input_handle __rcu *grab;

 

         spinlock_t event_lock;

         struct mutex mutex;

 

         unsigned int users;

         bool going_away;

 

         struct device dev;////设备的基类

 

         struct list_head       h_list;////链表

         struct list_head       node;

};

 

 

struct input_handler {///代表输入设备的处理方法

 

         void *private;///用于保存input_handler 的私有变量

 

         void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);

         void (*events)(struct input_handle *handle,const struct input_value *vals, unsigned int count);

         bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);

         bool (*match)(struct input_handler *handler, struct input_dev *dev);

         int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);

         void (*disconnect)(struct input_handle *handle);

         void (*start)(struct input_handle *handle);

 

         bool legacy_minors;

         int minor;///次设备号

         const char *name; 

         const struct input_device_id *id_table;

 

         struct list_head       h_list;

         struct list_head       node;

};

 

Match :在设备id 和handler 的id_table 匹配成功的时候调用; (called after comparing device‘s id with handler‘s id_table  to perform fine-grained matching between device and handler

Connect 当一个handle 匹配到一个device 的时候执行(called when attaching a handler to an input device

Start :当input 核心执行完 connect 以后调用(called by input core right after connect() method

 

struct input_handle {  ///用来关联 input_dev 和  input_handler

 

         void *private;

         int open;

         const char *name;

         struct input_dev *dev;

         struct input_handler *handler;

 

         struct list_head       d_node;

         struct list_head       h_node;

};

 

如图,横轴表示一系列的input 设备,纵轴表示事件驱动event,中间的紫色圆点代表input_handle,通过input_handle来关联设备驱动和事件驱动

          技术分享

 

 

 

 (注:以上图片均来自麦子学院 金鑫老师的课程,在此表示真挚的感谢!)

 

 

 

Linux input子系统学习总结(一)---- 三个重要的结构体

原文:http://www.cnblogs.com/EaIE099/p/5051755.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!