input子系统
1、体系
三层结构
input_driver(usbkdb.c,usbmouse.c等) <----> input_core(input.c) <----> input_handler(evdev.c等)
2.联系的建立
1)input_driver的注册,例如usbkbd.c
a)注册三部曲
struct input_dev *input_allocate_device(void)
int input_register_device(struct input_dev *dev)
void input_unregister_device(struct input_dev *dev)
若input_match_device匹配成功,将input_dev与已经存在的input_handler 通过contect连接到handle下,并挂到input_dev的h_list上。
b)设置dev的事件类型、事件码、事件值的范围、以及match时所需其他的标识信息
usb_to_input_id(dev, &input_dev->id);//设置bustype、vendo、product等
input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_LED) | BIT(EV_REP);//支持的事件类型
input_dev->ledbit[0] = BIT(LED_NUML) | BIT(LED_CAPSL) | BIT(LED_SCROLLL) | BIT(LED_COMPOSE) | BIT(LED_KANA);// EV_LED事件支持的事件码
for (i = 0; i < 255; i++)
set_bit(usb_kbd_keycode[i], input_dev->keybit); //EV_KEY事件支持的事件码
2)input_handler的注册,见evdev.c中的evdev_handler的注册
input_register_handler(&evdev_handler);
若input_match_device匹配成功,将已经存在的input_dev与input_handler 通过contect连接到handle下,并挂到input_dev的h_list上。
3.联系路径
input_driver -> input_report_xxx(例如xxx为key)->input_event->对设备下的所有handler调用其event
通过input 字符设备的open->input_open_file->通过inode中的设备id找到input_dev下的handler,并将handler.fops代替其file.fops之后所有的读写等操作均映射到handler上
参考文章:
http://blog.csdn.net/hongtao_liu/article/details/5679171 华清 刘老师博客
http://blogold.chinaunix.net/u1/51562/showart_1090628.html

