前面的兩篇文章介紹和分析了USB的一些基本知識,結合前面的介紹,今天用實例介紹USB的枚舉過程。
1 | 概況
硬件基於EK-TMC123GXL開發板,軟件是TI提供的USB批量傳輸的簡單例子,在PC端用命令行通過USB發送字符串,開發板通過USB返回應對的字符串(發送的是大寫字母,返回小寫字母,反之亦然)
2 | 枚舉過程
由於整個枚舉過程很長,現有示波器沒法捕獲這個枚舉過程,改用邏輯分析儀來分析:
2.1 | 獲取描述符(GET_DEVICE_DESCRIPTOR)
主機發起控制傳輸的SETUP階段,地址為0,端點為0
主機發起控制傳輸的DATA階段,設備返回設備描述符
對應的解析如下
主機發起控制傳輸的STATUS階段
2.2 | 復位(RESET)
獲取完設備描述符以后,支持對設備進行了復位操作
2.3 | 設置地址(SET_ADDRESS)
主機發起控制傳輸的SETUP階段,地址為0,端點為0,設置設備的新地址為1
主機發起控制傳輸的STATUS階段,地址為0,端點為0(這里沒有DATA階段)
2.4 | 獲取設備描述符(GET_DEVICE_DESCRIPTOR)
主機用新設置的地址(下同),發起獲取設備描述符傳輸,傳輸過程和返回值和2.1相同
2.5 | 獲取配置描述符(GET_CONFIGURATION_DESCRIPTOR)
主機發起控制傳輸的SETUP階段,地址為1,端點為0
主機發起控制傳輸的DATA階段,設備返回配置描述符
解析如下
主機發起控制傳輸的STATUS階段,地址為1,端點為0
2.6 | 獲取字符串描述符(GET_STRING_DESCRIPTOR)
主機發起控制傳輸的SETUP階段,地址為1,端點為0, 字符串索引為3
主機發起控制傳輸的DATA階段,設備返回索引為3的字符串描述符
主機發起控制傳輸的STATUS階段,地址為1,端點為0
2.7 | 獲取字符串描述符(GET_STRING_DESCRIPTOR)
主機發起控制傳輸的SETUP階段,地址為1,端點為0, 字符串索引為0
主機發起控制傳輸的DATA階段,設備返回索引為0的字符串描述符
主機發起控制傳輸的STATUS階段,地址為1,端點為0
2.8 | 獲取字符串描述符(GET_STRING_DESCRIPTOR)
主機發起控制傳輸的SETUP階段,地址為1,端點為0, 字符串索引為2,傳輸過程2.6相同。
2.9 | 再次獲取描述符
主機再次獲取設備描述符,配置描述符。發生這種情況的原因可能多種多樣,例如堆棧中的不同驅動程序各自出於自身目的詢問相同的問題。
2.10 | 獲取狀態(GET_STATUS)
主機發起控制傳輸的SETUP階段,地址為1,端點為0
主機發起控制傳輸的DATA階段,設備返回狀態值
主機發起控制傳輸的STATUS階段,地址為1,端點為0
2.11 | 設置配置(SET_CONFIGURATION)
主機發起控制傳輸的SETUP階段,地址為1,端點為0
主機發起控制傳輸的STATUS階段,地址為1,端點為0
3 | 數據過程
PC端軟件發送字符串"HELLO,USB!",將返回字符串"hello,usb!"
3.1 | 發送(OUT)
主機發起OUT事務,地址為1,端點為1
3.2 | 接收(IN)
主機發起IN事務,地址為1,端點為1,設備返回數據
4 | 總結
枚舉是主機用端點0,通過控制傳輸(Control Transfer),獲取設備信息的過程。設備將信息以描述符的形式返回給主機。USB設備都有一個描述符層次結構如下圖,
-----------------------------------------------------------------------------------END
[參考資料]