基于DWC2的USB驅動開發-0x03 DWC2 USB2.0 IP 架構介紹之接口和協議時序 (qq.com)
前言
這部分以一些典型的傳輸為例,介紹控制器的處理過程。這部分內容比較重要,對于時序的理解有助于軟件編寫,尤其了解整個過程的先后順序,邏輯,比如什么時候產生中斷,什么時候硬件做什么,什么時候軟件做什么,這些都是驅動編寫需要了解的??梢月?,細細品,后面編寫軟件調試過程還會結合寄存器狀態,結合調試過程不斷加深理解。
控制寫
如下以設備模式,DMA操作方式,16位utmi接口,SetAddress的Setup階段為例
注意以上5個關鍵過程
- 軟件使能OUT端口,設置好DMA,準備好接收數據。
- HOST發送Setup包過來,控制器收到并且硬件自動回復ACK。
- 控制器通過DMA將Setup包的內容搬運到系統memory。
- 然后控制器自動設置NAK位,NAK所有的IN和OUT端點,不再接收令牌包。
這里硬件自動NAK進行流控, 為什么這里要硬件自動NAK呢,這是為了避免持續的setup導致異常,因為由軟件中斷服務中再進行NAK比較慢,所以必須硬件做。所以驅動編寫一定要知道哪些是硬件做的哪些需要軟件做。
- 產生接收setup中斷, 軟件讀出setup內容進行解析,然后清除NAK位,重新使能端口進行接收。
如下是狀態階段
SetAddress沒有數據階段,前面的Setup數據流是HOST->DEV,所以狀態階段數據流是DEV->HOST,即HOST過來IN請求數據,DEV返回0長包。
- 軟件使能IN端點,配置DMA發送0長包。
- 控制器認為此時數據還未就緒所以NAK主機的IN請求。
- 控制器產生發送空中斷。
- HOST繼續IN請求,此時控制器準備好了數據,所以返回了0長包。
- 控制器產生發送完中斷,即0長包發送完通知軟件處理。
以上幾點一些個人理解暫時不確定:
為什么1已經使能了IN端點,配置好DMA了,2時間點在1的后面為什么還是NAK,這里應該是軟件DMA配置好,使能IN端點了,但是DMA還沒將0長數據包更新到TxFIFO(雖然0長包不需要復制負載數據但是還是有包頭包尾CRC等需要準備),所以此時還沒有數據可以發送到USB總線上去所以是NAK
3這里產生發送空中斷指的是緩沖區空,而不是指的總線數據發送完,所謂的緩沖區空即軟件可以繼續配置下一個DMA準備下一個DMA搬運了。此時數據已經就緒到TxFIFO隨時都可以發送到USB總線了。
所以4這里 HOST再來IN請求時控制器就可以返回0長包了
然后5這里就產生發送完中斷(這里應該是真正的總線上數據發送完)。
所以什么時候產生什么中斷是編程需要了解的非常重要。
設備模式BULK OUT
這里順便提一下USB中的IN和OUT是以HOST的角度去說的。
比如IN指的是數據DEV->HOST
OUT指的是數據HOST->DEV。
不管是設備端還是主機端都是這個角度說的。
如下以包長為1的BULK OUT傳輸,DMA模式為例
- 軟件設置好DMA,使能OUT端點.
- HOST發送一個1字節長的BULK OUT包,控制器因為已經就緒接收,所以ACK該包,接收的數據在接收緩沖區。
- 控制器通過DMA將接收緩沖區的數據搬運到系統memory。
- 控制器產生接收完成中斷。中斷中就可以對數據進行處理。
設備模式BULK IN
如下以包長為1的BULK IN傳輸,DMA模式為例。
- 此時發送FIFO中沒有數據,所以HOST來IN請求時,控制器返回NAK
- 控制器產生TXFIFO空中斷,表示TXFIFO中沒有數據了,可以準備發送數據了。
- 軟件配置好DMA和使能IN端點。
- 控制器通過DMA將數據從系統memory搬運到TXFIFO中。在完成搬運前都是NAK主機的IN。
- 完成數據搬運到FIFO,FIFO中有數據了,此時HOST再來IN,則控制器將緩沖區的數據發送到USB總線上去。
- 控制器產生發送完中斷。
設備模式Interrupt OUT
以下以設備模式,DMA操作,中斷OUT傳輸252字節數據。和BULK OUT類似。
- 軟件配置好DMA和使能OUT端點。
- 控制器接收HOST發送的數據到接收緩沖區,并ACK。
- 控制器通過DMA將接收緩沖區的數據搬運到系統memory。
- 產生接收完成中斷。軟件可以處理數據了。
設備模式Isochronous IN
以下以設備模式DMA方式的ISO IN傳輸為例
- SOF令牌,ISO的傳輸以SOF微幀為單位進行。
- 控制器產生SOF中斷。
- 軟件設置好DMA使能IN端點。
- IN端點使能后,控制器開始通過DMA將系統memory的數據搬運到發送FIFO中去。
- 下一個SOF到來并產生SOF中斷
- 本次SOF的HSOT的IN請求,設備的FIFO中已經準備好數據所以可以發送到總線上去給HOST。
- 產生發送完中斷。
主機模式 Isochronous IN
以下以主機模式DMA方式的ISO IN傳輸為例
應用程序必須在傳輸之前安排一個(微)幀的傳輸。
- 控制器產生SOF中斷。
- 軟件配置好通道信息以準備接收下一個微幀的數據。
- 下一個SOF中斷。
- 控制發送IN請求并接收設備返回的數據。
- 控制器將接收到的數據通過DMA搬運到系統memory中。
- 控制器產生接收完成中斷。
主機模式Slave操作方式Bulk Out傳輸
以主機模式 Slave操作方式 Bulk Out傳輸1個字節數據為例。
Slave模式需要CPU通過AHB總線去寫數據到發送FIFO,而不是DMA自動搬運。
- 控制初始化配置好BULK OUT的通道。
- 軟件將數據寫入TXFIFO中。
- 控制器發送TXFIFO中的數據。
- 發送完產生中斷。
總結
以上以各種典型的傳輸時序圖為例介紹了控制器的處理過程,把這部分放在開始寫代碼之前也是為了先有一個大概的整體了解,才能確定程序的框架流程如何設計。
-
控制器
+關注
關注
112文章
16447瀏覽量
179462 -
寄存器
+關注
關注
31文章
5363瀏覽量
121172 -
接口
+關注
關注
33文章
8692瀏覽量
151921 -
usb
+關注
關注
60文章
7980瀏覽量
266099 -
驅動開發
+關注
關注
0文章
130瀏覽量
12112 -
DWC2
+關注
關注
0文章
35瀏覽量
151
發布評論請先 登錄
相關推薦
評論