input子系统学习四:核心层

一.  输入子系统核心分析。

    1.输入子系统核心对应与/drivers/input/input.c文件,这个也是作为一个模块注册到内核的。所以首先分析模块初始化函数。

 1 static int __init input_init(void)
 2 {
 3     int err;
 4 
 5     input_init_abs_bypass();
 6     
 7     err = class_register(&input_class);
 8     /*调用 class_register()函数先注册了一个名为 input 的类。所有 input device 都属于这个类。
 9     在 sysfs 中表现就是,所有 input device 所代表的目录都位于/sys/class/input 下面。*/    
10     if (err) {
11         printk(KERN_ERR "input: unable to register input_dev class\n");
12         return err;
13     }
14 
15     err = input_proc_init();//创建/proc中的项,就可以从/proc目录看到input的信息
16     if (err)
17         goto fail1;
18 
19     err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
20     /*注册设备,主设备号为INPUT_MAJOR,就是13,后面注册的输入设备都使用该主设备号
21     在这里并没有生成设备文件.只是在/dev/目录下创建了input目录,
22     以后所有注册进系统的输入设备文件都放在这个目录下.*/
23     if (err) {
24         printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
25         goto fail2;
26     }
27 
28     return 0;
29 
30  fail2:    input_proc_exit();
31  fail1:    class_unregister(&input_class);
32     return err;
33 }
34 
35 /* 这个函数主要是注册了字符设备,这里和杂项设备的原理是一样,所以input设备也是一类字符设备,只不过操作方法交给了输入子系统。从这里可以看出无论linux设备驱动这块有多复杂,他们都是由一些基本的组件构成的,都是ldd3所讲的基本驱动程序模型。 */
View Code

 


    2. 输入子系统的核心其他部分都是提供的接口,向上连接事件处理层,向下连接驱动层。
    向下对驱动层的接口主要有:
    input_allocate_device    这个函数主要是分配一个input_dev接口,并初始化一些基本的成员,这就是我们不能简单用kmalloc分配input_dev结构的原因,因为缺少了一些初始化。
    input_unregister_device  注册一个input设备
    input_event              这个函数很重要,是驱动层向input子系统核心报告事件的函数,在事件传递过程中再分析。
    input_allocate_device    分配并初始化一个input_dev结构
    向上对事件处理层接口主要有:
    input_register_handler   注册一个事件处理器
    input_register_handle    注册一个input_handle结构

你可能感兴趣的:(input子系统学习四:核心层)