首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

USB HID介绍

USB HID介绍

HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容。

USB设备描述符-概述
当插入USB设备后,主机会向设备请求各种描述符来识别设备。那什么是设备描述符呢?
Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。
描述符的作用就是通过命令操作作来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作。

USB有那些标准描述符?

USB有5种标准描述符:设备描述符 、配置描述符、字符描述符、接口描述符、端点描述符  。
描述符之间有一定的关系,一个设备只有一个设备描述符,而一个设备描述符可以包含多个配置描述符,而一个配置描述符可以包含多个接口描述符,一个接口使用了几个端点,就有几个端点描述符。由此我们可以看出,USB的描述符之间的关系是一层一层的,最上一层是设备描述符,下面是配置描述符,再下面是接口描述符,再下面是端点描述符。在获取描述符时,先获取设备描述符,然后再获取配置描述符,根据配置描述符中的配置集合长度,一次将配置描述符、接口描述符、端点描述符一起一次读回。其中可能还会有获取设备序列号,厂商字符串,产品字符串等。

设备描述符

struct _DEVICE_DEscriptOR_STRUCT
{
  BYTE   bLength;    //设备描述符的字节数大小
  BYTE   bDescriptorType;   //描述符类型编号,为0x01
  WORD  bcdUSB;   //USB版本号
  BYTE  bDeviceClass;   //USB分配的设备类代码,0x01~0xfe为标准设备类,0xff为厂商自定义类型,0x00不是在设备描述符中定义的,如HID
  BYTE   bDeviceSubClass;  //usb分配的子类代码,同上,值由USB规定和分配的,HID设备此值为0
  BYTE  bDeviceProtocl;  //USB分配的设备协议代码,同上HID设备此值为0
  BYTE   bMaxPacketSize0;  //端点0的最大包的大小
  WORD   idVendor;  //厂商编号
  WORD   idProduct;  //产品编号
  WORD  bcdDevice;  //设备出厂编号
  BYTE   iManufacturer;   //描述厂商字符串的索引
  BYTE   iProduct;   //描述产品字符串的索引
  BYTE   iSerialNumber;  //描述设备序列号字符串的索引
  BYTE   bNumConfiguration;   //可能的配置数量
}

配置描述符
struct _CONFIGURATION_DEscriptOR_STRUCT

{
  BYTE  bLength;   //配置描述符的字节数大小
  BYTE   bDescriptorType;   //描述符类型编号,为0x02
  WORD   wTotalLength;   //配置所返回的所有数量的大小
  BYTE   bNumInterface;  //此配置所支持的接口数量
  BYTE   bConfigurationVale;   //Set_Configuration命令需要的参数值
  BYTE   iConfiguration;  //描述该配置的字符串的索引值
  BYTE  bmAttribute;  //供电模式的选择
  BYTE   MaxPower;   //设备从总线提取的最大电流

}

字符描述符
struct _STRING_DEscriptOR_STRUCT

{

BYTE bLength; //字符串描述符的字节数大小
BYTE bDescriptorType; //描述符类型编号,为0x03
BYTE SomeDescriptor[36]; //UNICODE编码的字符串

}
继承事业,薪火相传
返回列表