USB學習系列之三——USB設備的枚舉
2.在USB設備的枚舉過程中使用了控制傳輸,這種傳輸保證數據傳輸的正確性??刂苽鬏敺譃椋航⑦^程(主機發(fā)起)、可選的數據過程和狀態(tài)過程。
本文引用地址:http://www.ex-cimer.com/article/201612/330045.htm3.控制傳輸解析:
(1)主機發(fā)起建立過程,建立過程開始于一個SETUP令牌包,后面緊跟一個DATA0數據包,接著就是數據過程。
(2)如果是控制讀傳輸,那么數據過程就是輸入數據(相對于USB主機來說的);如果是控制寫傳輸,那么數據過程就是輸出數據。如果在建立過程中指定了數據長度為0,那么就沒有數據過程。數據過程之后是狀態(tài)過程。
(3)狀態(tài)過程剛好與數據過程的數據傳輸方向相反:如果是控制讀傳輸,則狀態(tài)過程是一個輸出數據包(相對于USB主機來說的);如果是控制寫傳輸,則狀態(tài)過程是一個輸入數據包。狀態(tài)過程是用來確認所有的數據是否都已經正確傳輸完成。
4.枚舉過程的解析:
(1)復位并讀取端點0最大包長度:
主機監(jiān)測到設備插入后,首先對設備進行復位(也就是將差分數據線同時拉低一段時間,因為差分數據線正常狀態(tài)是一高一低)。USB設備復位之后地址為0,USB主機往地址為0的設備的端點0發(fā)送獲取設備描述符的標準請求(這是一個控制傳輸的建立過程)。設備收到請求后,在數據過程將設備描述符返回給主機。主機在成功獲取到一個數據包的設備描述符并且確認沒有錯誤后,就會返回一個0長度的確認數據包(狀態(tài)過程)。然后就會進入到設置地址的階段。
注意:標準的設備描述符有18個字節(jié),但是有些USB設備端點0大小不足18字節(jié),理論上說USB主機只有通過多次讀取才能讀取到18字節(jié)的數據,但是在此階段USB主機仍然只讀取一次,這一次讀取的數據大小最小為8字節(jié)(USB協(xié)議規(guī)定端點0至少為8字節(jié)),在這8字節(jié)的數據中已經包含了USB主機在這個階段需要知道的信息,也就是端點0的最大包長度。端點0的最大包長度存放于設備描述符的第8字節(jié)處。
(2)地址設置
USB主機往地址為0的設備的端點0發(fā)送一個設置地址的請求(建立過程),新的設備地址包含在建立過程的數據包中。具體的地址由USB主機負責管理,主機會分配一個唯一的地址給剛接入的設備。USB設備在收到這個建立過程之后就直接進入到狀態(tài)過程,因為這里數據過程是不需要的。設備等待主機請求狀態(tài)返回(一個輸入令牌包),收到輸入令牌包后,設備就返回0長度的狀態(tài)數據包。如果主機成功接收到該狀態(tài)包,就會發(fā)送應答包ACK(確認字符)給設備,設備收到ACK之后,就要啟用新的地址,以后主機就通過這個地址來訪問該設備。
注意:D12USB接口芯片會自動等待ACK之后才啟用新的地址,所以要在返回0長度的狀態(tài)包之前,將地址寫到D12芯片的地址寄存器中。
(3)獲取設備描述符
使用新的地址,獲取完整的18字節(jié)的設備描述符。如果端點0的最大包長小于18字節(jié),那么就會有多多次請求數據輸入。
(4)主機獲取配置描述符和配置集合
配置描述符總共為9字節(jié)。主機在獲取到配置描述符之后就獲取配置集合。
(5)獲取字符串描述符等其他的描述符。
注意:設備返回的數據長度可以小于主機請求的長度。
評論