基于STM32F103的USB学习笔记5 - 设备描述符

72 篇文章 36 订阅

以例程JoyStickMouse为例说明USB描述符。JoyStickMouse是一个USB HID设备。

USB设备只会有一个设备描述符,是设备连接到总线上时USB主机所读取的第一个描述符。

const uint8_t usbDeviceDescriptor[18] =
{
    0x12,                       /*bLength */
    USB_DEVICE_DESCRIPTOR_TYPE, /*bDescriptorType*/
    0x00,                       /*bcdUSB */
    0x02,
    0x00,                       /*bDeviceClass*/
    0x00,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    0x40,                       /*bMaxPacketSize 64*/
    0x83,                       /*idVendor (0x0483)*/
    0x04,
    0x10,                       /*idProduct = 0x5710*/
    0x57,
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    1,                          /*iVendor: Index of string descriptor describing manufacturer */
    2,                          /*iProduct: Index of string descriptor describing product*/
    3,                          /*iSerialNum: Index of string descriptor describing the device serial number */
    0x01                        /*bNumConfigurations*/
};

a) bLength: 描述符的长度,设备描述符固定长度为18个字节。

b) bDescriptorType: 描述符的类型,设备描述符固定是0x01。

c) bcdUSB: 设备符合的USB标准版本,2字节长。bcdUSB字段的值为0xJJMN版本JJ.M.N(JJ  - 主要版本号,M  - 次要版本号,N  - 次要版本。这里的值是0x0200,表示符合的USB标准为v2.00。

d) bDeviceClass: 设备符合的USB的Class类型。如果是0,表示这个设备的各个接口有自己符合的Class类型;如果是1到0xfe,表示各个接口共同的类定义;如果是0xff,表示自定义类。

e) bDeviceSubClass: 设备符合的USB的SubClass类型,和bDeviceClass有关,如果BDeviceClass为0xff,这个值就无意义。

f) bDeviceProtocol: 使用的协议。这个值也是和bDeviceClass、bDeviceSubClass相关,如果是0x00, 表示这个设备不支持Class相关的协议;如果是0xff,表示自定义协议。

d) bMaxPacketSize: 端点0的最大包大小(仅8,16,32,64为合法值)

e) idVendor: 厂商标志ID(由USB-IF组织分配),2个字节

f) idProduct: 产品标志ID(由厂商分配),2个字节

g) bcdDevice: 设备版本号,2个字节

h) iVendor: 描述厂商信息的字符串描述符的索引值

i) iProduct: 描述产品信息的字串描述符的索引值

j) iSerialNum:描述设备序列号信息的字串描述符的索引值

k) bNumConfigurations: 配置描述符个数

在前面的结构Device_Property有一个函数usbClassGetDeviceDescriptor就是usb库中获取设备描述符。

ONE_DESCRIPTOR stUsbDeviceDescriptor =
{
    (uint8_t*)usbDeviceDescriptor,
    USB_DEVICE_DESCRIPTOR_LEN
};

uint8_t *usbClassGetDeviceDescriptor(uint16_t Length)
{
    return Standard_GetDescriptorData(Length, &stUsbDeviceDescriptor);
}

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值