[Linux 3.0 http://lxr.linux.no/#linux+v3.0]
前面介绍了输入子系统的初始化,前面提及到/proc/bus/input/handlers,当读取此文件时,其中有一行是
N: Number=2 Name=evdev Minor=64
这一行是如何来的呢?
----------------------------------------------------------------------------------------------
obj-$(CONFIG_INPUT_EVDEV) += evdev.o
下面来解开这个迷底,介绍handler ------ evdev的注册过程
<drivers/input/evdev.c>
1235 static struct input_handler evdev_handler = { 1236 .event = evdev_event, 1237 .events = evdev_events, 1238 .connect = evdev_connect, 1239 .disconnect = evdev_disconnect, 1240 .legacy_minors = true, 1241 .minor = EVDEV_MINOR_BASE, 1242 .name = "evdev", 1243 .id_table = evdev_ids, 1244 }; 1245 1246 static int __init evdev_init(void) 1247 { 1248 return input_register_handler(&evdev_handler); 1249 } 1250 1251 static void __exit evdev_exit(void) 1252 { 1253 input_unregister_handler(&evdev_handler); 1254 } 1255 1256 module_init(evdev_init); 1257 module_exit(evdev_exit);
1248行,调用input_register_handler去注册这个evdev handler
下面具体看看,input_register_handler是如果去注册evdev这个hanlder的。
/**
* input_register_handler - register a new input handler
* @handler: handler to be registered
*
* This function registers a new input handler (interface) for input
* devices in the system and attaches it to all input devices that
* are compatible with the handler.
*/
1923int input_register_handler(struct input_handler *handler)
1924{
1925 struct input_dev *dev;
1926 int retval;
1927
1928 retval = mutex_lock_interruptible(&input_mutex);
1929 if (retval)
1930 return retval;
1931
1932 INIT_LIST_HEAD(&handler->h_list);
1933
1934 if (handler->fops != NULL) {
1935 if (input_table[handler->minor >> 5]) {
1936 retval = -EBUSY;
1937 goto out;
1938 }
1939 input_table[handler->minor >> 5] = handler;
1940 }
1941
1942 list_add_tail(&handler->node, &input_handler_list);
1943
1944 list_for_each_entry(dev, &input_dev_list, node)
1945 input_attach_handler(dev, handler);
1946
1947 input_wakeup_procfs_readers();
1948
1949 out:
1950 mutex_unlock(&input_mutex);
1951 return retval;
1952}
1953EXPORT_SYMBOL(input_register_handler);
1928行,此处加一个可被中断的锁。
1932行,初始化handler的h_list链表(h_list的定义:list of input handles associated with the handler)
1934 ~1940行,判断此handler的操作函数是否为空,非空,通过其minor值,判断此handler是否已经存在(注册过),如果否,将其加入input_table中。
input_table定义:static struct input_handler *input_table[8]; 说明在linux系统中,最多只能有8个输入handler。
1942行,将此handler加入到input_handler_list的链表中。其定义:static LIST_HEAD(input_handler_list); (lin38 in input.c)
1944行,扫描input_dev_list链表,看是否输入设备需要此handler的支持。 其定义:static LIST_HEAD(input_dev_list); (lin37 in input.c)
input_attach_handler(line 895, in input.c)--> input_match_device(line 854, in input.c) ,此过程没有找到match的设备, 返回NULL。
1947行,proc文件系统操作。此处需要进一步研究。
1950行,释放锁并返回