Linux/Android——input_handler之evdev (四) 【转】

简介: 转自:http://blog.csdn.net/u013491946/article/details/72638919 版权声明:免责声明: 本人在此发文(包括但不限于汉字、拼音、拉丁字母)均为随意敲击键盘所出,用于检验本人电脑键盘录入、屏幕显示的机械、光电性能,并不代表本人局部或全部同意、支持或者反对观点。

转自:http://blog.csdn.net/u013491946/article/details/72638919

目录(?)[+]

    在前文Linux/Android——input子系统核心 (三) 中概括了总体的结构,以及介绍了input核心的职责,其中有说道注册input设备时会去匹配已有的事件处理器handler,

而这个handler也是存放在一个链表里面的,这里介绍下input子系统中的事件处理input_handler机制.


                                              撰写不易,转载需注明出处:http://blog.csdn.net/jscese/article/details/42238377#t6


evdev:

  /kernel/drivers/input下众多事件处理器handler其中的一个,可以看下源码/kernel/drivers/input/evdev.c中的模块init:

 

[objc]  view plain  copy
 
 
  1. staticintvoid return }  


这个初始化就是往input核心中注册一个input_handler类型的evdev_handler,调用的是input.c提供的接口,input_handler结构前文有介绍,看下evdev_handler的赋值:

 

 

[objc]  view plain  copy
 
 
  1. staticstruct       = evdev_event,  
  2.     = evdev_connect,  
  3.  = evdev_disconnect,  
  4.        = &evdev_fops,  
  5.       = EVDEV_MINOR_BASE,  
  6.        = ,  
  7.    = evdev_ids,  
  8. };  


赋值各个函数指针!

 



input_register_handler:

 可以看到上面的evdev handler 就是调用这个接口注册到input核心中的,同样evdev.c同目录下也还有其它的handler,有兴趣可以看看它们的init函数,都是会调用到这个接口去注册的.

 

[objc]  view plain  copy
 
 
  1. /** 
  2.  * input_register_handler - register a new input handler 
  3.  * @handler: handler to be registered 
  4.  * 
  5.  * This function registers a new input handler (interface) for input 
  6.  * devices in the system and attaches it to all input devices that 
  7.  * are compatible with the handler. 
  8.  */ intstructinput_handler structinput_dev int if return ifNULL if]) {  
  9. goto ] = handler;   
  10.   
  11.   
  12.  out return }  


 

input核心中保存的handler数组:

 

[objc]  view plain  copy
 
 
  1. staticstructinput_handler];  


这是保存注册到input核心中的handler数组,因为在之前input注册的时候注册的字符设备主设备号为13.字符设备的次设备号为0~255,可以有256个设备,

这里后面会看到一个handler可以connect处理32个input设备,所以input体系中,最多拥有8个handler


这个匹配过程和上一篇中的过程是一样的,最后匹配上的话会调用匹配上的handler 中connect指针指向的函数.


另外可以注意的是evdev是匹配所有设备的,因为:

 

[objc]  view plain  copy
 
 
  1. staticconststruct  =  },     
  2.   
  3. };  


如果没有特定的handler添加进handler链表,那么在匹配的时候,只要有这个evdev的handler,最后都会匹配到evdev,这个具体可以去看看上篇的匹配过程.

 

我这边调试的是usb触摸屏,所以用的是evdev的handler,下面看下evdev的connect.


evdev_connect:

 注册的evdev_handler中connect指向的函数为evdev_connect:

[objc]  view plain  copy
 
 
  1. /* 
  2.  * Create new evdev device. Note that input core serializes calls 
  3.  * to connect and disconnect so we don't need to lock evdev_table here. 
  4.  */ staticintstructinput_handlerstructinput_dev conststructinput_device_idid structevdev int int for; minor < EVDEV_MINORS; minor++)  
  5. if break if return // 可以看到这里evdev handler匹配连接好的设备都以evdev 类型存在这个evdev_table数组的,这个数组大小为32个,这就是我上面说到的,为什么只有8个handler //这里是判断evdev的32个位置中是否有空 sizeofstruct  
  6. if return   
  7. , minor);    
  8. true   
  9.  = input_get_device(dev);    
  10.  = dev_name(&evdev->dev);  
  11.  = handler;  
  12.  = evdev;  
  13.  = MKDEV(INPUT_MAJOR, EVDEV_MINOR_BASE + minor);  
  14.  = &input_class;  
  15.  = &dev->dev;  
  16.  = evdev_free;  
  17.   
  18. if goto   
  19. if goto   
  20. if goto return;  
  21.  err_cleanup_evdev  err_unregister_handle  err_free_evdev return }  



evdev:

这里的evdev变量的结构如下:

 

[objc]  view plain  copy
 
 
  1. struct int  
  2. int  
  3. struct  
  4.   
  5. struct__rcu  
  6. struct  
  7.   
  8. struct struct bool };  



关于这个结构变量我的理解是抽象出来一个设备,代表一个input_dev与其匹配好的handler的组合(handle),可以看作提供给事件处理层的一个封装.

 


input_handle:

这个代表一个匹配成功的input dev和 handler组合,定义在input.h中,每个evdev中包含一个input_handle,并且注册到input核心中:

 

[objc]  view plain  copy
 
 
  1. /** 
  2.  * struct input_handle - links input device with an input handler 
  3.  * @private: handler-specific data 
  4.  * @open: counter showing whether the handle is 'open', i.e. should deliver 
  5.  *    events from its device 
  6.  * @name: name given to the handle by handler that created it 
  7.  * @dev: input device the handle is attached to 
  8.  * @handler: handler that works with the device through this handle 
  9.  * @d_node: used to put the handle on device's list of attached handles 
  10.  * @h_node: used to put the handle on handler's list of handles from which 
  11.  *    it gets events 
  12.  */ struct voidvoidprivate  
  13. int constcharchar structinput_dev  
  14. structinput_handler  
  15. struct  
  16. struct };  

 

input_register_handle:

 看看这个handle的注册,不要和handler搞混淆了,这不是一个概念~

[objc]  view plain  copy
 
 
  1. /** 
  2.  * input_register_handle - register a new input handle 
  3.  * @handle: handle to register 
  4.  * 
  5.  * This function puts a new input handle onto device's 
  6.  * and handler's lists so that events can flow through 
  7.  * it once it is opened using input_open_device(). 
  8.  * 
  9.  * This function is supposed to be called from handler's 
  10.  * connect() method. 
  11.  */ intstructinput_handle structinput_handler structinput_dev  
  12.      * Filters go to the head of the list, normal handlers 
  13.      * to the tail. 
  14.      */ if else //把这个handle的d_node 加到对应input_dev的h_list链表里面 //把这个handle的h_node 加到对应input_handler的h_list链表里面 }  


这个注册是把handle 本身的链表加入到它自己的input_dev 以及 input_handler的h_list链表中,这样以后就可以通过h_list遍历到这个handle,

这样就实现了三者的绑定联系.



另外在evdev中还有个结构:


[objc]  view plain  copy
 
 
  1. struct int  
  2. int  
  3. int  
  4.   
  5. struct bool char8 structfasync_struct  
  6. structevdev  
  7. struct  
  8. int struct  
  9. };  


 

这个结构会在evdev被打开的时候 创建,这里关于evdev的初始以及在input系统中承接作用暂时介绍到这里,

前文 Linux/Android——输入子系统input_event传递 (二) 中有记录从设备驱动传递上来的event是怎么到input核心,然后接着往上传递的,接下来就是用到evdev传递了.下篇介绍.

【作者】 张昺华
【新浪微博】 张昺华--sky
【twitter】 @sky2030_
【facebook】 张昺华 zhangbinghua
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
目录
相关文章
|
Android开发 数据安全/隐私保护
Android常见输入inputType类型
android:inputType="none"//输入普通字符 android:inputType="text"//输入普通字符 android:inputType="textCapCharact...
1459 0
|
3天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
8天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
10天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
12天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。
|
10天前
|
存储 API 开发工具
探索安卓开发:从基础到进阶
【10月更文挑战第37天】在这篇文章中,我们将一起探索安卓开发的奥秘。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和建议。我们将从安卓开发的基础开始,逐步深入到更复杂的主题,如自定义组件、性能优化等。最后,我们将通过一个代码示例来展示如何实现一个简单的安卓应用。让我们一起开始吧!
|
11天前
|
存储 XML JSON
探索安卓开发:从新手到专家的旅程
【10月更文挑战第36天】在这篇文章中,我们将一起踏上一段激动人心的旅程,从零基础开始,逐步深入安卓开发的奥秘。无论你是编程新手,还是希望扩展技能的老手,这里都有适合你的知识宝藏等待发掘。通过实际的代码示例和深入浅出的解释,我们将解锁安卓开发的关键技能,让你能够构建自己的应用程序,甚至贡献于开源社区。准备好了吗?让我们开始吧!
23 2
|
12天前
|
Android开发
布谷语音软件开发:android端语音软件搭建开发教程
语音软件搭建android端语音软件开发教程!
|
20天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。
|
19天前
|
Android开发 开发者 UED
安卓开发中自定义View的实现与性能优化
【10月更文挑战第28天】在安卓开发领域,自定义View是提升应用界面独特性和用户体验的重要手段。本文将深入探讨如何高效地创建和管理自定义View,以及如何通过代码和性能调优来确保流畅的交互体验。我们将一起学习自定义View的生命周期、绘图基础和事件处理,进而探索内存和布局优化技巧,最终实现既美观又高效的安卓界面。
28 5
下一篇
无影云桌面