LPC5528 EVK USB列舉解析

本範例使用 LPC5528 EVK 作為硬體,使用 NXP 提供 SDK 套件中的 usb_examples > dev_hid_mouse_bm 作為 Sample Code,搭配 USB 分析儀來解析 USB 從上電到列舉成功之間所有 Descriptor 的定義。

USB Transfer 概念:
首先我們先簡略敘述一下 USB Transfer 的規範概念 ( 如圖 1 )
  • 每個 Transfer 會包含 1 或數組 Transaction
  • 每個 Transaction 包含 1 個 Token Packet、1 個或數個 Data Packet、1 個 Handshake Packet
Token Packet 包含 1 個 PID、Address、Endpoint、CRC
PID:表示該 Packet 的內容對 Host 的關係為何 ( 需查表 )
Address:Host 配置給 Device 的位址
Endpoint:Device 中擁有最多 16 組的 Endpoint,視為資料的來源或目標且只能有 1 個方向性 ( 輸入或輸出 ),僅有 Endpoint 0 為雙向性
CRC:校驗數據的正確性
  • Data Packet 包含 1 個 PID、Data、CRC,PID 與 CRC解析與 Token Packet 類似,這邊就略過敘述
Data:傳輸資料內容由 PID 定義為輸入或輸出、訴求、訴求的形式…等,資料 Size 大小則會依 USB 傳輸速度而有所不同,本範例為 Full Speed 因此資料 Size 最大值為 1023 bytes
  • Handshake Packet 僅有 PID,用來觀察該筆 Transaction 的狀態,是否有傳輸成功 
圖 1

列舉步驟解析:
接下來將解析從 LPC5528 ( Device ) 與 Host 連結到列舉完成時的所有步驟,各 PID、Descriptor 需參閱 USB 規範,本範例已透過 USB 分析儀自動將代表意義呈現出來,因此就不一一陳列沒使用到的 Descriptor
1. Device 與 Host 連結
Host 與 Device 連接後,Host 會將 D+、D- 訊號拉低,此時透過配置在 Device 端的上拉電阻,來判斷 Device 為 Low Speed 或 Full Speed ( 如圖 2 )
圖 2  Device 端上拉電阻配置定義 ( 左:Full Speed、右:Low Speed )
2. Reset
Host 下達 Reset 指令
3. Suspended
該 Device 未傳送與接收 Host 資訊達 4 ms 時,Host 就會下達 Suspend 指令,此時  Device 會處於省電狀態,但仍然保持原有的USB地址和配置。
4. High speed detection handshake
當 Host 判斷 Device 為 Full Speed 後於此步驟中,透過 Host 與 Device 相互傳送 Chirp K 與 Chirp J 來確認彼此是否支援 High speed,此步驟中檢測訊號為雙向,圖 4 為 High speed Host 與 Device 的檢測訊號圖
a )  Host 會將 D+ 與 D- 同時拉低準位
b )  Device 發送第一個 Chirp K 將準位拉高,告知 Host 支援 High speed
c ) 若 Host 也支援 High speed 則會在連續發送 Chirp K 與 Chirp J
d ) 當確認完畢後,則會進行下個步驟
圖 4 ( 本圖參考 http://wiki.csie.ncku.edu.tw/embedded/USB )
5. Get Descriptor ( Device )
列舉第一個項目,Host 向 Device 取得 Descriptor 來確認 Device 在默認 EndPoint 0 下可傳輸 Packet 的 Size,USB 分析儀中的 CRC 會自動略過
Transaction 1:
第一個 Packet PID 為 Setup ( 0x2D ),Address 與 EndPoint 尚未宣告皆為默認值 0,如圖 5
第二個 Packet PID 為 DATA0
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0100 ) 規範表示為 2 個意義
        Type:Device Descriptor ( high 8 bits )
        Index:索引為 0
wLength:資料Size 64 bytes ( 0x40 )
Handshake Packet 為 0xD2,後續的 Handshake Packet 說明將省略
圖 5
Transaction 2:
第一個 Packet PID 為 IN ( 0x69 ),如圖 5
第二個 Packet PID 為 DATA1,內容值如圖 6
bLength:本封包資料大小 18 ( 0x12 )
bDescriptor Type:Device ( 0x01 )
bcdUSB:USB 協定為 2.0 ( 0x0200 )
bMaxPacketSize:最大傳輸封包 Size 64 bytes ( 0x40 )
往下的資料因尚未列舉完整因此電腦端仍不會參考
圖 6
6. Reset
7. High speed detection handshake
8. SetAddress
Transaction:
第一個 Packet PID 為 Setup,Address 與 EndPoint 尚未宣告皆為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 7
bmRequest 為 8 bits ( 0x00 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Host to Device ( 第 7 bit )
bRequest:Host 向 Device Set Address ( 0x05 )
wValue:Address 為 25 ( 0x19 )
圖 7
9. Get Descriptor ( Device Descriptor )
Device 獲取 Address 資料後再次確認 Descriptor
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 8
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wLength:資料Size 18 bytes ( 0x12 )
圖 8
Transaction 2:
第一個 Packet PID 為 IN
第二個 Packet PID 為 DATA1,內容值如圖 9
bLength:本封包資料大小 18 ( 0x12 )
bDescriptor Type:Device ( 0x01 )
bcdUSB:USB 協定為 2.0 ( 0x0200 )
bMaxPacketSize:最大傳輸封包 Size 64 bytes ( 0x40 )
idVendor:Device 開發廠商的 ID,由 USB org 協會發放 ( 0x1FC9 )
idProduct:Device 開發廠商的產品編號 ( 0x0091 )
bcdDevice:表示 USB Device 版本編號,由開發廠商指定,用以選擇適合的驅動程序
iManufacturer:用於表示供應商字符串描述符的索引值
iSerialNumber:用於表示設備序列號字符串描述符的索引值bNumConfigurations:用於表示該 USB 設備所支援的配置數
圖 9
10. Get Descriptor ( Configuration )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 10
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0200 ) 規範表示為 2 個意義
        Type:Configuration Descriptor ( high 8 bits )
        Index:索引為 0
wLength:資料Size 255 bytes ( 0xFF )
圖 10

Transaction 2:

本 Transaction DATA 量較大將拆分成 DATA1_1 ~ DATA1_4 來說明,如圖 11
圖 11 DATA1_1 ~ DATA1_4 中的資料
第一個 Packet PID 為 IN
第二個 Packet PID 為 DATA1
DATA1_1 ( 如圖 12 )
bLength:本封包資料大小 9 bytes
bDescriptor Type:Configuration
wTotalLength:總資料量 34 bytes ( 0x22 )
bNumInterface:1 個介面數量
bConfigurationValue:作為旗標功能,非 0 值表示 Device 處於配置狀態
iConfiguration:指出配置字符串 Descriptor 的索引值。具體字符串的內容在後面字符串描述符中定義。如果沒有配置字符串,可以置為0
bmAttributes 8 bits ( 0xC0 ),規範表示為 2 個意義如下,無解說的 Bit,USB 協定為預留定義
RemoteWakeup:遠端喚醒功能不開啟 ( 第 6 bit )
SelfPowered:由 Host 端供電給 Device ( 第 7 bit )
bMaxPower:由 Host 供應最大電流量限制,單位為 2 mA,因此範例為 100 mA
圖 12

DATA1_2 ( 如圖 13 )

bLength:本封包資料大小 9 bytes
bDescriptor Type:Interface ( 0x04 )
bInterfaceNumber:由 0 開始,表示第幾個interface
bAlternateSetting:預設為 0,由 host 來設定 configuration 生成新的 Endpoint
bNumEndpoints:表示此 interface 裡面生成多少 Endpoint,本範例生成 1 個
bInterfaceClass:Device 為 HID ( 其他定義如 Hub、Audio、Printer … 等 )
bInterfaceSubClass:Device 子介面定義為 Boot Interface
bInterfaceProtocol:定義為 Mouse
iInterface:有關介面字串描述元之偏移位址,範例定義為 0
圖 13

DATA1_3 ( 如圖 14 )
bLength:本封包資料大小 9 bytes
bDescriptorType:表示 HID Descriptor
bcdHID:HID 版本號碼 Ver 1
bCountryCode:國碼 ( 地區碼 )
bNumDescriptors:Descriptor 項數目 1
bDescriptorType:Descriptor 項類型為 Report
bDescriptorLength:Descriptor 項的長度 52 bytes
圖 14
DATA1_4 ( 如圖 15 )
bLength:本封包資料大小 7
bDescriptorType:表示 Endpoint Descriptor
bEndpointAddress 8 bits ( 0x81 ),規範表示為 2 個意義如下,無解說的 Bit,USB 協定為預留定義
        Direction:Endpoint 方向為輸入 ( 第 7 bit )
        Address:Endpoint 位址為 1 ( 第 0 ~ 3 bit )
bmAttributes 8 bits ( 0x03 ),Endpoint屬性定義為 4 個意義如下
Type:Interrupt ( 第 0、1 bit )
Synchronisation Type:No Synchonisation ( 第 2、3 bit )
Usage Type:Data Endpoint ( 第 4、5 bit )
Packet per frame:每 1 個 Packet 為 1 frame ( 第 6、7 bit )
wMaxPacketSize:最大 Packet Size 為 8 bytes
bInterval:Endpoint 輪詢時間為 4 ms ( frame )
圖 15
11. Get Descriptor ( String Descriptor )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 16
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0300 ) 規範表示為 2 個意義
        Type:String Descriptor ( high 8 bits )
        Index:索引為 0
wLength:資料Size 255 bytes ( 0xFF )
圖 16
Transaction 2:
第一個 Packet PID 為 IN
第二個 Packet PID 為 DATA1,內容值如圖 17
bLength:本封包資料大小 4 bytes
bDescriptor Type:String
wLANGID[0] :表示字符串的可用语言,範例定義為 English (US)
圖 17
12. Get Descriptor ( String Descriptor )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 18
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0300 ) 規範表示為 2 個意義
        Type:String Descriptor ( high 8 bits )
        Index:索引為 0
wLength:資料Size 255 bytes ( 0xFF )
圖 18
Transaction 2:
第一個 Packet PID 為 IN
第二個 Packet PID 為 DATA1,內容值如圖 19
bLength:本封包資料大小 34 bytes
bDescriptor Type:String
wLANGID[n]:定義內容為 HID MOUSE DEVICE 給電腦端的資訊
圖 19
13. Get Descriptor ( Device Qualifier )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 20
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Host 向 Device Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0600 ) 規範表示為 2 個意義
        Type:Device Qualifier Descriptor ( high 8 bits )
        Index:0
wLength:資料Size 10 bytes ( 0x0A)
圖 20
14. Get Descriptor ( Device Descriptor ) – Host 再次確認 Descriptor 解析同 Step 10
15. Get Descriptor ( Configuration ) – Host 再次 Configuration,因沒變更到設定,解析同 Step 11
16. Set Config ( Set Config )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值為圖 21 所示
bmRequest 為 8 bits ( 0x00 ) 規範表示為 3 個意義
Recipient:資料為 Device 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Host to Device ( 第 7 bit )
bRequest:Set Config ( 0x09 )
wValue:Config 1
圖 21
17. Set IDEL ( Set IDEL )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 22 所示
bmRequest 為 8 bits ( 0x21 ) 規範表示為 3 個意義
Recipient:資料為 Interface 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Class ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Host to Device ( 第 7 bit )
bRequest:Set IDEL ( 0x0A )
圖 22
18. GetDescriptor ( Report Descriptor )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 23 所示
bmRequest 為 8 bits ( 0x81 ) 規範表示為 3 個意義
Recipient:資料為 Interface 相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Get Descriptor ( 0x06 )
wValue 16 bits ( 0x2200 ) 規範表示為 2 個意義
        Type:Report Descriptor ( high 8 bits )
        Index:0
wLength:116 bytes ( 0x0A)
圖 23
Transaction 2:
此部分由 Device 傳送給 Host 的資料,由 NXP 官方定義內容,因此這邊就不做解析
19. GetDescriptor ( String Descriptor )
Transaction 1:
第一個 Packet PID 為 Setup,Address 為 25,EndPoint 尚未宣告為默認值 0
第二個 Packet PID 為 DATA0,內容值如圖 24 所示
bmRequest 為 8 bits ( 0x80 ) 規範表示為 3 個意義
Recipient:資料為 Device相關資訊 ( 第 0 ~ 4 bit )
Type:資料形式為 Standard ( 第 5 ~ 6 bit )
Direction:傳輸方向為 Device to Host ( 第 7 bit )
bRequest:Get Descriptor ( 0x06 )
wValue 16 bits ( 0x0301 ) 規範表示為 2 個意義
        Type:String Descriptor ( high 8 bits )
        Index:1
wIndes:範例定義為 English (US) ( 0x0409)
wLength:255 bytes ( 0xFF)
圖 24
Transaction 2:
第一個 Packet PID 為 IN
第二個 Packet PID 為 DATA1,內容值如圖 25 所示
bLength:本封包資料大小 38 bytes
bDescriptor Type:String
wLANGID[0] :定義內容為 NXP SEMICONDUCTORS 給電腦端的資訊
圖 25
20. Mouse 開始傳送座標值給 Host
Sample Code 功能是 Base on 目前現在鼠標的位址以右、下、左、上劃出一個方形
而後重複這個行為直到 Device 退出 Host,因此從分析儀擷取到的資訊可以看出 Device 開始傳座標指令給 Host,內容封包如圖 26
圖 26

以上解析為 LPC55S28 NXP 原廠 SDK USB 列舉過程。

參考資料
http://www.lnsign.com/2018/03/02/usb-enum-detial-analysis/#1.1
http://wiki.csie.ncku.edu.tw/embedded/USB

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★博文作者未開放評論功能