《使枚举成功的USB设备成为WINUSB设备》

** 更新声明:各位不好意思,这篇文章是我本科期间所作,而且我已经很久没有涉足过硬件了,文中可能会有遗漏或者错误,并且很多关于USB的细节我已经忘记。

1. 将设备枚举为WINUSB设备

1.1 使设备能获取字符串描述符

1. 确保devicedescriptor中字符串index不为0。这里的Index应该是指iManufacturer, iProduct和iSerialNumber这三项,若设置为0则Host不会发送获取字符串的命令。

uint8_tUSBDeviceDesc[USB_LEN_DEV_DESC] =

{

0x12,                       /*bLength: 18bit*/

USB_DESC_TYPE_DEVICE,       /*bDescriptorType: 0x02*/

0x00,                       /*bcdUSB */

0x02,

0x00,                       /*bDeviceClass*/

0x00,                       /*bDeviceSubClass*/

0x00,                       /*bDeviceProtocol*/

USB_MAX_EP0_SIZE,          /*bMaxPacketSize: 64bit*/

0x37,          /*低位idVendor*/

0x05,          /*高位idVendor*/

0x21,          /*低位idVendor*/

0x43,          /*高位idVendor*/

0x00,                       /*bcdDevice rel. 2.00*/

0x02,

USBD_IDX_MFC_STR,           /*Index of manufacturer  string USBD_IDX_MFC_STR*/

USBD_IDX_PRODUCT_STR,       /*Index of product stringUSBD_IDX_PRODUCT_STR*/

USBD_IDX_SERIAL_STR,        /*Index of serial number stringUSBD_IDX_SERIAL_STR*/

USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations    固定为1,因为只有一个配置描述符*/

};

其中:

#define  USBD_IDX_MFC_STR                       0x01

#define  USBD_IDX_PRODUCT_STR                                           0x02

#define  USBD_IDX_SERIAL_STR                     0x03

2. 根据索引值发送字符串描述符

1. 判断获取的标准命令wValue字段部分低8位。

2. 发送字符串描述符。其格式如下表:

其中bLength=字符串描述符的长度为原字符串长度*2+2,bDescriptorType固定为0x03,bString中的内容是unicode编码(就是在ASCII码前面加上0x00即可)。

例如:若想要的字符串为"LSQ",那么其字符串描述符应为:

Uint8_tUSBManufactoryString[USB_LEN_MAU_STRING]=

{

USB_LEN_MAU_STRING,         // 这里是0x08

0x03,

0x4C,                                             //L

0x00,

0x53,                                              //S

0x00,

0x51,                                              //Q

0x00

}

1.2 处理获取操作系统字符串描述符的标准命令

当上文提到的字符串描述符正确上传到主机上时(可以用USB monitor)检测到。此时Host会发送获取操作系统字符串描述符(OS String Descriptor)。它包含OS string descriptor和OS feature descriptors。此时按照下文所述步骤操作:

1、主机发送要求获取索引值为0XEE的字符串(即OSString Descriptor)的命令。其标准请求命令格式为:

bmRequestType

bRequest

wValue

wIndex

wLength

Data

1000 0000B

GET_DESCRIPTOR

0x03EE

0x0000

0x12

Returned String

其中:GET_DESCRIPTOR为0x03。

2、设备发送OS StringDescriptor。

OS String Descriptor格式如下表。例如:

Field

Length (Bytes)

Value

Description

bLength

1

0x12

Length of the descriptor

bDescriptorType

1

0x03

Descriptor type

qwSignature

14

‘MSFT100’

Signature field

bMS_VendorCode

1

Vendor-specific

Vendor code

bPad

1

0x00

Pad field

其中:

1. 1.0版本的OS StringDescriptor的qwSignature字段必须设为‘MSFT100’(0x4D00 0x5300 0x4600 0x5400 0x3100 0x3000 0x3000)。

2. bMS_VendorCode字段是自定义数字。

例如:

uint8_tUSBD_OS_StringDesc[USB_LEN_OS_STRING_DESC]=

{

USB_LEN_OS_STRING_DESC, // 0X12

USB_DESC_TYPE_DEVICE,      // 0X03

0x4D,                                             // M

0x00,

0x53,                                              // S

0x00,

0x46,                                              // F

0x00,

0x54,                                              // T

0x00,

0x31,                                              // 1

0x00,

0x30,                                              // 0

0x00,

0x30,                                              // 0

0x00,

0x01,                                              // 自定义数字即可

0x00

};

3. Host发送要求获取OS FeatureDescriptor的标准命令请求,SETUP包内容为:

bmRequestType

bRequest

wValue

wIndex

wLength

Data

1100 0000B

GET_MS_DESCRIPTOR

Interface

Feature Index

Length

Returned Descriptor

 其中:GET_MS_DESCRIPTOR为OS String Descriptor中的bMS_VendorCode字段。

4. 设备发送OS FeatureDescriptor。

1.OS Feature Descriptor格式为如下表:

OS FeatureDescriptor包含两个部分:

Part i. Header Section

Offset

Field

Size

(bytes)

Type

Description

0

dwLength

4

DWORD

The length, in bytes, of the complete extended compat ID descriptor

4

bcdVersion

2

BCD

The descriptor’s version number, in binary coded decimal (BCD) format

6

wIndex

2

WORD

An index that identifies the particular OS feature descriptor

8

bCount

1

BYTE

The number of custom property sections

9

RESERVED

7

BYTEs

Reserved

其中:

1. 若操作系统描述符版本为1.00,那么bcdVersion固定为0x0100。

2. wIndex设定为0x04.

3. bCount表示有几个Function Section。

Part ii. Function Section

Offset

Field

Size

(bytes)

Type

Description

0

bFirstInterfaceNumber

1

BYTE

The interface or function number

1

RESERVED

1

BYTE

Reserved

2

compatibleID

8

BYTEs

The function’s compatible ID

10

subCompatibleID

8

BYTEs

The function’s subcompatible ID

18

RESERVED

6

BYTEs

Reserved

Note: The offsets in this table are given from the beginning of the section. To calculate the offset of a field from the beginning of the entire descriptor, add the length of the header section and the lengths of any function sections that precede this section to the value in the table.

其中:

1. bFirstInterfaceNumber字段是端口号,这里我们设为0。

2. 第一个RESERVED部分为0x01,第二个RESERVED部分全为NULLS(即0x00)。

3. compatibleID字段为兼容性ID,这里我们要设为WINUSB。不够8字节的时候需要用NULL补齐8字节。

4. subCompatibleID字段在这里我们可以设为8个NULL。

例如:

uint8_tUSB_OS_FEATURE_STRING[USB_COMPID_LENGTH]=

{

// header 9bit

USB_COMPID_LENGTH,

0x00,

0x00,

0x00,

0x00,                           //低位bcdVersion

0x01,                           //高位bcdVersion

0x04,                           //index of compat ID descriptors

0x00,

0x01,                           //1个function

// reserved 7bit

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

// function

// 2bit

0x00,                           //端点0

0X01,

// compatibleID 8bit

0x57,                           //W

0x49,                           //I

0x4E,                           //N

0X55,                           //U

0x53,                           //S

0x42,                           //B

0x00,

0x00,

// subCompatibleID 8bit

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

0x00,

// RESERVED 6bit

0x00,

0x00,

0x00,

0x00,

0x00,

0x00

};

2. 获取操作系统描述符相关文档

1. 从这个网址上获取:【Microsoft OS Descriptors | Microsoft Docs】

2. 如图点击“我接受”后会在右边弹出“下载”按钮。

使枚举成功的USB设备成为WINUSB设备相关推荐

  1. 可以真正实现免驱的WinUSB设备

    可以真正实现免驱的WinUSB设备 为什么要使用WinUSB设备? USB设备的枚举过程 如何让一个USB设备被识别为WinUSB设备? WinUSB设备枚举成功后如何挂载驱动 如何确定WinUSB设 ...

  2. winUSB设备的开发方法

    1.winUSB功能介绍 winUSB设备在win10系统下自带驱动程序的,winUSB设备连接到USB后,可以直接被系统识别,无需安装驱动,实现了免驱的功能.就像键盘.鼠标插入到电脑上直接使用一下. ...

  3. winUSB设备上位机驱动开发环境的搭建

    1.winUSB设备开发的环境 本文选择的winUSB的开发语言为python,USB的软件包为pyUSB,首先你需要准备好python的整个开发环境与相关软件,之后在命令行中执行pip instal ...

  4. Android USB的AOA协议设备端(主机模式,配件模式),ADB连接

    USB的ADB/AOA协议(一种是ADB模式,一种是AOA模式).AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议. ADK中与USB配件模式相关的两个类是U ...

  5. WINUSB设备的inf文档的编写

    <WINUSB设备的inf文档的编写> 目录 简介... 1 1.      获取inf文件和cat文件模板... 1 1.1       创建WinUSB应用程序... 1 1.2    ...

  6. 基于windows7的usb多点触控设备

    前段时间,朋友要做一个windows7的usb多点触控设备,我就帮了个小忙,负责搞定了设备 与PC通信相关的这块.整个项目我做了两个东西,一是下位机的usb设备描述符,一个是上位机的测试软件,下面我会 ...

  7. USB MSC类存储设备及FatfsR0.14移植

    USB MSC类存储设备及FatfsR0.14移植 效果演示 配置说明 USB MSC类配置 FatFs移植 FatFs的配置 驱动接口 FatFs测试 USB MSC驱动接口完善 效果演示 这里演示 ...

  8. cubemx 读卡器_STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发

    这里我主要说一下如何做一个USB下位机,这里主要分3部分:1.建立工程:2.添加报文描述符:3.数据的传输.这里就不讲USB的理论知识了,有想要了解的自行百度一下就可以了. 1.首先打开USB 2.接 ...

  9. USB摄像头转HDMI设备,USB Camera to HDMI

    本文镜像:https://linkpi.cn/archives/1681 本文链接:https://blog.csdn.net/weixin_45326556/article/details/1270 ...

最新文章

  1. Kubernetes集群日志详解
  2. oracle的shell命令,Shell实现的Oracle启动脚本分享
  3. python退出程序-【转】python 退出程序的方式
  4. 数据挖掘之人工神经网络BP算法
  5. iOS10 资料汇总:值得回看的 10 篇 iOS 热文
  6. (完全二叉树编号)小球下落
  7. docker 管理工具_详解Docker可视化管理工具shipyard--部署教程及功能展示
  8. 历史上今天和成语辞典 进入美国区教育类 what's hot
  9. 简述计算机阶码表达什么,阶码
  10. javacript 数据类型
  11. Android中在SurfaceView上高效绘图
  12. 核电厂的“神经中枢”——核电厂数字化仪控系统
  13. paypal php 方式,如何使用PHP向paypal汇款
  14. Android 调起微信扫一扫
  15. 如何解决“'mvn' 不是内部或外部命令,也不是可运行的程序或批处理文件。”问题
  16. 清除微信小程序、微信H5缓存
  17. linux 查看文件信息
  18. Mac 开发者常用的工具
  19. 商业计划书如何吸引投资人
  20. ecplise配置tomcat

热门文章

  1. php窗帘excel,各种办公室窗帘的用途及优缺点 办公窗帘安装讲
  2. 计算机毕业设计之全网独家Spark租房爬虫数据分析与推荐系统 租房大数据 租房app 租房数据分析 租房爬虫 房源推荐系统 房源数据分析 房源可视化
  3. 程雷被机器人_机器人登台表演节目?程雷惨遭机器人戏耍郭德纲一旁大笑!
  4. if……else if……else注意事项与基本用法
  5. 华硕主板Z97-C无法识别三星 M.2 NVME固态硬盘的解决方案
  6. 不怕加班狗有情绪,就怕加班狗有“武器”
  7. 使用QGIS插件转换火星坐标、百度坐标和WGS84坐标
  8. php中switch语句的理解,php中switch语句的使用详解
  9. 软件测试基础理论-测试用例
  10. IOS 清理CALayer、CAShapeLayer的sublayers