本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開發(fā)-USB包詳解 (qq.com)
一.前言
本篇講解Scatter/Gather DMA模式下控制傳輸相關(guān)的寄存器。控制傳輸是USB驅(qū)動(dòng)的核心部分,控制傳輸調(diào)通了驅(qū)動(dòng)就完成了一大半,而驅(qū)動(dòng)的核心又是中斷的處理。
二.控制傳輸相關(guān)的DMA描述符
Scatter/Gather DMA模式的優(yōu)點(diǎn)是可以提供一個(gè)描述符鏈表,一次處理更多的數(shù)據(jù),控制器自動(dòng)去索引描述符鏈表,進(jìn)行相應(yīng)的DMA處理。而Buffer DMA模式一次只能處理一個(gè)DMA操作。
來簡(jiǎn)單回顧下控制傳輸,控制傳輸包括
Setup,Data,Status三個(gè)階段,不是所有情況都需要包括三種階段,存在無數(shù)據(jù)階段的控制傳輸。
存在三種可能
控制寫
控制讀
無數(shù)據(jù)的控制傳輸,2階段控制傳輸。
控制傳輸需要準(zhǔn)備以下幾種描述符
2.1.SETUP
為了接收最多可能存在的3個(gè)連續(xù)的SETUP包,所以需要準(zhǔn)備一個(gè)描述符鏈表包括3個(gè)描述符。該描述符也可以用于接收控制讀傳輸主機(jī)發(fā)送的狀態(tài)包(0長(zhǎng)包)。
該描述符鏈表的前面兩個(gè)還可以作為ping-pong提高接收效率。
第三個(gè)描述符,初始化為空,最終設(shè)置為以接收在數(shù)據(jù)和狀態(tài)階段主機(jī)又異常發(fā)了SETUP。
2.2IN
2.3OUT
三.控制傳輸相關(guān)的中斷處理
3.1相關(guān)寄存器
首先我們來看和中斷相關(guān)的一些寄存器,控制傳輸對(duì)應(yīng)的就是端點(diǎn)0所以和其他端點(diǎn)其實(shí)是一樣的,只不過其多了一些比如SETUP等狀態(tài)而已。
首先我們來看相關(guān)的寄存器
首先全局的:GAHBCFG寄存器的bit0 GlblIntrMsk作為全局中斷的總開關(guān),置位使能總中斷。
然后寄存器GINTMSK/2的bit19,bit18,OEPIntMsk和IEPIntMsk作為所有的OUT和IN端點(diǎn)的中斷使能,對(duì)應(yīng)的狀態(tài)寄存器是GINTSTS/2。
然后DIEPMSK和DOEPMSK控制所有的OUT和IN端點(diǎn)的中斷類型,哪些使能。
對(duì)應(yīng)的狀態(tài)寄存器是DIEPINTi 和DOEPINTi。
最后DAINTMSK控制某一個(gè)端點(diǎn)是否使能中斷。對(duì)應(yīng)的狀態(tài)寄存器是DAINT。
注意
DIEPMSK和DOEPMSK是對(duì)所有端點(diǎn)的配置,不能對(duì)某一個(gè)端點(diǎn)使能某些類型中斷,對(duì)另外一個(gè)端點(diǎn)使能其他類型的中斷。
以上形成了金字塔式的總分式,層層控制的中斷開關(guān)控制。
而中斷的處理順序是層層解析的方式,先通過
DAINT查看是哪個(gè)端點(diǎn)產(chǎn)生的中斷,然后通過DIEPINTi 和DOEPINTi確認(rèn)對(duì)應(yīng)端點(diǎn)具體的中斷類型。
DAINT的標(biāo)志的置位和清除是跟著DIEPINTi 和DOEPINTi變化的,該寄存器軟件只讀。對(duì)應(yīng)DIEPINTi 和DOEPINTi寄存器有標(biāo)志置位則該寄存器對(duì)應(yīng)位置位,DIEPINTi 和DOEPINTi寄存器所有標(biāo)志位清除則該寄存器對(duì)應(yīng)位清除。
而GINTSTS.OEPInt和GINTSTS.IEPInt是跟著DAINT的狀態(tài)走的,軟件也是只讀的,DAINT對(duì)應(yīng)位有置為則該位置位,DAINT中對(duì)應(yīng)所有寄存器都清零,則該位也清零。
DIEPINTi 和DOEPINTi寄存器的標(biāo)志都是寫1清零。所以對(duì)于IN和OUT中斷的標(biāo)志清除,只需要對(duì)這兩個(gè)寄存器對(duì)應(yīng)位寫1清零即可。DAINT和GINTSTS.OEPInt和GINTSTS.IEPInt是根據(jù)上述寄存器狀態(tài)硬件清除無需軟件手動(dòng)清。
對(duì)比DIEPMSK和DIEPINTi可知,DIEP的NYET,Bble,PktDrp,TxFEmp是不受MASK控制的。
對(duì)比DOEPMSK和DOEPINTi可知,DOEP的StupPktRcvd,PktDrpSts是不受MASK控制的。
對(duì)比如IN和OUT中斷類型有一些相同的,有一些不一樣的,比如OUT多了Setup等。
拓?fù)浣Y(jié)構(gòu)如下
3.2中斷處理
前面提到控制傳輸對(duì)應(yīng)端點(diǎn)0,和其他端點(diǎn)沒什么本質(zhì)區(qū)別。其中斷狀態(tài)主要關(guān)注
DIEPINTn和DOEPINTn兩個(gè)寄存器以確定具體的中斷類型。
前面回顧了控制傳輸有3個(gè)階段,所以對(duì)于驅(qū)動(dòng)編寫來說重點(diǎn)要知道當(dāng)前處于什么階段以決定下一步軟件要怎么做,所以軟件一般使用狀態(tài)機(jī)記錄當(dāng)前狀態(tài)然后根據(jù)中斷標(biāo)志確定下一個(gè)階段。從上面可以看到DIEPINTn和DOEPINTn兩個(gè)寄存器有很多的中斷類型,并不是所有的都和控制傳輸?shù)碾A段有關(guān)的,控制器設(shè)計(jì)時(shí)就考慮到了這一點(diǎn),盡量精簡(jiǎn)標(biāo)志的邏輯,通過盡可能少的標(biāo)志組合可以確定當(dāng)前階段。
手冊(cè)《10.3.1 Interrupt Handling》中做了一個(gè)總結(jié),
軟件只需要關(guān)心以下標(biāo)志即可
DIEPINTn.XferCompl 如果描述符中IOC設(shè)置,表示IN端點(diǎn)對(duì)應(yīng)的描述符處理完
DIEPINTn.InTknTxfEmp TxFIFO空時(shí)收到了主機(jī)發(fā)的IN令牌,此時(shí)設(shè)備沒有數(shù)據(jù)可回
DOEPINTn.XferCompl 如果描述符中IOC設(shè)置,表示OUT端點(diǎn)對(duì)應(yīng)的描述符處理完
DOEPINTn.SetUp 表示控制器在Setup包后收到了IN和OUT令牌。
DOEPINTn.StsPhseRcvd 控制寫傳輸主機(jī)切換到了狀態(tài)階段,此時(shí)設(shè)備需要發(fā)狀態(tài)包(0長(zhǎng)包)
當(dāng)控制器看到需要為OUT端點(diǎn)設(shè)置多個(gè)中斷位時(shí),控制器會(huì)對(duì)這些中斷設(shè)置進(jìn)行一些優(yōu)化,減少中斷的有效組合的數(shù)量,以簡(jiǎn)化應(yīng)用程序處理。
控制器對(duì)中斷處理的優(yōu)先級(jí)如下
DOEPINTn.XferCompl>DOEPINTn.StsPhseRcvd(SI)>DOEPINTon.SetUp.
基于此,應(yīng)用程序只需要解碼下表中所示的OUT端點(diǎn)的中斷組合:
場(chǎng)景 | StsPhseRcvd (SI) | SetUp (SPD) | XferCompl (IOC) | 說明 |
---|---|---|---|---|
A | 0 | 0 | 1 | 控制器更新了描述符,軟件需要查詢描述符的SR位以確定數(shù)據(jù)是SETUP包還是OUT傳輸?shù)臄?shù)據(jù)。 |
B | 0 | 1 | 0 | 前面收到了SETUP包且Setup階段完成,即收到了Setup包的內(nèi)容。 |
C | 0 | 1 | 1 | 控制器更新了描述符,對(duì)應(yīng)Setup包。且Setup階段完成。 |
D | 1 | 0 | 0 | 控制OUT傳輸,主機(jī)切換到了狀態(tài)階段。 |
E | 1 | 0 | 1 | 在A的基礎(chǔ)上且主機(jī)切換到了控制寫的狀態(tài)階段,即D+A. |
總結(jié)一下就是B和C確定當(dāng)前處于Setup完成階段,根據(jù)Setup包內(nèi)容軟件決定后面是發(fā)數(shù)據(jù)還是讀數(shù)據(jù),還是回狀態(tài)包(無數(shù)據(jù))。
D和E確定當(dāng)前處于控制寫的狀態(tài)階段,設(shè)備需要回0長(zhǎng)包。
A需要根據(jù)描述符的SR位以確定當(dāng)前是收到的SETUP包還是OUT數(shù)據(jù)包。
四.總結(jié)
本篇重點(diǎn)介紹了中斷相關(guān)寄存器,以及OUT端點(diǎn)相關(guān)中斷的組合以確定當(dāng)前處于控制傳輸?shù)氖裁措A段。兩者都是驅(qū)動(dòng)編寫的重點(diǎn)需要理解的內(nèi)容。下一篇我們繼續(xù)介紹控制傳輸,軟件的編寫。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5343瀏覽量
120332 -
usb
+關(guān)注
關(guān)注
60文章
7945瀏覽量
264600 -
編程
+關(guān)注
關(guān)注
88文章
3615瀏覽量
93719 -
中斷
+關(guān)注
關(guān)注
5文章
898瀏覽量
41492 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5047瀏覽量
97442 -
代碼
+關(guān)注
關(guān)注
30文章
4787瀏覽量
68591 -
單板計(jì)算機(jī)
+關(guān)注
關(guān)注
0文章
74瀏覽量
15631 -
編譯
+關(guān)注
關(guān)注
0文章
657瀏覽量
32869 -
驅(qū)動(dòng)開發(fā)
+關(guān)注
關(guān)注
0文章
130瀏覽量
12075 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
128
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論