现在的位置: 首页 > 综合 > 正文

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

2013年08月24日 ⁄ 综合 ⁄ 共 2120字 ⁄ 字号 评论关闭

[Linux 3.0 http://lxr.linux.no/#linux+v3.0]

前面介绍了输入子系统的初始化,前面提及到/proc/bus/input/handlers,当读取此文件时,其中有一行是

N: Number=2 Name=evdev Minor=64

这一行是如何来的呢?

下面来解开这个迷底,介绍handler ------ evdev的注册过程

988static struct input_handler evdev_handler = {
989 .event = evdev_event,
990 .connect = evdev_connect,
991 .disconnect = evdev_disconnect,
992 .fops = &evdev_fops,
993 .minor = EVDEV_MINOR_BASE,
994 .name = "evdev",
995 .id_table = evdev_ids,
996};
997
998static int __init evdev_init(void)
999{
1000 return input_register_handler(&evdev_handler);
1001}

988 ~ 996行, 定义了一个evdev handler.

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

抱歉!评论已关闭.