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:   
再回来到input_init中,下一个input_proc_init,这个函数主要建立input字系统在proc文件系统中的目录,文件,注册相应的fops.

这个很简单:

   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函数.

待续

posted @ 2011-04-07 23:17  冷月X  阅读(1783)  评论(0编辑  收藏  举报