網站導航:首頁開源項目 USB開源項目:Easy USB 51 Programer  

目錄導航

   
  1、項目簡介
USB開發基礎
1、USB接口的優點及開發難易度
2、USB設備的開發流程
3、USB接口芯片(USB控制器)的選擇
4、了解USB的通訊過程
5、USB命令(請求)和USB描述符
6、實例講解USB的枚舉(配置)過程
准備工作
1、需要哪些工具
2、電路原理圖
3、手工制作您的電路板
4、測試您的硬件
HID設備類
1、讓PC機找到我們的硬件
2、如何成爲一個HID設備(模擬鼠標)
3、如何成爲一個HID設備(模擬鍵盤)
4、如何與HID設備通訊(一)
5、如何與HID設備通訊(二)
6、51編程器的實現
Windows USB 驱动程序(自定义设备)
1、Windows驅動開發基礎
2、開發環境配置
3、第一个实例-Hello Wdm(一)
4、第一个实例-Hello Wdm(二)
5、真正的實例—驅動我們的實驗板
6、真正的實例—測試驅動程序
7、真正的實例—控制LED及讀取按鍵狀態
8、如何編寫應用程序
   

相关産品    淘寶網店
     
 

 
  更多...  
 
 
USB命令(請求)和USB描述符 查看/参与此開源項目相关讨论
 

一、USB命令

  在USB規範裏,對命令一詞提供的單詞爲“Request”,但這裏爲了更好的理解主機與設備之間的主從關系,將它定義成“命令”。

  所有的USB設備都要求對主機發給自己的控制命令作出響應,USB規範定義了11個標准命令,它們分別是:Clear_Feature、Get_Configuration、Get_Descriptor、Get_Interface、Get_Status、Set_Address、Set_Configuration、Set_Descriptor、Set_Interface、Set_Feature、Synch_Frame。所有USB設備都必須支持這些命令(個別命令除外,如Set_Descriptor、Synch_Frame)。

  不同的命令雖然有不同的數據和使用目的,但所有的USB命令結構是一樣的。下表所示爲USB命令的結構: 
表1、USB命令的結構
偏移量  長度(字節) 描述
0 bmRequestType 1 位圖 請求特征:
D7:傳輸方向
0=主機至設備
1=設備至主機
D6..5:種類
0=標准
1=類
2=廠商
3=保留
D4..0:接受者
0=設備
1=接口
2=端點
3=其他
4..31 保留
1 bRequest 1 命令類型編碼值(見表3)
2 wValue 2 根據不同的命令,含義也不同
4 wIndex 2 索引或偏移 根據不同的命令,含義也不同,主要用于传送索引或偏 移
6 wLength 2   如有數據傳送階段,此爲數據字節數。

下表列出了USB的11種標准命令

表2、USB的11種標准命令
命令

bmRequestType

bRequest

wValue

wIndex

wLength

Data

Clear_Feature

00000000B
00000001B
00000010B

CLEAR_FEATURE

特性選擇符


接口號
端點號

Get_Configuration

10000000B

GET_CONFIGURATION

配置值

Get_Descriptor

10000000B

GET_DESCRIPTOR

描述表種類(高字節,見表5)和索引(低字節)

零或語言標志

描述表長

描述表

Get_Interface

10000001B

GET_INTERFACE

接口號

可選設置

Get_Status

10000000B
10000001B
10000010B

GET_STATUS

零(返回設備狀態)
接口號(对像时接口时)
端點號(对象是端點时)

設備,
接口 ,或
端點狀態

Set_Address

00000000B

SET_ADDRESS

設備地址

Set_Configuration

00000000B

SET_CONFIGURATION

配置值(高字節爲0,低字節表示要設置的配置值)

Set_Descriptor

00000000B

SET_DESCRIPTOR

描述表種類(高字節,見表5)和索引(低字節)

零或語言標志

描述表長

描述表

Set_Feature

00000000B
00000001B
00000010B

SET_FEATURE

特性選擇符(1表示设备,0表示端點)


接口號
端點號

Set_Interface

00000001B

SET_INTERFACE

可選設置

接口號

Synch_Frame

100000010B

SYNCH_FRAME

端點號

幀號

其中bRequest爲命令編碼值,含意見表3:

表3、USB標准命令的編碼值

bRequest

Value

GET_STATUS

0

CLEAR_FEATURE

1

爲將來保留

2

SET_FEATURE

3

爲將來保留

4

SET_ADDRESS

5

GET_DESCRIPTOR

6

SET_DESCRIPTOR

7

GET_CONFIGURATION

8

SET_CONFIGURATION

9

GET_INTERFACE

10

SET_INTERFACE

11

SYNCH_FRAME

12

 

二、USB描述符

  USB協議为USB设备定义了一套描述设备功能和属性的有固定結構的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端點描述符和字符串描述符,还有百標准描述符,如類描述符。USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行類型识别、配置并为其提供相应的客户端驱动程序。

  USB设备通过描述符反映自己的设备特性。USB描述符是由特定格式排列的一组数据結構组成。

  在USB設備枚舉過程中,主機端的協義軟件需要解析從USB設備讀取的所有描述符信息。在USB主向設備發送讀取描述符的請求後,USB設備將所有的描述符以連續的數據流方式傳輸給USB主機。主機從第一個讀到的字符開始,根據雙方規定好的數據格式,順序地解析讀到的數據流。

  USB描述符包含標准描述符、類描述符和廠商特定描述3種形式。任何一種設備必須USB標准描述符(隊字符串描述符可選外)。

  在USB1.X中,规定了5种標准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端點描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。

  每個USB設備只有一個設備描述符,而一個設備中可包含一個或多個配置描述符,即USB設備可以有多種配置。設備的每一個配置中又可以包含一個或多個接口描述符,即USB設備可以支持多種功能(接口),接口的特性通過描述符提供。

  在USB主機訪問USB設備的描述符時,USB設備依照設備描述符、配置描述符、接口描述符、端點描述符、字符串描述符順序將所有描述符傳給主機。一設備至少要包含設備描述符、配置描述符和接口描述符,如果USB設備沒有端點描述符,則它僅僅用默認管道與主機進行數據傳輸。

1、設備描述符

  设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、産品序列号、所属设备類号、默认端點的最大包长度和配置描述符的个数等。一个USB设备必须有且仅有一个设备描述符。设备描述符是设备连接到总线上时USB主机所读取的第一个描述符,它包含了14个字段,結構如下:

表4、USB设备描述符的結構

偏移量

大小

描述

0

bLength

1

數字

此描述表的字節數

1

bDecriptorType

1

常量

描述符的類型(此處應爲0x01,即設備描述符)

2

bcdUSB

2

BCD碼

此设备与描述表兼容的USB设备說明版本号(BCD 码)

4

bDeviceClass

1

设备類码:
如果此域的值为0则一个设置下每个接口指出它自己的類,各个接口各自独立工作。
如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的類。并这些接口可能不能独立工作。此值指出了这些接口集体的類定义。
如果此域设为FFH,则此设备的類由厂商定义。

5

bDeviceSubClass

1

子類

子類挖码
这些码值的具体含义根据bDeviceClass 域来看。
如bDeviceClass 域为零,此域也须为零
如bDeviceClass 域为FFH,此域的所有值保留。

6

bDevicePortocol

1

協議

協議码
这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。
如果设备支持设备類相关的協議,此码标志了设备類的值。如果此域的值为零,则此设备不支持设备類相关的協議,然而,可能它的接口支持设备類相关的協議。如果此域的值为FFH,此设备使用厂商定义的協議。

7

bMaxPacketSize0

1

數字

端點0的最大包大小(僅8,16,32,64
爲合法值)

8

idVendor

2

ID

廠商標志(由USB-IF組織賦值)

10

idProduct

2

ID

産品标志(由厂商赋值)

12

bcdDevice

2

BCD 码

设备发行号(BCD 码)

14

iManufacturer

1

索引

描述廠商信息的字符串描述符的索引值。

15

iProduct

1

索引

描述産品信息的字串描述符的索引值。

16

iSerialNumber

1

索引

描述設備序列號信息的字串描述符的索引值。

17

bNumConfigurations

1

數字

可能的配置描述符數目

其中bDescriptorType为描述符的類型,其含义可查下表(此表也适用于标准命令Get_Descriptor中wValue域高字节的取值含义):

表5、USB描述符的類型值
類型 描述符 描述符值
標准描述符 设备描述符(Device Descriptor) 0x01
配置描述符(Configuration Descriptor) 0x02
字符串描述符(String Descriptor) 0x03
接口描述符(Interface Descriptor) 0x04
端點描述符(EndPont Descriptor) 0x05
類描述符 集线器類描述符(Hub Descriptor) 0x29
人机接口類描述符(HID) 0x21
廠商定義的描述符   0xFF

设备類代码bDeviceClass可查下表:

表6、设备的類别(bDeviceClass)
值(十進制)
值(十六進制)
說明
0
0x00
接口描述符中提供類的值
2
0x02
通信類
9
0x09
集线器類
220
0xDC
用于诊断用途的设备類
224
0xE0
無线通信设备類
255
0xFF
廠商定義的設備類

下表列出了一個USB鼠標的設備描述符的例子,供大家分析一下:

表7、一種鼠標的設備描述符示例
字段 描述符值(十六制)

bLength

0x12

bDecriptorType

0x01

bcdUSB

x0110

bDeviceClass

0x00

bDeviceSubClass

0x00

bDevicePortocol

0x00

bMaxPacketSize0

0x08

idVendor

0x045E(Microsoft Corporation)

idProduct

0x0047

bcdDevice

0x300

iManufacturer

0x01

iProduct

0x03

iSerialNumber

0x00

bNumConfigurations

0x01

2、配置描述符

  配置描述符中包括了描述符的長度(屬于此描述符的所有接口描述符和端點描述符的長度的和)、供電方式(自供電/總線供電)、最大耗電量等。主果主機發出USB標准命令Get_Descriptor要求得到設備的某個配置描述符,那麽除了此配置描述符以外,此配置包含的所有接口描述符與端點描述符都將提供給USB主機。

表8、USB配置描述符的結構

   偏移量

     域

 大小

   值

   描述

      0

bLength

1

   數字

此描述表的字節數长度。

      1

bDescriptorType

1

   常量

配置描述表類型(此处为0x02)

      2

wTotalLength

2

   數字

此配置信息的总长(包括配置,接口,端點和设备類及廠商定義的描述符)

      4

bNumInterfaces

1

   數字

此配置所支持的接口個數

      5

bCongfigurationValue

1

   數字

在SetConfiguration()請求中用作參數來選定此配置。

      6

iConfiguration

1

   索引

描述此配置的字串描述表索引

      7

bmAttributes

1

   位圖

配置特性:
D7: 保留(设为一)
D6: 自给电源
D5: 远程唤醒
D4..0:保留(設爲一)
一个既用总线电源又有自给电源的设备会在MaxPower域指出需要从总线取的电量。并设置D6为一。运行时期的实际电源模式可由GetStatus(DEVICE) 请求得到。

      8

MaxPower

1

    mA

在此配置下的总线电源耗费量。以 2mA 为一个单位。

下面是一種硬盤的配置描述符示例:

表9、一種硬盤的配置描述符示例
字段 描述符值(十六進制)

bLength

0x09

bDescriptorType

0x02

wTotalLength

0x01F

bNumInterfaces

0x01

bCongfigurationValue

0x01

iConfiguration

0x00

bmAttributes

0x0C

MaxPower

0x32

3、接口描述符

  配置描述符中包含了一個或多個接口描述符,這裏的“接口”並不是指物理存在的接口,在這裏把它稱之爲“功能”更易理解些,例如一個設備既有錄音的功能又有揚聲器的功能,則這個設備至少就有兩個“接口”。

  如果一個配置描述符不止支持一個接口描述符,並且每個接口描述符都有一個或多個端點描述符,那麽在響應USB主機的配置描述符命令時,USB設備的端點描述符總是緊跟著相關的接口描述符後面,作爲配置描述符的一部分被返回。接口描述符不可直接用Set_Descriptor和Get_Descriptor來存取。

  如果一个接口仅使用端點0,则接口描述符以后就不再返回端點描述符,并且此接口表现的是一个控制接口的特性,它使用与端點0相关联的默认管道进行数据传输。在这种情况下bNumberEndpoints域应被设置成0。接口描述符在說明端點个数并不把端點0计算在内。

表10、USB接口描述符的結構

偏移量

大小

說明

       0

bLength

1

數字

此表的字節數

       1

bDescriptorType

1

常量

接口描述表類(此处应为0x04)

       2

bInterfaceNumber

1

數字

接口號,当前配置支持的接口数组索引(从零开始)。

       3

bAlternateSetting

1

數字

可選設置的索引值。

       4

bNumEndpoints

1

數字

此接口用的端點数量,如果是零则說明此接口只用缺省控制管道。

       5

bInterfaceClass

        1

接口所属的類值:
零值爲將來的標准保留。
如果此域的值设为FFH,则此接口類由厂商說明。
所有其它的值由USB 說明保留。

       6

bInterfaceSubClass

        1

子類

子類码
這些值的定義視bInterfaceClass域而定。
如果bInterfaceClass域的值爲零則此域的值必須爲零。
bInterfaceClass域不为FFH则所有值由USB 所保留。

       7

bInterfaceProtocol

        1

協議

協議码:bInterfaceClass 和bInterfaceSubClass 域的值而定.如果一个接口支持设备類相关的请求此域的值指出了设备類說明中所定义的協議.

       8

iInterface

        1

索引

描述此接口的字串描述表的索引值。

对于bInterfaceClass字段,表示接口所属的類别,USB協議根据功能将不同的接口划分成不的類,其具体含义如下表所示:

表11、USB協議定义的接口類别(bInterfaceClass)
值(十六進制) 類别
0x01 音频類
0x02 CDC控制類
0x03 人机接口類(HID)
0x05 物理類
0x06 图像類
0x07 打印机類
0x08 大数据存储類
0x09 集线器類
0x0A CDC数据類
0x0B 智能卡類
0x0D 安全類
0xDC 诊断设备類
0xE0 無线控制器類
0xFE 特定应用類(包括红外的桥接器等)
0xFF 廠商定義的設備

4、端點描述符

  端點是设备与主机之间进行数据传输的逻辑接口,除配置使用的端點0(控制端點,一般一个设备只有一个控制端點)为双向端口外,其它均为单向。端點描述符描述了数据的传输類型、传输方向、数据包大小和端點號(也可称为端點地址)等。

  除了描述符中描述的端點外,每個設備必須要有一個默認的控制型端點,地址爲0,它的數據傳輸爲雙向,而且沒有專門的描述符,只是在設備描述符中定義了它的最大包長度。主機通過此端點向設備發送命令,獲得設備的各種描述符的信息,並通過它來配置設備。

表12、USB端點描述符的結構

偏移量

大小

說明

0

bLength

1

數字

此描述表的字節數长度

1

bDescriptorType

1

常量

端點描述表類(此处应为0x05)

2

bEndpointAddress

1

端點

此描述表所描述的端點的地址、方向:
Bit 3..0 : 端點號.
Bit 6..4 : 保留,为零
Bit 7:    方向,如果控制端點则略。
0:输出端點(主机到设备)
1:输入端點(设备到主机)

3

bmAttributes

1

位圖

此域的值描述的是在bConfigurationValue域所指的配置下端點的特性。
Bit 1..0 :传送類型
00=控制傳送
01=同步傳送
10=批傳送
11=中斷傳送
所有其它的位都保留。

4

wMaxPacketSize

2

數字

当前配置下此端點能够接收或发送的最大数据包的大小。
对于实进传输,此值用于为每帧的数据净负荷预留时间。在实际运行时,管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非USB定义的机制汇报给主机。对于中断传输,批量传输和控制传输,端點可能发送比之短的数据包
 

6

bInterval

1

數字

周期数据传输端點的时间间隙。
此域的值对于批传送的端點及控制传送的端點無意义。对于同步传送的端點此域必需为1,表示周期为1ms。对于中断传送的端點此域值的范围为1ms到255ms。

下表是一种鼠标的端點描述符的示例,该端點是一个中断端點:

表13、一种鼠标的端點描述符示例
值(十六進制)

bLength

0x07

bDescriptorType

0x05

bEndpointAddress

0x81

bmAttributes

0x03

wMaxPacketSize

0x04

bInterval

0x0A

5、字符串描述符

  字符串描述符是一种可选的USB標准描述符,描述了如制商、设备名称或序列号等信息。如果一个设备無字符串描述符,则其它描述符中与字符串有关的索引值都必须为0。字符串使用的是Unicode编码。

  主机请示得到某个字符串描述符时一般分成两步:首先主机向设备发出USB标准命令Get_Descriptor,其中所使用的字符串的索引值为0,设备返回一个字符串描述符,此描述符的結構如下:

表14、USB字符串描述符(響應主機請求時返回的表示語言ID的字符串描述符)

偏移量

大小

     描述

0

bLength

1

N+2

此描述表的字節數

1

bDescriptorType

1

常量

字串描述表類型(此处应为0x03)

2

wLANGID[0]

2

數字

語言標識(LANGID)
碼0

     

N

wLANGID[x]

2

數字

語言標識(LANGID)
碼X

該字符串描述符雙字節的語言ID的數組,wLANGID[0]~wLANGID[x]指明了設備支持的語言,具體含義可查看USB_LANGIDs.pdf

  主机根据自己需要的语言,再次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言。这次设备所返回的是Unicode编号的字符串描述符,其結構如下:

表15、Unicode字符串描述符(響應主機請求時真正表示字符串編碼的字符串描述符)

偏移量

大小

描述

0

bLength

1

數字

此描述表的字節數(bString域的数值N+2)

1

bDescriptorType

1

常量

字串描述表類型(此处应为0x03)

2

bString

N

數字

UNICODE 编码的字串

bString域爲設備實際返回的以UNICODE編碼的字符串流,我們在編寫設備端硬件驅動的時候需要將字符串轉換爲UNICODE編碼,您可以通過一些UNICODE轉換工具進行轉換。這裏推薦由百合電子工作室開發的一款USB描述符生成工具“USB Unicode 字符串描述符生成器”,它專門爲編寫設備端驅動程序的需要而定制,可以非常方便將您需要的字符串轉換成UNICODE格式,進而導入您的C或彙編程序代碼中,以下是它的界面:

USB Unicode 字符串描述符生成器-生成C语言格式

USB Unicode 字符串描述符生成器-生成汇编格式

 
 
 
本站程序由百合電子工作室开发和维护
Copyright @ baihe electric studio
渝ICP備09006681號-4