Chinaunix首页 | 论坛 | 博客

fx

  • 博客访问: 1370169
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3964
  • 用 户 组: 普通用户
  • 注册时间: 2013-05-02 14:36
文章分类
文章存档

2022年(2)

2019年(2)

2018年(10)

2017年(1)

2016年(50)

2015年(12)

2014年(9)

2013年(29)

分类: 嵌入式

2016-06-14 16:49:03

开发环境: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)





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