linux中有众多的子系统,input子系统是其中的一种,用来处理一类型的输入设备,例如keypad,touchpanel,mice等等,我目前接触到就只有前2种也只写过前2种的驱动,所以后面的就只介绍到key的驱动以及TP的驱动了。
input的核心是一个文件,即input.c,(drivers\input),说实在的其实input子系统也是一种字符设备,只不过进行了一下封装。整个input子系统用一个系统框图就可以很好的概括了,当然这个都是大牛的书上写的,抄来的。
static const struct file_operations input_fops = {
.owner = THIS_MODULE,
.open = input_open_file,
.llseek = noop_llseek,
};
static int __init input_init(void)
{
int err;
err = class_register(&input_class); //会在sys/class/下产生input的目录
if (err) {
pr_err("unable to register input_dev class\n");
return err;
}
err = input_proc_init(); //会在proc/bus/产生input的目录,以及生成devices以及handlers的文件
if (err)
goto fail1;
err = register_chrdev(INPUT_MAJOR, "input", &input_fops); //注册一个字符设备,主设备号INPUT_MAJOR = 13,名字是input,相关的操作函数初始化为
if (err) { //input_fops
pr_err("unable to register char major %d", INPUT_MAJOR);
goto fail2;
}
return 0;
fail2: input_proc_exit();
fail1: class_unregister(&input_class);
return err;
}
static void __exit input_exit(void)
{
input_proc_exit();
unregister_chrdev(INPUT_MAJOR, "input");
class_unregister(&input_class);
}
subsys_initcall(input_init); //subsys_initcall 保证较高优先级初始化
module_exit(input_exit);
由此说明,input子系统也是字符设备。我们知道,当上层应用需要访问input的设备时,必然要调用input的open