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