分享

USB设备描述符完全解析

 lchjczw 2012-03-27

//============================================================================

// 文件名: USBDESC.C

// 用 途: USB描述符

// 作 者: shenfei5

// 时 间: 2007.2.3

// 版 本: V1.10

//============================================================================

#include

#include "usb.h" // USB模块

#include "hid.h" // HID设备

#include "usbcfg.h" // 配置USB

#include "usbdesc.h" // USB描述符

//

// HID报文描述符

//

const U8 HID_ReportDescriptor[] = {

HID_UsagePageVendor(0x00), // 报告页版本: 0X06 0X00 0XFF

HID_Usage(0x01), // 用途页: 0X05 0X01

// 如果是MOUSE,KEY,在这里应该有用法索引

HID_Collection(HID_Application), // 用法集合开始: 0XA1 0X01

HID_UsagePage(HID_USAGE_PAGE_BUTTON), // BUTTON用法页

HID_UsageMin(1), // 用法最小值

HID_UsageMax(3), // 用法最小值

HID_LogicalMin(0), // 逻辑最小值

HID_LogicalMax(1), // 逻辑最大值

HID_ReportCount(3), // 报告计数(3)

HID_ReportSize(1), // 报告页大小 (1)

HID_Input(HID_Data | HID_Variable | HID_Absolute), // 输入 (2)

HID_ReportCount(1), // 报告计数值

HID_ReportSize(5), // 报告大小

HID_Input(HID_Constant), // 输入 1

HID_UsagePage(HID_USAGE_PAGE_LED), // LED用法页

HID_Usage(HID_USAGE_LED_GENERIC_INDICATOR), // 用法页

HID_LogicalMin(0), // 用法最小值

HID_LogicalMax(1), // 用法最大值

HID_ReportCount(8), // 报告计数值

HID_ReportSize(1), // 报告大小 (1)

HID_Output(HID_Data | HID_Variable | HID_Absolute), // 输出 (2)

HID_EndCollection, // 报告结束

};

// HID报告描述符大小

const U16 HID_ReportDescSize = sizeof(HID_ReportDescriptor);

//

// USB 设备描述符

//

const U8 USB_DeviceDescriptor[] = {

USB_DEVICE_DESC_SIZE, // bLength 描述符长度 = 12H

USB_DEVICE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 1H

WBVAL(0x0110), // 1.10 // bcdUSB 设备版本号 = 你发行的版本的号

0x00, // bDeviceClass 类型代码 = 由USB指定

0x00, // bDeviceSubClass 子类型代码 = 由USB分配

0x00, // bDeviceProtocol 协议代码 = 由USB分配

USB_MAX_PACKET0, // bMaxPacketSize0 端点0的容量 = 64(只能是 8,16,32,64)

WBVAL(0x1977), // idVendor 供应商ID(同USB协会分配,我就自己分配一份)

WBVAL(0X1006), // idProduct 产品ID(由厂商分配)

WBVAL(0x0100), // 1.00 // bcdDevice ( 设备出厂编号 )

0x04, // iManufacturer ( 厂商描述字符串索引, 用来在字符串索引中查找字符串 )

0x20, // iProduct ( 产品描述字符串索引, 用来在字符串索引中查找字符串 )

0x42, // iSerialNumber  ( 设备序列号描述字符串索引, 用来在字符串索引中查找字符串 )

0x01 // bNumConfigurations ( 配置字符串的个数 )

};

//

// USB 描述符集

// 所有描述符 (配置描述符, 接口描述符, 端点描述符, USB类描述符, 设备描述符

//

const U8 USB_ConfigDescriptor[] = {

// 配置描述符

USB_CONFIGUARTION_DESC_SIZE, // bLength 描述符长度 = 9H

USB_CONFIGURATION_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 2H

WBVAL( // wTotalLength

USB_CONFIGUARTION_DESC_SIZE + // 返回描述符串集的长度, 配置描述字符长度

USB_INTERFACE_DESC_SIZE + // 接口描述字符长度

HID_DESC_SIZE + // HID描述字符长度

USB_ENDPOINT_DESC_SIZE // 端点描述字符长度

),

0x01, // bNumInterfaces

// 支持接口数

0x01, // bConfigurationValue

// 配置值

0x00, // iConfiguration

// 配置字符串描述索相

// 0: 不使用

// 如果使用,必须在字符串描述符中添加相应的字符串.

USB_CONFIG_BUS_POWERED | // bmAttributes 设置的供电特性

USB_CONFIG_REMOTE_WAKEUP, // 总线供电

// 有唤醒功能

USB_CONFIG_POWER_MA(100), // bMaxPower 设备从供电总线吸取的电流值

//// 当前配置为 100MA 

// 接口类描述符

// 接口 0 ,位置 0 , HID类

// Interface 0, Alternate Setting 0, HID Class

USB_INTERFACE_DESC_SIZE, // bLength 描述符长度 = 9H

USB_INTERFACE_DESCRIPTOR_TYPE, // bDescriptorType 描述符类型 = 4H

0x00, // bInterfaceNumber ( 接口编号 )

0x00, // bAlternateSetting ( 可代替位置 )

0x01, // bNumEndpoints 使用端点(不含端点0)

USB_DEVICE_CLASS_HUMAN_INTERFACE, // bInterfaceClass

// USB 类

// USB_DEVICE_CLASS_HUMAN_INTERFACE == 3

// HID类

HID_SUBCLASS_NONE, // bInterfaceSubClass

// 子类,没有.

HID_PROTOCOL_NONE, // bInterfaceProtocol

// 协议代码

0x5C, // iInterface

// 字符串描述符索引,要使用该字符串必须在字符串描述符里添加相应的字符串

// HID类描述符

// HID_DESC_OFFSET = 0x0012

// HID类描述符的偏移量

HID_DESC_SIZE, // bLength 描述符长度 =

HID_HID_DESCRIPTOR_TYPE, // bDescriptorType HID描述符类型 = 21H

WBVAL(0x0100), // 1.00 // bcdHID HID版本号

0x00, // bCountryCode 国家代码

0x01, // bNumDescriptors 支持其它类描述符个数

HID_REPORT_DESCRIPTOR_TYPE, // bDescriptorType 从属类描述类型 = 报告描述符22H

WBVAL(HID_REPORT_DESC_SIZE), // wDescriptorLength 从属类描述的长度

// Endpoint, HID Interrupt In

// HID 端点描述描,端点1输入

USB_ENDPOINT_DESC_SIZE, // bLength 端点描述符长度

USB_ENDPOINT_DESCRIPTOR_TYPE, // bDescriptorType 端点描述符类型 = 5H

USB_ENDPOINT_IN(1), // bEndpointAddress 逻辑端点号 BIT.7 = DIR

// BIT.0..3 端点号

// 这个值是用来把逻辑端点号换成物理端点号

USB_ENDPOINT_TYPE_INTERRUPT, // bmAttributes 端点属性 = 中断

WBVAL(0x0004), // wMaxPacketSize 端点容量

10, // 10ms // bInterval

// 传输间隔时间.只对中断端点有效

// Terminator

0 // bLength

// 结果码.

};

//

// USB 字符串描述符 (可选)

// 字符描述符结构:

// {

// 字符串描述符 1 大小

// 描述符类型 = 字符串描述符(0X03)

// 描述符内容.

// ... ...

// 字符串描述符n 1 大小

// 描述符类型n = 字符串描述符(0X03)

// 描述符内容n.

// }

//

const U8 USB_StringDescriptor[] = {

// 字符串索引: 0x00:

// 字符串用途: 语言代码

0x04, // 描述符长度 bLength

USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)

//WBVAL(0x0409), // 使用 English 语言// 描述符内容 wLANGID

WBVAL(0x0804), // 试一下中文的行不行,改了之后,在硬件属性里看不到,在客户端可以看到,不明原因.

// 字符串索引: 0x04:

// 字符串用途: 生产产商字符描述符

0x1C, // 描述符长度 bLength

USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)

0xc1,0,

0xd6,0,

0xca,0,

0xa4,0,

0xb7,0,

0xe1,0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

// 字符串索引: 0x20

// 字符串用途: 产品名称

0x22, // 描述符长度 bLength

USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)

0xc1,0,

0xd6,0,

0xca,0,

0xa4,0,

0xb7,0,

0xe1,0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

' ',0,

'H',0,

'I',0,

'D',0,

// 字符串索引: 0x42

// 字符串用途: 产品系列号

0x1A, // 描述符长度 bLength

USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)

'T',0,

'E',0,

'S',0,

'T',0,

'0',0,

'0',0,

'0',0,

'0',0,

'0',0,

'0',0,

'0',0,

'0',0,

// 字符串索引号 0x5C

// 接口 Interface 0, 位置 Alternate Setting 0

0x08, // 描述符长度 bLength

USB_STRING_DESCRIPTOR_TYPE, // bDescriptorType,描述符类型:3(字符串描述符)

'H',0,

'I',0,

'D',0,

};

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多