一 、 总体架构 图
上层是图形界面和应用程序,通过监听设备节点,获取用户相应的输入事件,根据输入事件来做出相应的反应;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