Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6384115
  • 博文数量: 579
  • 博客积分: 1548
  • 博客等级: 上尉
  • 技术积分: 16634
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-12 15:29
个人简介

http://www.csdn.net/ http://www.arm.com/zh/ https://www.kernel.org/ http://www.linuxpk.com/ http://www.51develop.net/ http://linux.chinaitlab.com/ http://www.embeddedlinux.org.cn http://bbs.pediy.com/

文章分类

全部博文(579)

文章存档

2018年(18)

2015年(91)

2014年(159)

2013年(231)

2012年(80)

分类: 嵌入式

2013-11-05 20:14:59

开发环境:win7
开发板    :51单片机 + pdiusbd12 芯片

前言:
    HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,
例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。
另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID设备。
    所有的HID传输都是使用默认控制管道或是一个中断管道,HID设备必须有一个中断
输入端点来传送数据到主机,中断输出端点则不是必需的。
    
    

1,HID设备描述符
HID设备除了支持USB设备的5种标准描述符之外,还支持HID设备特有的3种描述符。这些描述符是:
    a) USB标准描述符:设备、配置、接口、端点和字符串描述符。
    b) HID特有的描述符:HID、报表(Report)和实体(Physical)描述符。
    

从描述符的关联关系看,HID描述符是关联于接口。所以如果一个HID设备有2个端点,设备不需要每个端点有一个HID描述符。
    

HID描述符的主要作用是用来识别HID通信所使用的额外描述符。下表是HID描述符结构。
    
    

bcdHID:设备与其描述符所遵循的HID规范的版本号码,此数值是4个16进位的BCD格式字符。例如版本1.1的bcdHID是0110h。
bCountryCode:硬件目的国家的识别码。如果不说明,该字段为0。
    
    
点击(此处)折叠或打开
  1. typedef struct _hid_sub_descriptor
  2. {
  3.     uint8_t        bDescriptorType;     // hid附属描述符类型
  4.     uint16_t    wDescriptorLength;     // 该描述符的总长度
  5. }hid_sub_descriptor_t;

  6. #define    HID_SUB_DESCRIPTOR_MAX        1    // hid附属描述符的个数

  7. typedef struct _hid_descriptor
  8. {
  9.     uint8_t        bLength;            // HID描述符字节数大小        
  10.     uint8_t        bDescriptorType;     // HID描述符类型编号
  11.     uint16_t    bcdHID;                // HID规范版本号(BCD码表示)
  12.     uint8_t        bCountryCode;         // 硬件设备所在的国家的国家编号
  13.     uint8_t        bNumDescriptors;    // hid附属描述符的数目(至少有一个report 描述符)
  14.     hid_sub_descriptor_t hidSubDescriptors[HID_SUB_DESCRIPTOR_MAX];
  15. }hid_descriptor_t;

点击(此处)折叠或打开

  1. set->hid.bLength         = sizeof(hid_descriptor_t); //HID描述符的字节数大小
  2.         set->hid.bDescriptorType     = DESC_TYPE_HID;             //HID描述符类型编号
  3.         set->hid.bcdHID                 = SWAP16(0x0110);             //HID类协议版本号,为1.1
  4.         set->hid.bCountryCode         = 0x21;                      //固件的国家地区代号,0x21为美国
  5.         set->hid.bNumDescriptors     = HID_SUB_DESCRIPTOR_MAX;    //下级描述符的数量

  6.         set->hid.hidSubDescriptors[0].bDescriptorType    = DESC_TYPE_REPORT;             //下级描述符为报告描述符
  7.         set->hid.hidSubDescriptors[0].wDescriptorLength    = SWAP16(sizeof(MouseReportDescriptor)); //下级描述符的长度



2,interface 描述符中实现指定HID设备

点击(此处)折叠或打开

  1. interface->bLength        = sizeof(interface_descriptor_t);    //接口描述符的字节数大小
  2.     interface->bDescriptorType    = DESC_TYPE_INTERFACE; //接口描述符类型编号
  3.     interface->bInterfaceNumber = 0x00; //接口编号为0
  4.     interface->bAltenateSetting = 0x00; //该接口描述符的编号
  5.     interface->bNumEndpoints     = ENDPOINT_MAX; //非0端点数量为2,只使用端点主端点输入和输出
  6.      interface->bInterfaceClass     = 0x03; //人机接口设备(HID)类
  7.     interface->bInterfaceSubClass    = 0x01;     //使用的子类:支持BIOS根启动Boot的子类
  8.     interface->bInterfaceProtocol     = 0x02;     //使用的协议:鼠标
  9.      interface->iInterface            = 0x00; //接口描述符字符串索引
        bInterfaceSubClass:
    

        bInterfaceProtocol:
    




3,HID设备的报告描述符的实现
     详情请看:   usb鼠标_HID报告描述符的实现(11)





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

andyhzw2013-11-13 19:32:34

gnsusn:HID 的报告描述符能解析一下吗?研究好久了,没明白。

谢谢

HID的报告描述的详细内容,
请看:usb鼠标_HID报告描述符的实现(11) 
http://blog.chinaunix.net/uid-28458801-id-3988965.html

回复 | 举报

gnsusn2013-11-13 17:45:00

HID 的报告描述符能解析一下吗?研究好久了,没明白。

谢谢