usb hid报告描述符脚本实例解读
static const char keyboard_report_descriptor[] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x06, // USAGE (Keyboard)
0xa1, 0x01, // COLLECTION (Application) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0xe0, // USAGE_MINIMUM (Keyboard LeftControl) 0x29, 0xe7, // USAGE_MAXIMUM (Keyboard Right GUI) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x75, 0x01, // REPORT_SIZE (1) 0x95, 0x08, // REPORT_COUNT (8) 0x81, 0x02, // INPUT (Data,Var,Abs) //根据上面的属性,申请一段INPUT变量内存空间 //1.组织的第1个从arm到pc的IN数据格式,所以in到pc的第1个字节的bit0~bit8分别对应:左left,左ctrl,左shift,左alt等.
0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x08, // REPORT_SIZE (8) 0x81, 0x03, // INPUT (Cnst,Var,Abs) //根据上面的属性,申请一段INPUT常值内存空间 //2.组织的第2个从arm到pc的IN数据格式,in到pc的第2个字节,这8个bits是保留值,必须填充0值
0x95, 0x05, // REPORT_COUNT (5) 0x75, 0x01, // REPORT_SIZE (1) 0x05, 0x08, // USAGE_PAGE (LEDs) 0x19, 0x01, // USAGE_MINIMUM (Num Lock) 0x29, 0x05, // USAGE_MAXIMUM (Kana) 0x91, 0x02, // OUTPUT (Data,Var,Abs) //根据上面的属性,申请一段OUTPUT变量内存空间 //1.组织的第1个从pc到arm的OUT数据格式
0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x03, // REPORT_SIZE (3) 0x91, 0x03, // OUTPUT (Cnst,Var,Abs) //根据上面的属性,申请一段OUTPUT常值内存空间,填0,补齐为1字节8bits //2.组织的第2个从pc到arm的OUT数据格式
0x95, 0x06, // REPORT_COUNT (6) 0x75, 0x08, // REPORT_SIZE (8) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0xFF, // LOGICAL_MAXIMUM (255) 0x05, 0x07, // USAGE_PAGE (Keyboard) 0x19, 0x00, // USAGE_MINIMUM (Reserved (no event indicated)) 0x29, 0x65, // USAGE_MAXIMUM (Keyboard Application) 0x81, 0x00, // INPUT (Data,Ary,Abs) //根据上面的属性,申请一段INPUT变量内存空间 //3.组织的第3个从arm到pc的IN数据格式,所以in到pc的第3~8个字节为key键值,一次可以同时上传6个不同key值,如果没有按键那么 // 其他字节应该强制清0[luther.gliethttp]
0xc0 // END_COLLECTION };
static const char mouse_report_descriptor[] = { 0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x02, // USAGE (Mouse)
0xa1, 0x01, // COLLECTION (Application) 0x09, 0x01, // USAGE (Pointer) 0xa1, 0x00, // COLLECTION (Physical) 0x05, 0x09, // USAGE_PAGE (Button) 0x19, 0x01, // USAGE_MINIMUM (Button 1) 0x29, 0x03, // USAGE_MAXIMUM (Button 3) 0x15, 0x00, // LOGICAL_MINIMUM (0) 0x25, 0x01, // LOGICAL_MAXIMUM (1) 0x95, 0x03, // REPORT_COUNT (3) 0x75, 0x01, // REPORT_SIZE (1) 0x81, 0x02, // INPUT (Data,Var,Abs) //根据上面的属性,申请一段INPUT变量内存空间 //1.组织的第1个从arm到pc的IN数据格式,所以in到pc的第1个字节的bit0~bit2分别对应:鼠标左击,鼠标右击和鼠标中键,置位表示相应键按下.
0x95, 0x01, // REPORT_COUNT (1) 0x75, 0x05, // REPORT_SIZE (5) 0x81, 0x03, // INPUT (Cnst,Var,Abs) //根据上面的属性,申请一段INPUT常值内存空间,填0:补齐8bits为1字节
0x05, 0x01, // USAGE_PAGE (Generic Desktop) 0x09, 0x30, // USAGE (X) 0x09, 0x31, // USAGE (Y) 0x09, 0x38, // USAGE (Wheel) 0x15, 0x81, // LOGICAL_MINIMUM (-127) 0x25, 0x7f, // LOGICAL_MAXIMUM (127) 0x75, 0x08, // REPORT_SIZE (8) 0x95, 0x03, // REPORT_COUNT (3) 0x81, 0x06, // INPUT (Data,Var,Rel) //根据上面的属性,申请一段INPUT变量内存空间 //2.组织的第2个从arm到pc的IN数据格式,所以in到pc的第2~4字节分别对应:X,Y和Wheel数值,1表示正向移动,-1表示负向移动 //因为显示器的左上角为坐标原点(0,0),水平向右为x轴正方向,垂直向下为y轴正方向.对于滚轮,1上滚动,-1下滚动[luther.gliethttp]
0xc0, // END_COLLECTION 0xc0 // END_COLLECTION };
一 般我们将endpoint2的作为鼠标和键盘专用的in管道端点,配置为interrupt类型,并设置一个由pc下发IN令牌读取该endpoint2 的时间间隔,以ms为单位,比如设置为10ms,那么pc将以10ms为周期,周期性的下发IN事物,来周期性的轮询读取鼠标和键盘数据信息 [luther.gliethttp]
|
文章评论(0条评论)
登录后参与讨论