Linux设备驱动剖析之Input(一)


前言

   

                                               Linux Input子系统架构图

   __init input_init(      
     err = class_register(&              printk(KERN_ERR           
     err =               
     err = register_chrdev(INPUT_MAJOR, , &              printk(KERN_ERR           
       
  fail1:    class_unregister(&      }

   __init input_proc_init(      proc_dir_entry * 
     proc_bus_input_dir = proc_mkdir(      (!          - 
     entry = proc_create(,                  &      (!          
     entry = proc_create(,                  &      (!          
       
  fail2:    remove_proc_entry(  fail1: remove_proc_entry(      - }

    file_operations input_fops =     .owner =     .open = };

   __init gpio_keys_init(      platform_driver_register(& }

   platform_driver gpio_keys_device_driver =     .probe        =     .remove        =     .driver        =         .name    =          .owner    =         .pm    = & 
 };

   __devinit gpio_keys_probe( platform_device *      gpio_keys_platform_data *pdata = pdev->      gpio_keys_drvdata *      device *dev = &pdev->      input_dev *           wakeup =  
     ddata = kzalloc(( gpio_keys_drvdata) +
             pdata->nbuttons * (     input =      (!ddata || !         dev_err(dev,          error = -          
     ddata->input =     ddata->n_buttons = pdata->     ddata->enable = pdata->     ddata->disable = pdata->     mutex_init(&ddata-> 
 
     input->name = pdev->     input->phys =      input->dev.parent = &pdev->     input->open =     input->close = 
     input->id.bustype =     input->id.vendor =      input->id.product =      input->id.version =  
     
      (pdata->         __set_bit(EV_REP, input-> 
      (i = ; i < pdata->nbuttons; i++          gpio_keys_button *button = &pdata->          gpio_button_data *bdata = &ddata->         unsigned  type = button->type ? 
         bdata->input =         bdata->button = 
         error =                       
          (button->             wakeup =  
         input_set_capability(input, type, button-> 
     error = sysfs_create_group(&pdev->dev.kobj, &              dev_err(dev,           
     error =              dev_err(dev,           
     
      (i = ; i < pdata->nbuttons; i++         gpio_keys_report_event(&ddata-> 
     device_init_wakeup(&pdev-> 
       
     sysfs_remove_group(&pdev->dev.kobj, &      (--i >=          free_irq(gpio_to_irq(pdata->buttons[i].gpio), &ddata->          (ddata->             del_timer_sync(&ddata->         cancel_work_sync(&ddata->         gpio_free(pdata-> 
 
      }

       gpio_keys_button *          unsigned  rep:;        
      (*enable)( device *      (*disable)( device * };

       input_dev *          unsigned       (*enable)( device *      (*disable)( device *      gpio_button_data data[ };

       gpio_keys_button *      input_dev *                timer_debounce;    
      };

      
      code;        
                *      type;        
      wakeup;        
      debounce_interval;    
      };

  input_dev *input_allocate_device(      input_dev * 
     dev = kzalloc((              dev->dev.type = &         dev->dev. = &         device_initialize(&dev->         mutex_init(&dev->         spin_lock_init(&dev->         INIT_LIST_HEAD(&dev->         INIT_LIST_HEAD(&dev-> 
 
      }

        *       *       *      
     unsigned      unsigned      unsigned      unsigned      unsigned      unsigned      unsigned      unsigned      unsigned  
     unsigned  
     unsigned      unsigned       *      (*setkeycode)( input_dev *               unsigned  scancode, unsigned       (*getkeycode)( input_dev *               unsigned  scancode, unsigned  * 
      ff_device * 
     unsigned       
      
      input_mt_slot *           
      input_absinfo * 
     unsigned      unsigned      unsigned      unsigned  
      (*open)( input_dev *      (*close)( input_dev *      (*flush)( input_dev *dev,  file *      (*)( input_dev *dev, unsigned  type, unsigned  code,  
      input_handle * 
      
     unsigned       
      
      
           };

  };

 

 

相关内容