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所讲的基本驱动程序模型。 */
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结构