基于DWC2的USB驅(qū)動開發(fā)-0x08 GLPI接口詳解 (qq.com)
1.1 前言
進行USB驅(qū)動開發(fā),有必要了解整個數(shù)據(jù)流涉及的設(shè)備,而PHY是重要的一環(huán),它負責物理層的處理,是模擬數(shù)字的橋梁。而PHY的了解重點是其和LINK之間的接口,USB中PHY和LINK之間的標準接口是UTMI,而ULPI是其低引腳的實現(xiàn)。
介紹ULPI之前有必要先了解下GLPI,因為ULPI是基于GLPI的一個具體的實現(xiàn)。
GLPI即Generic Low Pin Interface,通用低引腳接口,是應(yīng)用于LINK和PHY之間的接口??梢曰诖私涌诙x特定應(yīng)用的接口,也就是該接口規(guī)范是一個通用的接口設(shè)計,可以基于此有具體的應(yīng)用實現(xiàn),比如基于該接口實現(xiàn)UTMI協(xié)議的低引腳接口即ULPI。
1.2信號
- GLPI定義了如下的信號,這些信號是通用的,可以用于傳輸不同的數(shù)據(jù)類型。根據(jù)應(yīng)用的不同,數(shù)據(jù)流可以用于發(fā)送和接收數(shù)據(jù)包、訪問寄存器集、生成中斷,甚至重新定義接口本身。
- 所有信號都是和clock同步的,如果沒有clock則所有信號也可以是異步的。也就是規(guī)范本身并沒有完全限定死一定要clock,一定要是同步的。
- 作為通用接口,規(guī)范并不規(guī)定數(shù)據(jù)流本身,數(shù)據(jù)流定義是特定應(yīng)用實現(xiàn)決定的,只要具體的實現(xiàn)明確定義,實現(xiàn)互操作性即可。
- 通常來說控制信號dir、stp和nxt是在假設(shè)PHY是數(shù)據(jù)總線的主機的情況下指定的。當然為了通用性,也并沒有完全限定死。如果需要,實現(xiàn)也可以將LINK定義為主機此時則控制信號的方向和前者要顛倒過來。
信號 | 方向(以PHY的角度看) | 描述 |
---|---|---|
PHY****接口 | 以下都是以PHY作為主機描述 | |
clock | I/O | 接口時鐘.雙向都可以,即可以LINK產(chǎn)生該時鐘也可以PHY產(chǎn)生該時鐘,即對應(yīng)于PHY時鐘的兩種模式,后面文章會講到.如果有clock所有信號都是和clock同步的.當然本規(guī)范也沒有限定死,即實現(xiàn)也可以沒有clock則所有信號都是異步的。所有信號和clock的上升沿同步。 |
data | I/O | 雙向數(shù)據(jù)總線,空閑時LINK驅(qū)動為低,LINK和PHY驅(qū)動為非0的數(shù)據(jù)則表示有數(shù)據(jù)傳輸。(為什么? 如果一方驅(qū)動為0則另一方怎么驅(qū)動? 因為誰低誰強) .從后面總線權(quán)限可以看出不會出現(xiàn)主從都驅(qū)動總線的情況,?因為總線所有權(quán)由主機調(diào)度,且由dir決定。并且驅(qū)動為0只是一個特殊值,用于區(qū)別其他正常數(shù)據(jù)的情況,理論上驅(qū)動為全1也?可以。這里為什么LINK一定要發(fā)一個數(shù)據(jù)是因為PHY不發(fā)數(shù)據(jù)就拉低dir監(jiān)聽數(shù)據(jù),所以CLK上升沿總是會采集到數(shù)據(jù)用一個特殊值來表示空閑無效數(shù)據(jù)?。 總線的擁有權(quán)是由主機決定的,比如PHY作為主機則由PHY驅(qū)動dir來決定.在clock的上升沿同步數(shù)據(jù)即單邊沿模式.當然實現(xiàn)也可以設(shè)計為雙邊沿傳輸數(shù)據(jù)模式。 |
dir | OUT | 主機驅(qū)動dir決定data總線的所有權(quán).如果PHY有數(shù)據(jù)需要傳輸給LINK,則PHY驅(qū)動dir為高擁有總線.如果PHY沒有數(shù)據(jù)要傳輸給LINK則拉低dir,表示LINK擁有data總線,此時PHY監(jiān)聽總線有非0 的數(shù)據(jù)則表示LINK發(fā)過來了數(shù)據(jù)給PHY.如果PHY不能接收LINK的數(shù)據(jù)也可以拉高dir.比如PHY的PLL沒有穩(wěn)定時就會拉高dir,此時LINK不能往PHY發(fā)非0數(shù)據(jù). |
stp | IN | 停止.LINK拉高該信號1個時鐘來停止當前的數(shù)據(jù)流(LINK到PHY的或者PHY到LINK的).如果此時是LINK發(fā)送數(shù)據(jù)到PHY,LINK拉高stp則表示前一個時鐘的數(shù)據(jù)是最后一個數(shù)據(jù).原文是stp indicates thelast byte of data was on the bus in the previous cycle 我覺的從后面波形圖理解來說應(yīng)該不是前一個時鐘而應(yīng)該就是本STP拉高對應(yīng)的CLK上升沿的數(shù)據(jù)是最后一個數(shù)據(jù)。 如果此時是PHY發(fā)送數(shù)據(jù)到LINK,LINK拉高stp則PHY會強制停止本次數(shù)據(jù)發(fā)送,并且PHY會拉低dir,表示交出數(shù)據(jù)總線控制權(quán)給LINK。 |
nxt | OUT | PHY拉高nxt表示是否還有數(shù)據(jù)或者是否接收到數(shù)據(jù).1.如果LINK發(fā)送數(shù)據(jù)給PHY,PHY拉高nxt表示當前字節(jié)被PHY接收了.LINK可以在下一個時鐘繼續(xù)發(fā)送數(shù)據(jù)給PHY.。2.如果是PHY發(fā)送數(shù)據(jù)給LINK則PHY拉高nxt表示后面還有數(shù)據(jù)LINK可以繼續(xù)讀。 |
1.3 協(xié)議
1.3.1 總線所有權(quán)
非特殊實現(xiàn)都是PHY作為主機,PHY驅(qū)動dir來決定總線的所有權(quán)。
PHY需要發(fā)送數(shù)據(jù)時拉高dir,其他時候都是拉低dir監(jiān)聽總線。
如果LINK需要獲取總線權(quán)可以等PHY發(fā)送完不再需要發(fā)送數(shù)據(jù)時PHY主動拉低dir,LINK也可以主動拉高stp一個時鐘來結(jié)束PHY的發(fā)送,讓PHY主動讓出總線所有權(quán),讓LINK來發(fā)送數(shù)據(jù),這種情況LINK主動請求的則必須進行一次數(shù)據(jù)發(fā)送,PHY才會重新拉高dir重新?lián)碛锌偩€。
dir為0時LINK擁有總線所有權(quán),LINK可以往data總線發(fā)數(shù)據(jù),
dir為1時PHY擁有總線所有權(quán),PHY可以往data總線發(fā)數(shù)據(jù),
所有信號都是和CLK同步的,且在CLK的上升沿修改數(shù)據(jù),所以CLK的上升沿時dir翻轉(zhuǎn),
dir翻轉(zhuǎn)時的那一個CLK叫做turnaround,LINK和PHY都不能往data總線發(fā)送數(shù)據(jù),LINK和PHY也要丟棄該時候的總線數(shù)據(jù)。
所以在實現(xiàn)時dir可以直接用于控制PHY和LINK的輸出緩沖器,只是PHY和LINK兩邊的使能電平是反的。
- dir為低,LINK擁有總線所有權(quán),LINK可以往總線發(fā)數(shù)據(jù)
- dir翻轉(zhuǎn)時對應(yīng)的那一個CLK,LINK和PHY都不能發(fā)數(shù)據(jù),總線上的數(shù)據(jù)無效,即turnaround
- dir為高,PHY擁有總線所有權(quán),PHY可以往總線發(fā)數(shù)據(jù)
- dir和clock同步,dir總是在clk的上升沿翻轉(zhuǎn)
1.3.2 傳輸數(shù)據(jù)
- dir為0, LINK擁有總線所有權(quán),而LINK又沒有數(shù)據(jù)要發(fā)給PHY,此時就是空閑階段,LINK驅(qū)動data總線為0,此時PHY監(jiān)聽到全0就認為是無效數(shù)據(jù).
- dir為0, LINK擁有總線所有權(quán),LINK有數(shù)據(jù)要發(fā)送給PHY,則LINK驅(qū)動總線為非0值D0。
但是此時PHY拉低了nxt,表示不能接收,所以LINK只能下一個CLK重發(fā)D0
- PHY收到LINK發(fā)送過來的數(shù)據(jù)D0,拉高nxt,表示PHY收到了,這樣LINK可以繼續(xù)發(fā)D1。
- LINK主動拉高stp表示結(jié)束傳輸
- stp保持高一個CLK后拉低,此時PHY也會拉低nxt,如果PHY需要發(fā)送數(shù)據(jù),需要擁有總線權(quán)則會拉高dir,否則會繼續(xù)拉低dir等待LINK的下一次傳輸。上圖中dir拉高了,說明PHY需要發(fā)數(shù)據(jù)了,dir拉高的一個CLK內(nèi)是turn around總線無效。
- Turn around之后PHY發(fā)送數(shù)據(jù)。
- PHY發(fā)送數(shù)據(jù),同時拉高nxt表示后續(xù)還有數(shù)據(jù)要發(fā)。
- PHY后面沒有數(shù)據(jù)要發(fā)了拉低nxt,并且拉低dir交出總線所有權(quán)。
所以PHY拉低nxt可以用于掐斷數(shù)據(jù)傳輸(LINK或者PHY發(fā)送的數(shù)據(jù)), 在傳輸期間,nxt可以在拉高stp的相同周期中拉高。
從以上可以看出由LINK發(fā)送最后一個字節(jié),轉(zhuǎn)到PHY發(fā)送第一個字節(jié)需要2個周期,即stp要一個周期,turn around需要一個周期。
1.3.3 停止傳輸數(shù)據(jù)
PHY可以拉高dir用于結(jié)束LINK的發(fā)送
LINK可以拉高stp一個時鐘來結(jié)束PHY的發(fā)送,此時PHY需要無條件拉低dir,準備接收LINK的數(shù)據(jù)。PHY必須等接收完LINK的數(shù)據(jù)才能重新拉高dir。也就是LINK拉高stp以結(jié)束上一次PHY的傳輸,告訴PHY強制拉低dir來使得LINK擁有總線權(quán),這也是LINK主動需要切換到總線所有權(quán)的一種方式,這時則LINK必須進行一次發(fā)送,只有這樣PHY才會重新拉高dir 使得PHY擁有總線權(quán)。這里有個未定義行為,假設(shè)LINK進行了stp拉高但是又不發(fā)送數(shù)據(jù)或者一直發(fā)送數(shù)據(jù)不stp,那么PHY是不是只能一直等待,不能重新拉高dir擁有總線權(quán)了?。
- dir為高 PHY在發(fā)送數(shù)據(jù)D2,nxt為高說明后面還有數(shù)據(jù)待發(fā)送
- dir為高 PHY在發(fā)送數(shù)據(jù)D3,nxt為低說明后面的數(shù)據(jù)無效
- 這個CLK由于前面一次nxt為低,所以數(shù)據(jù)無效,LINK不接收, nxt拉高說明下一個CLK PHY又有數(shù)據(jù)要發(fā)
- 這個CLK PHY發(fā)送D4, LINK接收,nxt為高表示PHY還有數(shù)據(jù)要發(fā),但是在此時LINK想要發(fā)送數(shù)據(jù),于是拉高stp一個CLK.
- Stp拉高一個CLK后要拉低,此時PHY無條件拉低dir交出總線所有權(quán),同時拉低nxt.
- 一個turn around時鐘后,LINK發(fā)送數(shù)據(jù)D0,此時PHY拉低nxt為0表示PHY沒有準備好接收數(shù)據(jù)
- 由于上一次PHY沒有準備好接收數(shù)據(jù),LINK只能重新發(fā)D0,此時PHY拉高nxt表示接收了數(shù)據(jù)D0
- LINK繼續(xù)發(fā)送D1,PHY拉高nxt表示接收了數(shù)據(jù)D1
- LINK發(fā)送stp主動結(jié)束發(fā)送,此時PHY也要拉低nxt。
之后PHY再看需要是不是要發(fā)送數(shù)據(jù)來決定是拉高還是拉低dir。
1.4 總結(jié)
GLPI的接口是比較簡單的,需要注意主從機,PHY是主機LINK是從機,
Stp是從機驅(qū)動,nxt和dir是主機驅(qū)動。
需要注意總線的擁有權(quán)由主機決定,主機需要發(fā)送是拉高dir擁有總線權(quán),其他時候拉低dir交出總線權(quán)監(jiān)聽總線。而LINK可以在dir為高,PHY在發(fā)送數(shù)據(jù)時主動拉高stp一個CLK來請求PHY交出總線權(quán),PHY必須無條件交出,并且必須等LINK發(fā)送完數(shù)據(jù)之后才能重新?lián)碛锌偩€。
所以關(guān)鍵點是了解誰驅(qū)動什么信號,總線擁有權(quán)的切換,了解這兩點就基本了解了該接口的邏輯了。
1.5 參考
《UTMI+ Low Pin Interface (ULPI) Specification Revision 1.1 October 20, 2004》
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
8575瀏覽量
151014 -
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264456 -
信號
+關(guān)注
關(guān)注
11文章
2789瀏覽量
76730 -
總線
+關(guān)注
關(guān)注
10文章
2878瀏覽量
88051 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
125
發(fā)布評論請先 登錄
相關(guān)推薦
評論