系列文章目录
目录
1.2.1 InputDeviceConfigurationFileType
2.1.2 InputReaderConfiguration
2.1.4 VelocityControlParameters
4.1.3 InputDispatcherConfiguration
6.com_android_server_input_InputManagerService.cpp
简介
由于后续篇幅如input启动分析,增删设备事件分析,发送key按键分析中存在大量的结构体,包含了各种信息,为了更好的了解和读懂,此篇,将对大量的结构体和其参数的含义作出解释。
1. EventHub.h
1.1 结构体
1.1.1 RawEvent
//从EventHub检索到的原始事件
struct RawEvent {
nsecs_t when;//时间
int32_t deviceId;//事件发生的设备id
int32_t type;//类型,例如按键事件等
int32_t code;//扫描码,按键对应的扫描码
int32_t value;//值,表示按键按下,或者抬起等
};
1.1.2 input_event
//event结构本身,会将input_event加工成RawEvent,然后交给inputreader处理
struct input_event {
struct timeval time;//时间
__u16 type;//类型,例如按键事件等
__u16 code;//扫描码,按键对应的扫描码
__s32 value;//值,表示按键按下,或者抬起等
};
1.1.3 input_id
struct input_id {
__u16 bustype;//类型
__u16 vendor;//供应商
__u16 product;//产品
__u16 version;//版本
};
1.1.4 Device
struct Device {
Device* next;//是一个单链表
int fd; //fd表示此设备的设备节点的描述符,可以从此描述符中读取原始输入事件
const int32_t id;//id在输入系统中唯一标识这个设备
const String8 path;//设备节点的路径
const InputDeviceIdentifier identifier;//厂商信息
uint32_t classes;//classes表示了设备的类别,键盘设备,触控设备等
uint8_t keyBitmask[(KEY_MAX + 1) / 8];//事件位掩码,它们详细地描述了设备能够产生的事件类型
uint8_t absBitmask[(ABS_MAX + 1) / 8];
uint8_t relBitmask[(REL_MAX + 1) / 8];
uint8_t swBitmask[(SW_MAX + 1) / 8];
uint8_t ledBitmask[(LED_MAX + 1) / 8];
uint8_t ffBitmask[(FF_MAX + 1) / 8];
uint8_t propBitmask[(INPUT_PROP_MAX + 1) / 8];
String8 configurationFile;//配置文件路径,以键值对的形式存储在一个文件中,其路径取决于identfier字段中的厂商信息,这些
配置信息将会影响InputReader对此设备的事件的加工行为
PropertyMap* configuration;//会有一个函数从configurationFile读取文件,并将其键值对加载进此map
VirtualKeyMap* virtualKeyMap;//虚拟键盘映射表。对于键盘类型的设备,这些键盘映射表将原始事件中的键盘扫描码转换为Android定义的
//的按键值。这个映射表也是从一个文件中加载的,文件路径取决于dentifier字段中的厂商信息
KeyMap keyMap;//真实键盘映射表
sp<KeyCharacterMap> overlayKeyMap;//覆盖健映射表
sp<KeyCharacterMap> combinedKeyMap;//组合按健映射表
bool ffEffectPlaying;//力反馈相关,如手柄支持力反馈等
int16_t ffEffectId; //
int32_t controllerNumber;
int32_t timestampOverrideSec;
int32_t timestampOverrideUsec;
Device(int fd, int32_t id, const String8& path, const InputDeviceIdentifier& identifier);
~Device();
void close();
bool enabled; // initially true
status_t enable();
status_t disable();
bool hasValidFd();
const bool isVirtual; // set if fd < 0 is passed to constructor
const sp<KeyCharacterMap>& getKeyCharacterMap() const {
if (combinedKeyMap != NULL) {
return combinedKeyMap;
}
return keyMap.keyCharacterMap;
}
};
1.1.5 epoll_event
struct epoll_event {
__uint32_t events; /* 事件掩码,指明了需要监听的事件种类,
//常用的事件有EPOLLIN(可读),EPOLLOUT(可写),EPOLLERR(描述符发生错误),EPOLLHUP(描述符被挂起)
epoll_data_t data; /* 使用者自定义的数据,当此事件发生时该数据将原封不动地返回给使用者 */
};
1.1.6 RawAbsoluteAxisInfo
struct RawAbsoluteAxisInfo {
bool valid; // 此项信息是否受到输入设备的支持,如果信息有效,则为true,否则为false
int32_t minValue; // 此项信息的最小值
int32_t maxValue; // 此项信息的最大值
int32_t flat; // 中心平面位置,例如flat==8表示中心在-8和8之间
int32_t fuzz; // 容错范围。表示因干扰所导致的最大偏移量,例如fuzz==4意味着干扰信息导致的值为+/-4
int32_t resolution; // 精度,表示在1毫米的范围中的解析点的数量
//例如,对设备的X坐标这项信息而言,RawAbsoluteAxisInfo的minValue和maxValue表示了事件上报的X坐标范围,
//Resolution则表示传感器在每毫米距离中可以产生的X坐标点 的数量(ppm)。
//X坐标与Y坐标的这些技术指标构建了传感器的物理坐标系。而对压力值这项信息而言,
//如果其RawAbsoluteAxisInfo的valid值为false,则表示此设备不支持识别压力值。
//当然,这些字段并不是对所有类型的信息都有效,例如对于传感器所支持的触控点数量这项信息,
//仅有valid和maxValue两个字段有效,valid为true表示设备支持通过slot协议进行触控点索引的识别,
//而maxValue则表示最大触控点的数量为maxValue+1。
inline void clear() {
valid = false;
minValue = 0;
maxValue = 0;
flat = 0;
fuzz = 0;
resolution = 0;
}
};
1.1.7 AxisInfo
源路径为:/frameworks/native/include/input/KeyLayoutMap.h
struct AxisInfo {
enum Mode {
// 直接报告轴值。
MODE_NORMAL = 0,
// 报告前应反转轴值。
MODE_INVERT = 1,
// 轴值应拆分为两个轴
MODE_SPLIT = 2,
};
// Axis mode.
Mode mode;
// Axis id.
// 分割时,这是用于小于分割位置的值的轴。
int32_t axis;
// 分割时,这是用于高于分割位置之后的值的轴。
int32_t highAxis;
// 拆分值,如果未拆分,则为0。
int32_t splitValue;
// The flat value, or -1 if none.
int32_t flatOverride;
AxisInfo() : mode(MODE_NORMAL), axis(-1), highAxis(-1), splitValue(0), flatOverride(-1) {
}
};
1.1.8 inotify_event
struct inotify_event
{
int wd; /* 事件对应的Watch对象的描述符. */
uint32_t mask; /* 事件类型,例如文件被删除,此处值为IN_DELETE. */
uint32_t cookie; /* 同步两个事件的缓存 */
uint32_t len; /* name字段的长度 */
char name __flexarr;
// 可变长的字段,用于存储产生此事件的文件路径 * /
};
1.2 枚举类型
1.2.1 InputDeviceConfigurationFileType
此类型源路径为:/frameworks/native/include/input/InputDevice.h
enum InputDeviceConfigurationFileType {
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_CONFIGURATION = 0, /* .idc file *//idc文件,主要用于触摸屏配置
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_LAYOUT = 1, /* .kl file *//主要用于键盘的扫描码和keycode的转化
INPUT_DEVICE_CONFIGURATION_FILE_TYPE_KEY_CHARACTER_MAP = 2, /* .kcm file *///.kcm"文件意为按键字符映射文件,作用是将 Android按键代码与修饰符的组合映射到 Unicode字符
1.2.2 虚拟键盘的id
enum {
VIRTUAL_KEYBOARD_ID = -1,// 始终存在的特殊虚拟键盘的设备id
BUILT_IN_KEYBOARD_ID = 0,//内置键盘的设备id(如果有)。
};
1.2.3 添加删除等事件的标志
// 添加或删除设备时生成的合成原始事件类型代码。
enum {
// 添加设备时发送。
DEVICE_ADDED = 0x10000000,
// 删除设备时发送。
DEVICE_REMOVED = 0x20000000,
//当报告了最近扫描中添加/删除的所有设备时发送
//此事件始终至少发送一次。
FINISHED_DEVICE_SCAN = 0x30000000,
FIRST_SYNTHETIC_EVENT = DEVICE_ADDED,
};
1.2.4 输入设备class标志
/*
* Input device classes.
*/
enum {
/* 输入设备是键盘或有按钮 */
INPUT_DEVICE_CLASS_KEYBOARD = 0x00000001,
/* 输入设备是字母数字键盘(不仅仅是拨号盘). */
INPUT_DEVICE_CLASS_ALPHAKEY = 0x00000002,
/* 输入设备是触摸屏或触摸板(单触或多触). */
INPUT_DEVICE_CLASS_TOUCH = 0x00000004,
/* 输入设备是光标设备,如轨迹球或鼠标. */
INPUT_DEVICE_CLASS_CURSOR = 0x00000008,
/* 输入设备为多点触摸屏. */
INPUT_DEVICE_CLASS_TOUCH_MT = 0x00000010,
/* 输入设备是一个方向键盘(表示键盘,具有DPAD键). */
INPUT_DEVICE_CLASS_DPAD = 0x00000020,
/* 输入设备是一个游戏板(意味着键盘有按钮键). */
INPUT_DEVICE_CLASS_GAMEPAD = 0x00000040,
/* 输入设备有开关. */
INPUT_DEVICE_CLASS_SWITCH = 0x00000080,
/* 输入设备是一个操纵杆(意味着游戏板具有操纵杆绝对轴). */
INPUT_DEVICE_CLASS_JOYSTICK = 0x00000100,
/* 输入设备有一个可控震源(支持力反馈). */
INPUT_DEVICE_CLASS_VIBRATOR = 0x00000200,
/* 输入设备有麦克风. */
INPUT_DEVICE_CLASS_MIC = 0x00000400,
/* 输入设备是一个外部手写笔. */
INPUT_DEVICE_CLASS_EXTERNAL_STYLUS = 0x00000800,
/* 输入设备有一个滚轮式设备*/
INPUT_DEVICE_CLASS_ROTARY_ENCODER = 0x00001000,
/* 输入设备是虚拟的(不是真实的设备)*/
INPUT_DEVICE_CLASS_VIRTUAL = 0x40000000,
/* 输入设备为外部,非内置. */
INPUT_DEVICE_CLASS_EXTERNAL = 0x80000000,
/* 输入设备是第三方设备1。. */
INPUT_DEVICE_CLASS_TERTIARY1 = 0x20000000,
/* 输入设备是第三方设备2 */
INPUT_DEVICE_CLASS_TERTIARY2 = 0x10000000,
};
1.2.5 多点触摸
#define ABS_MT_SLOT 0x2f /* MT slot being modified */
#define ABS_MT_TOUCH_MAJOR 0x30 /*触摸椭圆的长轴 */
#define ABS_MT_TOUCH_MINOR 0x31 /* touching椭圆的短轴(如果是圆形,则省略) */
#define ABS_MT_WIDTH_MAJOR 0x32 /* approaching椭圆的长轴 */
#define ABS_MT_WIDTH_MINOR 0x33 /* approaching椭圆的短轴(如果是圆形,则省略) */
#define ABS_MT_ORIENTATION 0x34 /* 椭圆方向 */
#define ABS_MT_POSITION_X 0x35 /* 椭圆中心X位置 */
#define ABS_MT_POSITION_Y 0x36 /* 椭圆中心Y位置 */
#define ABS_MT_TOOL_TYPE 0x37 /* 触摸设备类型 */
#define ABS_MT_BLOB_ID 0x38 /* 将一组数据包 as a blob */
#define ABS_MT_TRACKING_ID 0x39 /* 最初触摸的唯一ID */
#define ABS_MT_PRESSURE 0x3a /* 触摸区域的压力 */
#define ABS_MT_DISTANCE 0x3b /* Contact hover distance,接触悬停距离 */
2.InputReader.h
2.1 结构体
2.1.1 KeyDown
struct KeyDown {
int32_t keyCode;//按键code
int32_t scanCode;//扫描玛
};
2.1.2 InputReaderConfiguration
struct InputReaderConfiguration {
// 描述已发生的changes
enum {
// The pointer 速度改变
CHANGE_POINTER_SPEED = 1 << 0,
// The pointer 手势控制已改变.
CHANGE_POINTER_GESTURE_ENABLEMENT = 1 << 1,
// 显示大小或方向已改变
CHANGE_DISPLAY_INFO = 1 << 2,
// 可见触摸选项已改变
CHANGE_SHOW_TOUCHES = 1 << 3,
// 键盘布局必须重新加载
CHANGE_KEYBOARD_LAYOUTS = 1 << 4,
// 对于某些设备,由提供的设备名称别名可能已更改。
CHANGE_DEVICE_ALIAS = 1 << 5,
//位置校准矩阵已更改
CHANGE_TOUCH_AFFINE_TRANSFORMATION = 1 << 6,
// 外部手写笔的存在已更改
CHANGE_EXTERNAL_STYLUS_PRESENCE = 1 << 7,
// The pointer获取模式已更改
CHANGE_POINTER_CAPTURE = 1 << 8,
// 禁用的输入设备(disabledDevices)已更改。
CHANGE_ENABLED_STATE = 1 << 9,
// 所有设备必须重新打开
CHANGE_MUST_REOPEN = 1 << 31,
};
//获取触摸屏幕后禁用虚拟键的时间量,以过滤由于在屏幕边缘附近滑动手势或轻击而导致的意外虚拟键按下。可以为0以禁用该功能。
//比如:触摸了手机返回键边缘的屏幕
nsecs_t virtualKeyQuietTime;
// 平台的排除设备名称。将忽略具有这些名称的设备。
Vector<String8> excludedDeviceNames;
// 鼠标指针移动的速度控制参数。
VelocityControlParameters pointerVelocityControlParameters;
// 鼠标滚轮移动的速度控制参数。
VelocityControlParameters wheelVelocityControlParameters;
//如果启用了pointer手势,则为True。
bool pointerGesturesEnabled;
// 某些pointer手势转换之间的安静时间。
//在开始新手势之前,允许所有手指或按钮安置到稳定状态的时间。
nsecs_t pointerGestureQuietInterval;
//在拖动过程中,指针必须移动的最小速度,以便我们考虑将活动触摸指针切换到它。
//设置此阈值是为了避免由于手指放在触摸板上(可能只是按下它)产生的干扰信息而切换。
float pointerGestureDragMinSwitchSpeed; // in pixels per second
//轻触手势延迟时间。
//下降和上升之间的时间必须小于此值,才能视为轻敲。
nsecs_t pointerGestureTapInterval;
//点击拖动手势延迟时间。
//上一次点击抬起和下一次点击按下之间的时间必须小于此时间,才能被视为拖曳。否则,上一次点击结束,新的点击开始。
//请注意,上一次敲击将在整个持续时间内按住,因此此间隔必须短于长按超时。
nsecs_t pointerGestureTapDragInterval;
// 允许指针从初始位置向下移动到上的距离(以像素为单位),仍然称为轻敲。
float pointerGestureTapSlop; // in pixels
// 第一个触摸点按下到初始质心上的时间。
//这是为了有足够的时间来处理用户几乎同时但不完全同时放下两根手指的情况。
nsecs_t pointerGestureMultitouchSettleInterval;
// 当至少有两个指针从起始位置移动了至少这么远时,就会从PRESS(按压)模式转换到SWIPE(划动)或FREEFORM(自由)手势模式。
float pointerGestureMultitouchMinDistance; // in pixels
// 只有当两个矢量之间的角度余弦大于或等于该值时,才能从PRESS(按压)姿势模式转换为SWIPE(滑动)姿势模式,这表明矢量方向相同。
float pointerGestureSwipeTransitionAngleCosine;
// 只有当手指相对于触摸板的对角线尺寸不超过这个距离时,才能从按压手势模式转换为滑动手势模式。
//例如,0.5的比例意味着手指之间的间隔必须不超过触摸板对角线大小的一半。
float pointerGestureSwipeMaxWidthRatio;
// 相对于显示器大小的手势移动速度。
float pointerGestureMovementSpeedRatio;
//相对于显示器大小的手势缩放速度
//当手指主要相对于彼此移动时,缩放速度适用
//以执行缩放手势或类似动作。
float pointerGestureZoomSpeedRatio;
// True可将触摸屏上的触摸位置显示为点。
bool showTouches;
// True if pointer capture is enabled.
bool pointerCapture;
// 当前禁用的设备
SortedVector<int32_t> disabledDevices;
};
2.1.3 Axis
struct Axis {
RawAbsoluteAxisInfo rawAxisInfo;
AxisInfo axisInfo;
bool explicitlyMapped; // 如果轴明确指定了轴id,则为true
float scale; // 从raw 到标准化的比例值
float offset; // 缩放标准化后要添加的偏移量
float highScale; // high split的从raw 到标准化的比例值
float highOffset; // high split的缩放标准化后要添加的偏移量
float min; // 标准化范围的最小值
float max; // 标准化范围的最大值
float flat; // 标准化平面区域大小
float fuzz; // 标准化的容错范围
float resolution; // 标准化精度(单位/mm)
float filter; // filter out small variations of this size
float currentValue; //
float newValue; // most recent value
float highCurrentValue; //high split的当前值
float highNewValue; // high split的most recent value
void initialize(const RawAbsoluteAxisInfo& rawAxisInfo, const AxisInfo& axisInfo,
bool explicitlyMapped, float scale, float offset,
float highScale, float highOffset,
float min, float max, float flat, float fuzz, float resolution) {
this->rawAxisInfo = rawAxisInfo;
this->axisInfo = axisInfo;
this->explicitlyMapped = explicitlyMapped;
this->scale = scale;
this->offset = offset;
this->highScale = highScale;
this->highOffset = highOffset;
this->min = min;
this->max = max;
this->flat = flat;
this->fuzz = fuzz;
this->resolution = resolution;
this->filter = 0;
resetValue();
}
void resetValue() {
this->currentValue = 0;
this->newValue = 0;
this->highCurrentValue = 0;
this->highNewValue = 0;
}
};
2.1.4 VelocityControlParameters
//指定移动的加速度相关的参数
struct VelocityControlParameters {
//在应用任何其他速度控制因子之前,与原始速度增量相乘的比例因子。
//应使用比例因子使输入设备分辨率(例如每英寸计数)与输

https://blog.youkuaiyun.com/handsomethefirst/article/details/138226266?spm=1001.2014.3001.5501
最低0.47元/天 解锁文章
843

被折叠的 条评论
为什么被折叠?



