Linux输入子系统分析 (2) -- evdev handler初始化

[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);

1235 ~ 1244行, 定义了一个evdev handler.

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行,释放锁并返回

你可能感兴趣的:(linux,input)