input core input.c (1)
drivers/input/input.c
就是所谓的input的核心程序。
分析这个文件,先从input_init开始。
1: static int __init input_init(void)
2: {
3: err = class_register(&input_class);
4: err = input_proc_init();
5: err = register_chrdev(INPUT_MAJOR, "input", &input_fops);
6: }
__init 把它放到了init.text段,初始化的时候会调用。函数去掉检查的情况,也就这么几行。class_register注册了一个device model里的class类型。具体会在__class_register里面调到
1: /*对class的私有数据进行了初始化工作*/
2: /*cp是一个class_private类型,class的私有类型*/
3: cp = kzalloc(sizeof(*cp), GFP_KERNEL);
4: /*初始化了klist的get/put函数,实际调用了get_device和put_device*/
5: klist_init(&cp->class_devices, klist_class_dev_get, klist_class_dev_put);
6: INIT_LIST_HEAD(&cp->class_interfaces);
7: kset_init(&cp->class_dirs);
8: __mutex_init(&cp->class_mutex, "struct class mutex", key);
9: error = kobject_set_name(&cp->class_subsys.kobj, "%s", cls->name);
10:
11: /* set the default /sys/dev directory for devices of this class */
12: if (!cls->dev_kobj)
13: cls->dev_kobj = sysfs_dev_char_kobj;
14: /*注册kset,里面要先初始化kset,在这里获取kobject,就建立了目录了*/
15: error = kset_register(&cp->class_subsys);
16: /*这里建立attribute文件,遍历它的attribute,熟悉device model的话就知道attribute其实就对应着文件*/
17: error = add_class_attrs(class_get(cls));
18:
这个很简单:
1: /*在proc下建立了input的目录*/
2: proc_bus_input_dir = proc_mkdir("bus/input", NULL);
3: /*在bus/input下建立两个文件devices和handlers,并注册了它们的fops,这两个fops是在input.c中定义的,fops的函数也是在input.c中定义.*/
4: entry = proc_create("devices", 0, proc_bus_input_dir,
5: &input_devices_fileops);
6: entry = proc_create("handlers", 0, proc_bus_input_dir,
7: &input_handlers_fileops);
8:
下面一个register_chardev注册了一个主设备号为INPUT_MAJOR,次设备号从0-256,文件操作符为input_fops的字符设备.
看完了input_init,再看看input.c中,后半部分就是fops的函数,前面是一些接口函数,中间是
handle和handler函数.
待续