Android输入子系统名义上由遍历系统多个层的风波管线组成。
输入管线
在最低层,化学输入设备会生成描述状态修改(比如按钮按压和轻触接触点)的讯号。设备固件以某种形式编码和传输这种讯号,比如向系统发送USBHID报告或在I2C总线上形成中断。
之后,讯号由Linux内核中的设备驱动程序解码。Linux内核为许多标准的外围设备提供驱动程序如何安装LINUX,非常是这些符合HID合同的外围设备。但是,原始设备制造商(OEM)一般必须为在低级别紧密集成到系统中的嵌入式设备(如触摸屏)提供自定义驱动程序。
输入设备驱动程序负责通过Linux输入合同将设备特定讯号转换为标准输入风波格式。Linux输入合同在linux/input.h内核头文件中定义了一组标准风波类型和代码。这样一来,内核之外的组件就不须要关注化学扫描代码、HID用途、I2C消息、GPIO引脚等方面的详尽信息。
接出来,AndroidEventHub组件通过打开与每位输入设备关联的evdev驱动程序从内核读取输入风波。之后,AndroidInputReader组件按照设备类别解码输入风波,并生成Android输入风波流。在此过程中,Linux输入合同风波代码将依据输入设备配置、键盘布局文件和各类映射表,转化为Android风波代码。
最后linux 删除文件,InputReader将输入风波发送到InputDispatcher,由其将这种风波转发到相应的窗口。
控制点
在输入管线中有几个阶段会影响对输入设备行为的控制。
驱动程序和固件配置
输入设备驱动程序常常通过在寄存器中设置参数以至上传固件本身来配置输入设备的行为。对于例如触摸屏等嵌入式设备尤其这么,其中一大部份校正过程涉及到调整那些参数或修补固件,以提供所需的精度和响应能力并抑制噪音。
驱动程序配置选项一般在内核板级支持包(BSP)手指定为模块参数,便于同一驱动程序可以支持多种不同的硬件实现。
本文档致力介绍驱动程序或固件配置,但在总体上提供了有关设备校正的指导。
板配置属性
内核板级支持包(BSP)可以通过由AndroidInputReader组件使用的SysFS导入板配置属性,如虚拟键在触摸屏上的位置。
有关不同设备怎样使用板配置属性的详尽信息linux多点触控程序,请参阅设备类别部份。
资源叠加层
有几个输入行为是通过config.xml中的资源叠加层配置的,比如机盖开关的操作。
以下是几个反例:
如需详尽了解每位配置选项,请参阅frameworks/base/core/res/res/values/config.xml中的文档。
键盘映射
AndroidEventHub和InputReader组件使用键盘映射来配置按钮、操纵杆按键和操纵杆轴从Linux风波代码到Android风波代码的映射。映射可能会因设备或语言的不同而不同。
要详尽了解不同设备怎样使用键盘映射,请参阅设备类别部份。
输入设备配置文件
AndroidEventHub和InputReader组件使用输入设备配置文件来配置特殊设备特点,比如,怎么报告触摸规格信息。
如需详尽了解不同设备怎样使用输入设备配置映射,请参阅设备类别部份。
了解HID用途和风波代码
一般使用几个不同的标示符来指代按键上的任何指定按钮、游戏控制器上的按键、操纵杆轴或其他控件。这种标示符之间的关系并非总是一样的:它们取决于一组映射表,其中一些映射是固定的,还有一些映射随设备特点、设备驱动程序、当前语言区域、系统配置、用户偏好设置和其他因素而变化。
化学扫描代码
化学扫描代码是与每位按钮、按钮或其他控件相关联的设备特定标示符。因为化学扫描代码一般因设备而异,因而固件或设备驱动程序负责将其映射到标准标示符,比如HID用途或Linux键盘代码。
扫描代码主要用于按键。其他设备一般使用GPIO引脚、I2C消息或其他方法在低级别进行通讯。因而,软件堆栈的下层依赖于设备驱动程序来确定发生的操作。
HID用途
HID用途是一种标准标示符,用于报告控件(如鼠标键盘、操纵杆轴、鼠标按键或触摸接触点)的状态。大多数USB和蓝牙输入设备都符合HID规范,致使系统才能以统一的方法与它们进行联接。
Android框架依赖于Linux内核HID驱动程序将HID用途代码转换为Linux键盘代码和其他标示符。因而,主要是外设制造商关注HID用途。
Linux键盘代码
Linux键盘代码是用于键盘或按键的标准标示符。Linux键盘代码在linux/input.h头文件中使用以前缀KEY_或BTN_开头的常量进行定义。Linux内核输入驱动程序负责将化学扫描代码、HID用途和其他设备特定讯号转换为Linux键盘代码,并作为EV_KEY风波的一部份提供有关它们的信息。
AndroidAPI有时将与键盘相关联的Linux键盘代码称为其“扫描代码”。这在技术上是错误的,并且有助于在API中分辨Linux键盘代码和Android键盘代码。
Linux相对或绝对轴代码
Linux相对或绝对轴代码是一种标准标示符,用于报告顺着某个轴的相对位移或绝对位置,比如键盘沿其X轴的相对位移或则操纵杆沿其X轴的绝对位置。Linux轴代码在linux/input.h头文件中使用以前缀REL_或ABS_开头的常量进行定义。Linux内核输入驱动程序负责将HID用途和其他设备特定讯号转换为Linux轴代码,并作为EV_REL和EV_ABS风波的一部份提供有关它们的信息。
Linux开关代码
Linux开关代码是用于报告设备上的开关(比如机盖开关)状态的标准标示符。Linux开关代码在linux/input.h头文件中使用以前缀SW_开头的常量进行定义。Linux内核输入驱动程序以EV_SW风波方式报告开关状态修改。
Android应用一般不会接收来自开关的风波,但系统可能会在内部使用它们来控制各类特定于设备的功能。
Android键盘代码
Android键盘代码是在AndroidAPI中定义的标准标示符,用于指示特定按钮(如“主屏幕”)。Android键盘代码由android.view.KeyEvent类定义为以前缀KEYCODE_开头的常量。
键盘布局指定了Linux键盘代码怎么映射到Android键盘代码。可以使用不同的键盘布局linux多点触控程序,具体取决于鼠标机型、语言、国家/地区、布局或特殊功能。
使用特定于设备和语言区域的键盘字符映射将Android键盘代码组合转换为字符代码。诸如,当同时按下标识为KEYCODE_SHIFT和KEYCODE_A的键盘时,系统将在键盘字符映射中查找该组合并找到小写字母“A”,之后将其插入当前聚焦的文本微件中。
Android轴代码
Android轴代码是在AndroidAPI中定义的标准标示符,用于指示特定设备轴。Android轴代码由android.view.MotionEvent类定义为以前缀AXIS_开头的常量。
键盘布局指定了Linux轴代码怎么映射到Android轴代码。可能会使用不同的键盘布局,具体取决于设备机型、语言、国家/地区、布局或特殊功能。
Android元状态
Android元状态是在AndroidAPI中定义的标准标示符,用于指示按什么辅助键。Android元状态由android.view.KeyEvent类定义为以前缀META_开头的常量。
当前元状态由AndroidInputReader组件确定,该组件用于监控何时按下/释放辅助键(如KEYCODE_SHIFT_LEFT)并设置/重置相应的元状态标志。
辅助键和元状态之间的关系采用硬编码,而且键盘布局可以改变辅助键本身的映射方法,这反过来又会影响元状态。
Android按键状态
Android按键状态是在AndroidAPI中定义的标准标示符,用于指示按下(键盘或触控笔上的)什么按键。Android按键状态由android.view.MotionEvent类定义为以前缀BUTTON_开头的常量。
当前的按键状态由AndroidInputReader组件确定,该组件用于监控何时按下/释放(键盘或触控笔上的)按键并设置/重置相应的按键状态标志。
按键和按键状态之间的关系采用硬编码。
延展阅读Linux输入风波代码Linux多点触控合同Linux输入驱动程序Linux强制反馈HID信息,包括HID用途表