Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15490931
  • 博文数量: 2005
  • 博客积分: 11986
  • 博客等级: 上将
  • 技术积分: 22535
  • 用 户 组: 普通用户
  • 注册时间: 2007-05-17 13:56
文章分类

全部博文(2005)

文章存档

2014年(2)

2013年(2)

2012年(16)

2011年(66)

2010年(368)

2009年(743)

2008年(491)

2007年(317)

分类:

2008-11-19 16:02:39

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]

阅读(2082) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~