| 嵌入式USB開發 |
| ------------------------------------------------------------------------------------------ |本文轉自公眾號,歡迎關注
基于DWC2的USB驅動開發-0x04 DWC2 USB2.0 IP 架構介紹 (qq.com)
話說上傳圖片限制的數量也太小了,后面還有幾張圖片傳不上去沒辦法只能空著了。
前言
這一篇先對IP的架構進行一些介紹,內容比較多所以重點關注和軟件相關的內容。后續編程具體涉及時,可能再返回過來詳讀某一個部分。
系統級架構
IP可以配置為Slave-Only模式,Internal DMA模式,External模式。如果配置為DMA模式則也支持Slave模式可以軟件禁用DMA,而配置為Slave-Only模式則不支持DMA模式。只能在初始化時要么選擇DMA要么選擇Slave模式,不能動態修改。
Slave-Only模式
該模式可以減少IP的面積,此時需要CPU去執行memory到DWC-otg之間的數據搬運,占用CPU的帶寬效率比較低。
此時CPU是AHB的主設備,CPU負責搬運數據。
Internal DMA模式
使用DWC-otg內部的DMA,由其進行memory到DWC-otg之間的數據搬運,不占用CPU的帶寬,CPU只需要負責完成中斷和錯誤等處理。
此時內部DMA是AHB的主設備,負責搬運數據。
該模式又分為
Buffer DMA和Scatter/Gather DMA模式兩種。
前者一次只能處理一個緩沖區,而后者一次處理一個鏈表的緩沖區效率更高。
注意使能了內部DMA模式還是可以使用Slave模式的,所以上圖由AHB Slave和AHB Master兩個接口。而Slave-Only的配置只有AHB Slave接口。
External DMA Controller 模式
類似于內部DMA模式,只是使用的外部的DMA,此時DWC_otg和AHB之間只有AHB Slave接口。
如下圖使用的是DW_ahb_dmac的DMA,和DWC_otg之間有一個Gasket中間接口轉換。
DW_ahb_dmac也可以換為其他的DMA。
同樣使能外部DMA模式還是可以使用Slave模式的。
PMU模塊
實現以下功能
- 休眠Hibernation:suspend期間完全關閉DWC_otg
支持以下配置:OTG 模式, OTG 和 Non-OTG的主機設備模式。
UTMI+, ULPI, HSIC, IC_USB 和FS 專用接口
內部Buffer DMA
內部Descriptor Based DMA
External DMA
External DMA
- ADP
層次結構
框圖如下
功能框圖
主機架構
主機的非周期OUT傳輸使用一個發送FIFO
所有的周期OUT傳輸使用另一個發送FIFO
這些FIFO用于緩存USB的數據包的payload。
主機通過請求隊列(一個用于周期性隊列,一個用于非周期性隊列)傳輸USB事務。
請求隊列中的每個條目都保存in或OUT通道號以及在USB上執行事務的其他信息。
將請求寫入隊列的順序決定了USB上的事務順序。
主機首先處理周期性請求隊列,然后在每個(微)幀的開頭處理非周期性請求排隊。
主機的所有周期和非周期接收到只使用同一個FIFO,用于緩存接收的USB數據包的payload,接收到的每個數據包的狀態也進入FIFO,狀態條目保存IN信道號以及其他信息,例如接收的字節計數和有效性狀態,以在AHB上執行事務。
設備架構
發送支持共享緩沖區和獨立緩沖區兩種方式
由IP配置參數OTG_EN_DED_TX_FIFO配置
Shared Transmit FIFO
配置OTG_EN_DED_TX_FIFO=0為該模式
該方式減少了IP的門數,適用于同一時間只有一個非周期IN端點工作的場景,因為非周期端點只有一個緩沖區。需要軟件去管理當前緩沖區給哪個端點使用。并且一旦出現錯誤軟件需要進行處理重新使能端點,這一點需要注意。
注意的是這里是非周期端點公用一個發送緩沖區,對于非周期端點需要管理當前給哪一個端點使用。對于周期端點還是每一個周期端點獨享一個發送緩沖區的。
FIFO由DMA或者由CPU寫入數據。在收到IN令牌后硬件自動從FIFO中搬運數據到USB總線中去。
設備模式周期FIFO(FIFO-1),和主機模式周期FIFO (PTxF 1)共用。根據實際周期IN個數后面使用FIFOs 2 到 n。
Dedicated Transmit FIFO
配置OTG_EN_DED_TX_FIFO = 1
不需要處理FIFO的錯誤。
FIFOs 2 到 n給所有IN端點使用,不管是周期還是非周期端點每個都獨立使用一個,和Shared模式只有周期端點才獨立擁有FIFO不一樣。
當選擇DMA模式時,控制器還支持發送和接收方向上的閾值設置,此時FIFO可以設置為小于一個USB包的大小。
閾值設置:
支持同步和非同步發送閾值分別使能;
支持AHB 和MAC傳輸設置兩種閾值值。
控制器自動管理溢出,發送下溢時,即控制器想要從FIFO中取數據發送時發現沒有數據可取產生下溢出underrun,此時會反轉CRC值使得其變為錯誤數據包。
而在接收上溢時overflow,接接收到USB數據往FIFO里寫時發現FIFO滿了,此時自動產生NAK,并且指針繞回。所以最好設置FIFO是兩倍閾值大小,進行ping-pang。
Single Receive FIFO
以上介紹的是發送FIFO,對于接收FIFO只有一個。即所有OUT端點都是使用一個FIFO。
接收FIFO保存接收數據包的狀態,例如字節計數、數據PID和接收數據的有效性。
DMA或CPU在接收數據時從接收FIFO中讀取數據。
DWC_otg_core
使能 Dynamic FIFO Sizing時可以動態修改FIFO的大小。
AHB總線接口單元BIU
即AHB總線接口單元
主機模式
設備模式
分為AHB主和AHB從接口。
AHB從總線接口單元 (BIUS)
AHB從接口單元將AHB cycles轉換為CSR寫入/讀取、數據FIFO讀取/寫入和DFIFO push/pop信號。DFIFO讀/寫訪問僅用于測試目的。
完全兼容AMBA 2.0-Compliant AHB Slave
支持INCR4, INCR8, INCR16, INCR 和 SINGLE
支持忙和提前終止
CSR和DFIFO讀取/寫入必須始終為32位;8位和16位寫訪問將未知值寫入DFIFO。
僅生成OK響應
不生成SPLIT、RETRY或ERROR響應
站在CPU軟件角度,作為AHB主,可以看到如下地址空間
CSR寄存器部分
DFIFO部分,Slave模式CPU直接訪問,DMA模式由DMA復制和系統memory之間搬運數據。
還有最后一部分用于調試的直接訪問DFIFO地址空間
注意在SPRAM中還會存儲一些寄存器信息
Scatter/Gather DMA模式每個端點需要占用4x35位的空間(SRAM中WORD單位是35位的,因為要存其他信息),
DMA 和 Slave模式,每個端點占用1x35位空間。
以上每個4k空間對應一個端點的FIFO數據。
讀這些4k空間實際就是讀RXFIFO
寫設備的非周期IN端點和主機的非周期OUT通道對應TxFIFO
主機模式寫任意周期OUT通道也是寫公用的TxFIFO
在設備模式訪問周期IN端點或者Dedicated FIFO模式的所有IN端點映射到對應的周期 (Dedicated FIFO的周期或非周期 ) Tx FIFO。設備端點控制寄存器的位30:27將端點映射到特定周期FIFO。
Shared FIFO模式IN INTERRUPT可以映射到Non-periodic Tx FIFO或者單獨的Periodic Tx FIFO。
SRAM映射
AHB主總線接口單元 (BIUM)
即控制器deDMA作為AHB主,負責控制器內部RAM和系統memory之間搬運數據。
完全兼容AMBA 2.0-compliant AHB Master
支持burst類型:SINGLE, INCR, INC4, INC8,和 INC8
選擇INC4, INC8, 或 INC16 時可能使用SINGLE 和 INCR
剩余長度不足burst長度,SPLIT后的數據傳輸,RETRY后的數據傳輸時使用INCR
處理AHB拆分、RETRY、ERROR條件和提前終止
應用程序需要時可插入BUSY cycle
處理AHB 1KB邊界
AHB傳輸數據地址總線都是32位對齊,控制器可以傳輸2字節和1字節。
控制和狀態寄存器CSR
軟件的角度需要注意
寄存器PCGCCTL和GINTSTS的b[31:29]不位于AHB時鐘域,所以 Power Down模式這些寄存器還是有效的。
主機和從機共享寄存器地址節省空間,但是如果入籍模式訪問設備寄存器或者反之則會產生GINTSTS.ModeMis中斷。
應用接口單元AIU
包括AHB主,AHB哦那個 包FIFO控制,CSR
包括DMA調度DSCH等功能
包FIFO控制器PFC
實現USB數據包的管理,以及包到內部SRAM的傳輸等。
需要注意下在SPRAM的最后,有一個EPINFO_CTL用于管理端點的信息。
MAC
該模塊處理USB傳輸,設別,主機,OTG的協議才是真正的核心部分。
PHY接口單元PIU
支持不同的PHY接口
喚醒和功耗控制WPC
用于Suspend喚醒管理等
鏈表處理器
實現Descriptor-Based Scatter/Gather DMA的處理
電源管理單元架構
DWC_otg_pmu模塊支持休眠,
包括
- PMU Slave,支持CPU通過AHB控制PMU的邏輯,即作為AHB的從接口。即訪問寄存器GPWRDN。
- PMU Logic模塊,實現不同PHY類型的喚醒邏輯。
UTMI+ 和HSIC 接口
IC_USB 和 FS專用接口
ULPI接口
控制器休眠時驅動PHY接口信號,
為DWC_otg_pmu_ifmux模塊解碼lineestate
- PMU IfMux 模塊 該模塊實現多路line_state復用,檢測line_state改變,多路復用不同接口的狀態,檢測狀態的改變,OTG Revision 2.0 和 OTG Revision 1.3 SRP的檢測。
- PMU Sync 模塊 用于同步DWC_otg_pmu_ahb_slv和PMU接口邏輯的時鐘域信號。
- ADP模塊 支持ADP:Attach Detection Protocol探測和活動感知,需要IP配置OTG_ADP_SUPPORT=1
對于軟件來說其細節可以稍微看一下即可。
需要注意有幾個寄存器是位于pmu域的:
GPWRDN
系統時鐘和復位
DWC_otg有以下輸入時鐘
Hclk:AHB域的時鐘。
Pmu_hclk:PMU域的時鐘,休眠和/或ADP 時使用。
utmi_clk:選擇UTMI PHY時使用。
ulpi_clk:選擇ULPI PHY時使用。ULPI使用DDR模式時 負邊沿也使用。
utmifs_clk48: OTG_FSPHY_INTERFACE != 0時才有。
ref_clk:OTG_SERV_INT_ENH使能時才有。
DWC_otg_clkrst模塊還會產生以下輸出時鐘
phy_clk: 受門控,從ULPI, UTMI+, USB 1.1 FS 時鐘, USB 1.1FS 時鐘/8 中選擇。
wpc_clk:不受門控,OTG_EN_PWROPT不為0時才有。從ULPI, UTMI+, USB 1.1 FS 時鐘中選擇。
hclk_gated: OTG_EN_PWROPT不為0才有,hclk門控后的輸出,以優化功耗。
utmifs_clk6:ULPI, UTMI+, 或 USB 1.1 FS 時鐘/8,USB 1.1 FS Serial Transceiver 接口使能才有。
系統時鐘速度配置如下
系統時鐘對最小包間間隙和設備支持的級聯集線器數量的影響
當DWC_otg控制器充當設備時,根據UTMI規范,對于接收后緊接著的接收,有最壞情況下的響應時間。這種最壞情況下的響應時間取決于AHB時鐘頻率。AHB時鐘快處理的快,這個時間就小。
控制器寄存器在AHB域中,并且在更新這些寄存器值之前,控制器不接受另一個令牌。
當AHB時鐘與PHY時鐘相同時,此最壞情況值為七個PHY時鐘。當AHB時鐘較快時,該值較小。
以下場景可能產生接收后緊接著接收的情況:
- 來自主機的任何響應令牌(ACK/NAK/NYET/STALL),后跟一個令牌。
- 作為一種特殊情況,ISOC OUT數據包,后面緊跟著下一個令牌。
系統級影響
在系統級別,上述這種限制可能會降低設備控制器的性能,因為當令牌太靠近前面的ISOC OUT令牌的末尾時,控制器會丟棄或向主機發送NAK。
對于批量、中斷和控制事務,系統會隨著主機重試令牌而恢復,事務最終會完成。
而對于等時ISO事務,因為沒有重發機制,主機進行到為間隔bInterval安排的下一個事務。
在以下情況下會出現顯著的性能下降:
該設備連接到一個主機,該主機能夠在88-96位時間內一致地發送令牌,也就是說,從前面的ISOC OUT令牌結束算起,有六到七個PHY時鐘
該設備通過多層集線器連接到主機,使得ISOC OUT令牌和后續令牌之間的數據包間間隙縮小到小于七個PHY時鐘
但是,在這兩種情況下,系統都不會停止響應或進入不可恢復狀態,只會影響性能。
此時控制器的行為
以下是ISOC OUT Token緊接著下一個Token時的控制器信號
(缺圖)
- 在PHY時鐘域 (PCLK) 處理ISOC OUT token。
- 更新AHB時鐘(HCLK)域中的相關寄存器。
- 在處理UTMI接口上接收的下一個令牌之前,等待從AHB時鐘域到PHY時鐘域的完成握手。
- ti_trans_done信號是在PHY時鐘域中生成的用于更新AHB時鐘域寄存器的觸發信號。控制器等待來自AHB時鐘域的握手,以便此寄存器更新接受下一個令牌
- sh2pt_reg_vld信號是來自AHB時鐘域的握手信號,其指示寄存器更新在AHB時鐘域中完成。
- txrx_state信號在將接收到的數據推送到RxFIFO時處于RCVD_DATA狀態,在計算CRC時處于CHKCRC16狀態,以及在推送包的接收狀態時處于DATA_to_STS狀態。
- 在解碼接收到的令牌時,tkn_state信號處于tkn_DECODE狀態
M5-M3:RX開始延遲,DP/DM線上SYNC域的第一位與RXACTIVE有效之間的時間。
M2-M1:RX結束延遲,EOP的最后一位和RXACTIVE無效之間的時間
M3-M1:在DP/DM線路上測量的RX到RX數據包間延遲
M4-M2:
對于16位UTMI模式:從rx_active無效到CRC計算的一個PHY時鐘周期
對于8位UTMI模式:從rx_active無效到CRC計算的三個PHY時鐘周期
從RXACTIVE無效到txrx_state之間的時間為CHK_CRC16
M5-M4:接收數據包狀態推送的三個PHY時鐘周期,DATA_TO_STS狀態下txrx_state信號所用的時間.
M6-M5:寄存器更新觸發脈沖同步延遲+寄存器更新tog脈沖握手同步延遲。ti_trans_done信號切換到sh2pt_reg_vld脈沖之間的時間。
M6-M5:在PIE接收和解碼令牌的七個PHY時鐘周期。RXACTIVE有效和tkn_state之間的時間為tkn_END。
計算所需的最低AHB時鐘頻率
為了計算克服ISOC OUT包間間隙限制所需的最小AHB時鐘頻率,需要確定控制器完成以下兩個過程所需的時間:
接收到ISOC OUT令牌后,更新AHB時鐘域中的控制器寄存器
解碼下一個接收到的令牌
為了克服這一限制,使得控制器不會丟棄在ISOC OUT令牌之后太近接收到的任何令牌
更新AHB時鐘域中的控制器寄存器所需的時間應該小于或等于解碼下一個接收到的令牌所需的時刻。此條件構成計算所需最小AHB時鐘頻率的基礎。
給定UTMI PHY 位寬和最小包見間隙,下表列出了AHB 為了滿足不丟棄任何包必須達到的最小頻率。
(缺圖)
對于32 HS bit 時間間隙,UTMI8位寬時,最少要96-MHz HCLK。
系統時鐘對設備支持的級聯集線器數量的影響
(缺圖)
對于在多層集線器上使用等時OUT端點的設備,建議使用8位UTMI模式和96MHz或更高的AHB時鐘頻率。
系統時鐘和復位產生
有兩個外部復位輸入,復位是軟件初始化時需要做的。
hreset_n: hclk 和pmu_hclk域復位
prst_n: phy_clk 域復位
DWC_otg控制器的所有輸入復位都可以異步復位,但解除復位必須與配置中選擇的時鐘同步。
每當軟件在重置后更改PHY選擇位(USB 1.1 FS收發器、UTMI+或ULPI)時,它必須復位軟件重置,因為PHY部分位會更改PHY接口單元的時鐘。
USB 1.1 FS收發器接口
發送數據
(缺圖)
接收數據
(缺圖)
支持Micro-AB 插座的嵌入式主機
IP參數配置OTG_MODE=0,1, 或者 5支持該功能.
在不支持SRP的配置中,需要外部邏輯來基于ID值控制PHY DRVVBUS,因為控制器內部不含OTG狀態機,并且PHY DRVBUS沒有連接到DWC_OTG控制器。
在這種配置為了支持Micro-AB插座,當ID對應于主機時, DRVVBUS必須asserted,當ID對應于設備時,必須de-asserted。
為了在控制器充當嵌入式主機時啟用Micro-AB 插座支持,utmiotg_idig輸入信號也僅存在于支持SRP的主機模式(OTG_mode=5)中。如果嵌入式主機僅支持標準A連接器,則將DWC_otg控制器的utmiotg_idig輸入信號線硬連接到零。
總結
以上從整體框架上去了解了IP,先不必要全部理解,內容很多大概知道框架即可,后面編程有需要再回過頭來參考。
審核編輯 黃宇
-
usb
+關注
關注
60文章
7945瀏覽量
264639 -
USB2.0
+關注
關注
2文章
186瀏覽量
46097 -
IP
+關注
關注
5文章
1708瀏覽量
149542 -
dma
+關注
關注
3文章
561瀏覽量
100584 -
USB驅動
+關注
關注
1文章
136瀏覽量
20197 -
DWC2
+關注
關注
0文章
35瀏覽量
132
發布評論請先 登錄
相關推薦
評論