输入子系统(二)------三大主要结构体及其关系

   
   
  1. input子系统三大主要结构体
  2.  
  3. (一)struct input_handler
  4. struct input_handler {
  5.     /*表示驱动特定的数据*/
  6. void *private;
  7.     /*event()处理函数,这个函数将被输入子系统调用去处理发送给设备的事件*/
  8. void (*event)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
  9. bool (*filter)(struct input_handle *handle, unsigned int type, unsigned int code, int value);
  10. bool (*match)(struct input_handler *handler, struct input_dev *dev);
  11. /*connect用来连接handler和input_dev*/
  12.  int (*connect)(struct input_handler *handler, struct input_dev *dev, const struct input_device_id *id);
  13.  
  14. /*disconnect用来断开handler和input_dev*/   
  15. void (*disconnect)(struct input_handle *handle);
  16. void (*start)(struct input_handle *handle);
  17. const struct file_operations *fops;
  18. int minor;
  19. const char *name;
  20.     /*id_table表示驱动能够处理的表*/
  21. const struct input_device_id *id_table;
  22.     /*链表h_list,表示与这个input_handler相联系的下一个handler*/
  23. struct list_head h_list;
  24.     /*链表node,将其连接到全局的input_handler_list链表中,所有的input_handler都连接在其上*/
  25. struct list_head node;
  26. };

    
    
  1. int input_register_handler(struct input_handler *handler)
  2. {
  3. struct input_dev *dev;
  4. int retval;
  5. retval = mutex_lock_interruptible(&input_mutex);
  6. if (retval)
  7. return retval;
  8. INIT_LIST_HEAD(&handler->h_list);
  9. if (handler->fops != NULL) {
  10. if (input_table[handler->minor >> 5]) {
  11. retval = -EBUSY;
  12. goto out;
  13. }
  14. input_table[handler->minor >> 5] = handler; // 放入数组
  15. }
  16. list_add_tail(&handler->node, &input_handler_list); // 放入链表
  17.     // 对于每个input_dev,调用input_attach_handler
  18. list_for_each_entry(dev, &input_dev_list, node)
  19. input_attach_handler(dev, handler); // 根据input_handler的id_table判断能否支持这个input_dev
  20. input_wakeup_procfs_readers();
  21. out:
  22. mutex_unlock(&input_mutex);
  23. return retval;
  24. }
(二) struct input_dev
   
   
  1. struct input_dev {
  2. const char *name;
  3. const char *phys;
  4. const char *uniq;
  5. struct input_id id;
  6. unsigned long propbit[BITS_TO_LONGS(INPUT_PROP_CNT)];
  7. unsigned long evbit[NBITS(EV_MAX)]; // 表示能产生哪类事件
  8. unsigned long keybit[NBITS(KEY_MAX)]; // 表示能产生哪些按键 unsigned long relbit[NBITS(REL_MAX)]; // 表示能产生哪些相对位移事件, x,y,滚轮 unsigned long absbit[NBITS(ABS_MAX)]; // 表示能产生哪些绝对位移事件, x,y unsigned long mscbit[NBITS(MSC_MAX)]; unsigned long ledbit[NBITS(LED_MAX)]; unsigned long sndbit[NBITS(SND_MAX)]; unsigned long ffbit[NBITS(FF_MAX)]; unsigned long swbit[NBITS(SW_MAX)];
            ...........
        }
(三)struct input_handle

    
    
  1. struct input_handle {
  2. void *private;
  3. int open;
  4. const char *name;
  5. struct input_dev *dev;
  6. struct input_handler *handler;
  7. struct list_head d_node;
  8. struct list_head h_node;
  9. };


三者之间的关系
 
 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值