5
const struct file_operations *fops;
int minor;// input_table[handler->minor >> 5] = handler;
//用于判断此 handler 可以匹配哪些 input_dev
const struct input_device_id *id_table;
const struct input_device_id *blacklist;//黑名单
struct list_head h_list;// 指向和 input_dev 匹配成功后生成的对应的 handle
struct list_head node;// 把自己链入到 input_handler_list
};
static const struct file_operations evdev_fops{
……
.read = evdev_read, //上层读事件时会调用
.write = evdev_write, //测试时用
.open = evdev_open, //打开设备,并做相应的初始化,如创建 client
};
static struct input_handler evdev_handler = {
……
.minor = EVDEV_MINOR_BASE, // #define EVDEV_MINOR_BASE 64
};
static const struct input_device_id evdev_ids[] = {
{ .driver_info = 1 }, /* Matches all devices */
{ }, /* Terminating zero entry */
};
#define MATCH_BIT(bit, max) \
for (i = 0; i < BITS_TO_LONGS(max); i++) \
if ((id->bit[i] & dev->bit[i]) != id->bit[i]) \
break; \
if (i != BITS_TO_LONGS(max)) \
continue;
static const struct input_device_id *input_match_device(const struct input_device_id *id,
struct input_dev *dev)
{
int i;
for (; id->flags || id->driver_info; id++) {
if (id->flags & INPUT_DEVICE_ID_MATCH_BUS)
if (id->bustype != dev->id.bustype)
continue;
if (id->flags & INPUT_DEVICE_ID_MATCH_VENDOR)
if (id->vendor != dev->id.vendor)
continue;