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