Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155709
  • 博文数量: 44
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-10 13:28
个人简介

仰望星空

文章分类
文章存档

2016年(22)

2015年(22)

我的朋友

分类: 嵌入式

2016-02-06 20:02:11

一、输入子系统的构成
    由核心层、驱动层、事件处理层组成
    input driver -> Input core -> Event handler -> userspace 到达用户空间传给应用程序
    

二、drivers/input/input.c:
  1. static int __init input_init(void)  
  2. {  
  3.     int err;  
  4.     ...  
  5.     /* 创建类 */  
  6.     err = class_register(&input_class);  
  7.     ...  
  8.     /* 注册一个字符驱动,主设备号为13 */  
  9.     err = register_chrdev(INPUT_MAJOR, "input", &input_fops);  
  10.     ...  
  11.     return 0;  
  12. }

    只有一个open函数,其他read,write函数呢?
  1. static const struct file_operations input_fops = {  
  2.     .owner = THIS_MODULE,  
  3.     .open = input_open_file,  
  4. }
    
    input_open_file函数

  1. static int input_open_file(struct inode *inode, struct file *file)  
  2. {  
  3.     struct input_handler *handler;  
  4.     const struct file_operations *old_fops, *new_fops = NULL;  
  5.     int err;  
  6.     ...  
  7.     /* 以次设备号为下标,在input_table数组找到一项handler */  
  8.     handler = input_table[iminor(inode) >> 5];  
  9.       
  10.     /* 通过handler找到一个新的fops */  
  11.     new_fops = fops_get(handler->fops);  
  12.     ...  
  13.     old_fops = file->f_op;  
  14.     /* 从此file->f_op = new_fops */  
  15.     file->f_op = new_fops;  
  16.     ...  
  17.     /* 用新的new_fops的打开函数 */  
  18.     err = new_fops->open(inode, file);  
  19.     ...  
  20.     return err;  
  21. }
    input_handler 结构体成员

   问:怎么读按键?

    APP:read > ... > file->f_op->read 

    问:input_table数组由谁构造?

    答:input_register_handler

    三、input_register_handler函数(注册input_handler)

  1. /* 将handler放入input_table数组 */  
  2.     input_table[handler->minor >> 5] = handler;  
  3.     ...  
  4.     /* 将handler放入input_handler_list链表 */  
  5.     list_add_tail(&handler->node, &input_handler_list);  
    四、input_register_device函数(注册inout_dev)
  1. /* 把input_dev放入input_dev_list链表 */  
  2.     list_add_tail(&dev->node, &input_dev_list);  
  3.     ...  
  4.     /* 对于每一个input_handler,都调用input_attach_handler 
  5.      * 根据input_handler的id_table判断能否支持这个input_dev 
  6.      */  
  7.     list_for_each_entry(handler, &input_handler_list, node)  
  8.         input_attach_handler(dev, handler);  
    问:input_register_handle如何注册?
  1. struct input_handler *handler = handle->handler;  
  2.     struct input_dev *dev = handle->dev;  
  3.     ...  
  4.       
  5.     /* 把handle->d_node添加到dev->h_list 
  6.      * 这样,就可以从dev->h_list找到handle,进而找到handler 
  7.      */  
  8.     list_add_tail_rcu(&handle->d_node, &dev->h_list);  
  9.     ...  
  10.   
  11.     /* 把handle->h_node添加到handler->h_list  
  12.      * 这样,就可以从handler->h_list找到handle,进而找到dev 
  13.      */  
  14.     list_add_tail(&handle->h_node, &handler->h_list);  
    小总结:

    怎么建立连接connect?
     1. 分配一个input_handle结构体
     2. 
     input_handle.dev = input_dev;  // 指向左边的input_dev
     input_handle.handler = input_handler;  // 指向右边的input_handler


阅读(1371) | 评论(0) | 转发(0) |
0

上一篇:励志一下

下一篇:1、构造函数

给主人留下些什么吧!~~