鼠标与触摸屏格式说明
USB 鼠标数据格式
USB 鼠标数据格式由 USB HID 协议定义,该协议定义鼠标数据包含 4 个字节,其格式如下表所示。
字节 | 说明 |
---|---|
字节1 | bit7 为1时,表示Y坐标的变化量超出-256~255的范围;为0时,表示没有超出。 bit6 为1时,表示X坐标的变化量超出-256~255的范围;为0时,表示没有超出。 bit5 Y坐标变化的符号位,1表示鼠标向下移动,0表示鼠标向上移动。 bit4 X坐标变化的符号位,1表示鼠标向左移动,0表示鼠标向右移动。 bit3 固定为1。 bit2 置1时表示中键被按下。 bit1 置1时表示右键被按下。 bit0 置1时表示左键被按下。 |
字节2 | X坐标变化量,与字节1的bit4组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量。 |
字节3 | Y坐标变化量,与字节1的bit5组成9位符号数,负数表示向左移,正数表右移。用补码表示变化量。 |
字节4 | 滚轮变化量,0x01表示滚轮向前滚动一格;0xFF表示滚轮向后滚动一格;0x80为中间值,不滚动。 |
触摸屏数据格式
触摸屏一般提供了可以读取坐标数值的寄存器,驱动读取坐标值后一般会参照鼠标数据将触摸坐标数据提交至上层(系统中间层或应用程序)。提交时,触摸按下事件设定为鼠标左键按下事件、触摸抬起事件设定为鼠标左键抬起事件。
鼠标与触摸屏事件结构体定义
鼠标和触摸屏驱动使用的事件结构体位于“libsylixos/SylixOS/system/device/input”下,input 设备驱动应按照如下的 mouse_event_notify 结构向系统提交一个事件:
typedef struct mouse_event_notify {
int32_t ctype;
int32_t kstat;
int32_t wscroll[MOUSE_MAX_WHEEL];
int32_t xmovement;
int32_t ymovement;
/*
* if use absolutely coordinate (such as touch screen)
* if you use touch screen:
* (kstat & MOUSE_LEFT) != 0 (press)
* (kstat & MOUSE_LEFT) == 0 (release)
*/
#define xanalog xmovement
#define yanalog ymovement
} mouse_event_notify;
- ctype:表示坐标类型,分为相对坐标和绝对坐标,一般鼠标使用相对坐标,触摸屏使用绝对坐标,坐标类型的定义如下表所示。
状态位名称 | 含义 |
---|---|
MOUSE_CTYPE_REL | 相对坐标 |
MOUSE_CTYPE_ABS | 绝对坐标 |
- kstat:表示按键状态,按键包括如下表所示 8 种类型。对于触摸屏用“左键”表示手指按下或松开;第 4 键 ~ 第 8 键是用于满足特殊的鼠标,如游戏鼠标。每一个按键状态用一个数据位表示,0 表示弹起,1 表示按下。
状态位名称 | 含义 |
---|---|
MOUSE_LEFT | 左键 |
MOUSE_RIGHT | 右键 |
MOUSE_MIDDLE | 中键 |
MOUSE_BUTTON4~MOUSE_BUTTON8 | 额外的 5 个预定义按键 |
- wscroll:表示滚轮变化值。
- xmovement:表示 X 相对偏移。
- ymovement:表示 Y 相对偏移。
- 当为绝对坐标时,系统建议程序使用 xanalog 和 yanalog(虽然目前其与 xmovement 和 ymovement 是同一个成员变量),以使程序更加直观易读。