zoukankan      html  css  js  c++  java
  • USB设备描述符完全解析

    //============================================================================
    // 文件名: USBDESC.C
    // 用 途: USB描述符
    // 作 者: shenfei5
    // 时 间: 2007.2.3
    // 版 本: V1.10
    //============================================================================

    #include <RTL.h>

    #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,
    };
  • 相关阅读:
    【CodeForces】[659C]Tanya and Toys
    【CodeForces】[659A]Round House
    高并发网络编程之epoll详解
    Linux写时拷贝技术(copy-on-write)
    5种服务器网络编程模型讲解
    5种服务器网络编程模型讲解
    当你输入一个网址的时候,实际会发生什么?
    error: std::ios_base::ios_base(const std::ios_base&)’是私有的
    C++和JAVA的区别
    为什么内联函数,构造函数,静态成员函数不能为virtual函数
  • 原文地址:https://www.cnblogs.com/xidongs/p/2264229.html
Copyright © 2011-2022 走看看