阅读 input.c 源代码:
subsys_initcall(input_init);
module_exit(input_exit);
input_init():
static int __init input_init(void)
{
int err;
input_init_abs_bypass(); //不知道干啥,好像是取绝对值的。
err = class_register(&input_class); //向内核注册一个类,用于linux设备模型。注册后会在/sys/class下面出现input目录
if (err) {
printk(KERN_ERR "input: unable to register input_dev class\n");
return err;
}
err = input_proc_init(); //和proc文件系统有关,暂时不管
if (err)
goto fail1;
err = register_chrdev(INPUT_MAJOR, "input", &input_fops); //注册字符设备,主设备号INPUT_MAJOR,次设备号0-255,注册266个设备,说明input设备最大只能有255个
if (err) {
printk(KERN_ERR "input: unable to register char major %d", INPUT_MAJOR);
goto fail2;
}
return 0;
fail2: input_proc_exit();
fail1: class_unregister(&input_class);
return err;
}
input_exit():
static void __exit input_exit(void)
{
input_proc_exit();
unregister_chrdev(INPUT_MAJOR, "input");
class_unregister(&input_class);
}
这个函数主要是注册了字符设备,这里和杂项设备的原理是一样,所以input设备也是一类字符设备,只不过操作方法交给了输入子系统。
从这里可以看出无论linux设备驱动这块有多复杂,他们都是由一些基本的组件构成的,都是ldd3所讲的基本驱动程序模型。