本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x05 DWC2 USB2.0 IP 寄存器介紹 (qq.com)
前言
驅(qū)動(dòng)的編寫無(wú)非就是寄存器的配置,所以我們先要對(duì)控制器的寄存器現(xiàn)有一個(gè)整體的概覽,知道有哪些寄存器,配置某個(gè)功能要操作哪些寄存器,寄存器的整體組織架構(gòu),等等?,F(xiàn)有了整體了解后面具體莫格模塊和功能的配置式就可以找到地方,然后參考具體的寄存器的描述進(jìn)行配置。
概覽
前面DWC_otg_core架構(gòu)部分,已經(jīng)介紹了控制和狀態(tài)寄存器CSR的一些內(nèi)容。從架構(gòu)的角度看CSR塊位于AHB時(shí)鐘域,但是有兩個(gè)特殊的,一個(gè)是電源和時(shí)鐘門控寄存器PCGCCTL和控制器中斷寄存器GINTSTS的b[31:29],這些寄存器位位于BIU從模塊中,在斷電模式下依然處于活動(dòng)狀態(tài)。為什么這兩個(gè)不一樣呢? 因?yàn)橐M(jìn)行低功耗管理,要對(duì)AHB和PHY以及RAM的時(shí)鐘進(jìn)行門控即可關(guān)閉和打開,如果位于AHB時(shí)鐘域那么關(guān)閉AHB時(shí)鐘域時(shí)這個(gè)寄存器本身也就斷電了,也就沒(méi)辦法退出斷電模式了,所以這個(gè)寄存器必須位于AHB時(shí)鐘域以外。GINTSTS的b[31:29] WkUpInt SessReqInt DisConnInt也是類似的原因。
站在USB控制器的角度,對(duì)應(yīng)的是AHB從接口,即外部CPU通過(guò)AHB主和控制器的AHB從通訊,讀寫控制器的CSR寄存器,注意控制器本身也是要寫CSR的狀態(tài)和中斷相關(guān)的寄存器的,因?yàn)橐O(shè)置中斷標(biāo)志各種狀態(tài)等,同時(shí)也要讀CSR因?yàn)橐鶕?jù)寄存器中的配置決定自己的行為。那么就存在CPU和控制器都同時(shí)去寫某些寄存器的可能,主要是中斷相關(guān)的,比如控制器要置位某個(gè)中斷位,而軟件要去清除某個(gè)中斷位,此時(shí)控制器的寫是優(yōu)先的,即控制在寫時(shí)軟件的寫會(huì)忽略掉,這么做的原因是避免丟失中斷事件。
另外注意所有寄存器都是32位訪問(wèn)的,哪怕寄存器本身只需要一個(gè)字節(jié)。由于中斷位的設(shè)置和清零分別是控制器和軟件通過(guò)AHB接口去訪問(wèn)的,可能同時(shí)寫,所以硬件上做了處理,不同中斷位的寫是完全獨(dú)立的,控制器和AHB接口可以同時(shí)寫不同的中斷位,這是硬件保證的,而不是我們通常的讀-修改-寫的實(shí)現(xiàn)方式就是出于該考慮。如果是寫同樣的中斷位呢,那就是上面說(shuō)的控制器優(yōu)先忽略AHB的寫。
為了節(jié)省空間,HSOT和DEVICE模式的寄存器是共用物理空間的,因?yàn)橥粫r(shí)間要不是主機(jī)模式要不是設(shè)備模式。另外有些寄存器要根據(jù)配置決定是否實(shí)現(xiàn),比如如果只有兩個(gè)端點(diǎn),那么其他端點(diǎn)相關(guān)寄存器就沒(méi)有實(shí)現(xiàn),但是空間還是占用的,這樣是為了方便代碼兼容,也就是寄存器的偏移地址都是固定的,沒(méi)有實(shí)現(xiàn)的的就空著。未實(shí)現(xiàn)的寄存器寫忽略讀返回值不確定。這里注意只有全局控制, 電源和時(shí)鐘門控, Data FIFO 訪問(wèn),和 Host Port 寄存器是主機(jī)和設(shè)備都可以訪問(wèn)的,其他是模式相關(guān)的寄存器。如果主機(jī)模式去寫設(shè)備相關(guān)的寄存器(反之亦然)則會(huì)產(chǎn)生GINTSTS.ModeMis事件,該為置位,如果使能了對(duì)應(yīng)中斷還會(huì)產(chǎn)生中斷,寫會(huì)忽略讀返回值不確定。
如果切換了模式則需要重新編程所有相關(guān)寄存器,就好比上電復(fù)位之后的狀態(tài)一樣。
CSR存儲(chǔ)映射
CSR的地址映射是固定的,不隨著配置改變而改變,即每一個(gè)寄存器的偏移是固定的,前面已經(jīng)解釋過(guò)了原因。主機(jī)和設(shè)備模式寄存器占用不同的地址。
整個(gè)寄存器的空間如下所示
閱讀寄存器有一些經(jīng)驗(yàn),
G開頭的代表全局控制寄存器
H開頭的代表主機(jī)相關(guān)寄存器
D開頭的代表設(shè)備相關(guān)寄存器
這樣一眼就可以看到寄存器大概是和什么相關(guān)的。
Controller Global CSRs (1 KB)部分:主機(jī)和設(shè)備模式都可以訪問(wèn)
Host Mode CSRs (1 KB):進(jìn)入主機(jī)模式需要配置的寄存器
Device Mode CSRs (1.5 KB):進(jìn)入設(shè)備模式需要配置的寄存器
Power and Clock Gating CSRs (0.5 KB):實(shí)際只有一個(gè)寄存器,電源和門控配置,主機(jī)和設(shè)備模式都可以訪問(wèn)。
Device EP x/Host Channel x FIFO (4 KB):這些寄存器在主機(jī)和設(shè)備模式下都可用,用于在給定方向上讀取或?qū)懭胩囟ǘ它c(diǎn)或通道的FIFO空間。在主機(jī)通道IN端點(diǎn)則FIFO只讀,OUT端點(diǎn)則FIFO只寫,在設(shè)備IN端點(diǎn)則FIFO只寫,OUT端點(diǎn)則FIFO只讀,注意這里的IN和OUT是符合USB規(guī)范的IN和OUT即都是針對(duì)主機(jī)而言的。
Direct Access to Data FIFO RAM for Debugging (128 KB):直接訪問(wèn)該空間可以查看RAM中數(shù)據(jù)用于調(diào)試使用。
中斷相關(guān)寄存器架構(gòu)
中斷相關(guān)寄存器非常重要,可以說(shuō)USB的驅(qū)動(dòng)就是基于中斷的驅(qū)動(dòng),所有流都是中斷去驅(qū)動(dòng)的,當(dāng)然也有所謂的基于事件的驅(qū)動(dòng)比如uC-USB實(shí)際也是在中斷服務(wù)函數(shù)中發(fā)送信號(hào)量或者事件,在某個(gè)線程中或者主循環(huán)中去處理事件,本質(zhì)還是一樣的,還是基于中斷的。中斷中根據(jù)狀態(tài)決定下一步要做什么。
對(duì)應(yīng)中斷狀態(tài)寄存器GINTSTS,中斷是一個(gè)分層的結(jié)構(gòu),即總分的形式,先整體有總的中斷狀態(tài),比如是設(shè)備IN還是OUT端點(diǎn)中斷,是主機(jī)Port還是通道相關(guān)中斷,是OTG的中斷,還是內(nèi)核相關(guān)的中斷。比如如果知道是設(shè)別IN或者OUT中斷則往下走一層看是DAINT是哪一個(gè)IN端點(diǎn)或者哪一個(gè)OUT端點(diǎn)的中斷,找到了然后再往下走一層查看具體的DIEPINTi或者DOEPINTi已確認(rèn)更詳細(xì)的中斷信息。
還有就是編程上需要注意使能中斷時(shí)一定要先清除中斷標(biāo)志再使能中斷,避免一使能中斷標(biāo)志就是置位的馬上就產(chǎn)生中斷,這也是驅(qū)動(dòng)開發(fā)的常識(shí)。
中斷架構(gòu)還支持多處理器模式,即可以將中斷信號(hào)分發(fā)到不同的處理器,以配合多處理器系統(tǒng)使用。支持多處理器中斷模式時(shí)就是多了包含EACH字樣的寄存器,供各自處理器使用對(duì)應(yīng)的中斷寄存器。
中斷的處理如下,即和上面提到的層次結(jié)構(gòu)對(duì)應(yīng)
- 先看GINGSTS總中斷狀態(tài),處理全局的中斷
- 然后看主機(jī)或者設(shè)備通道或者端點(diǎn)相關(guān)中斷狀態(tài) 比如看DAINT
- 最后看具體是哪一個(gè)端點(diǎn)或者通道比如看DIEPINTi,DOEPINTi。
主要使用的寄存器
這里先對(duì)一些高頻使用的寄存器做簡(jiǎn)單介紹,介紹其對(duì)應(yīng)的功能,詳細(xì)的可以再參考具體的寄存器描述。這樣先從整體有一個(gè)了解。
GOTGCTL全局OTG控制和狀態(tài)寄存器:控制OTG行為并反映控制器的OTG功能的狀態(tài)。 | ||
---|---|---|
11 | DevHNPEn設(shè)備設(shè)置主機(jī)協(xié)商協(xié)議使能這是設(shè)備端的操作 | 設(shè)備端收到主機(jī)的SetFeature.SetHNPEnable命令時(shí)設(shè)置該位。0HNP不使能1HNP使能 |
10 | HstSetHNPEn主機(jī)設(shè)置主機(jī)協(xié)商協(xié)議使能這是主機(jī)端的操作 | 主機(jī)端在SetFeature.SetHNPEnable命令完成后設(shè)置該位0主機(jī)設(shè)置HNP不使能1主機(jī)設(shè)置HNP使能 |
GAHBCFG:全局AHB控制寄存器,上電或者切換模式時(shí)配置AHB相關(guān)信息,只能傳輸前初始化一次 | ||
5 | DMAEn使能DMA | 只有IP配置支持DMA才可以選,如果是OTG_ARCHITECTURE = 0則固定為Slave-Only模式?jīng)]得選。0 使用Slave模式1 使用DMA模式 |
GUSBCFG:全局USB配置寄存器,上電或者切換模式時(shí)配置AHB相關(guān)信息,只能傳輸前初始化一次,USB和PHY相關(guān)配置 | ||
30 | ForceDevMode強(qiáng)制為設(shè)備模式 | 寫1強(qiáng)制為設(shè)備模式,而不管utmiotg_iddig信號(hào)。設(shè)置后需要等25mS生效。只有OTG_MODE = 0, 1 , 2時(shí)才有效。 |
29 | ForceHstMode強(qiáng)制為主機(jī)模式 | 寫1強(qiáng)制為主機(jī)模式,而不管utmiotg_iddig信號(hào)。設(shè)置后需要等25mS生效。只有OTG_MODE = 0, 1 , 2時(shí)才有效。 |
9 | HNPCapHNP功能使能 | 控制使能HNP功能,寫1使能。注意這里和上面的DevHNPEn和HstSetHNPEn不一樣,這里是有HNP的功能是否使用,只有使用了才支持HNP,才有上面的SetFeature.SetHNPEnable協(xié)商之后的結(jié)果設(shè)置。只有OTG_MODE中支持HNP的模式才有效。 |
8 | SRPCapSRP功能使能 | 寫1使能,即對(duì)于B設(shè)備請(qǐng)求連接的A設(shè)備激活VBUS和啟動(dòng)session。只有OTG_MODE中支持SRP的模式才有效。 |
6 | PHYSelPHY選擇 | 0: USB 2.0 高速 UTMI+ 或ULPI PHY,只有OTG_HSPHY_INTERFACE = 1支持高速PHY接口才能設(shè)置為01: USB 1.1 全速串行收發(fā)器,只有OTG_FSPHY_INTERFACE = 1支持全速接口才能設(shè)置為1 |
4 | ULPI_UTMI_SelPHY接口ULPI和UTMI選擇 | 0選擇UTMI+1選擇ULPI只有OTG_HSPHY_INTERFACE = 3時(shí)同時(shí)支持UTMI+和ULPI時(shí)才有的選,否則IP配置為什么就是什么。 |
3 | PHYIf選擇接口寬度 | 只對(duì)選擇了UTMI+的才可配置對(duì)于ULPI只能配置為0即8位。0 :8位1:16位 |
HCFG:主機(jī)配置寄存器,只初始化時(shí)配置一次 | ||
23 | DescDMA是否使能基于描述符的DMA | 只有IP配置支持 Scatter/Gather DMA 才能使能。有一下幾種組合GAHBCFG.DMAEn=0, HCFG.DescDMA=0 => Slave mode GAHBCFG.DMAEn=0, HCFG.DescDMA=1 => Invalid GAHBCFG.DMAEn=1, HCFG.DescDMA=0 => Buffered DMA mode GAHBCFG.DMAEn=1, HCFG.DescDMA=1=> Scatter/Gather DMAmode |
2 | FSLSSupp | 在主機(jī)模式設(shè)置該位為1則不管設(shè)備支持什么速度都枚舉為全速或者低速,而如果設(shè)置為0則根據(jù)實(shí)際設(shè)備支持什么速度就枚舉成什么速度。 |
HCCHARn:主機(jī)通道相關(guān)特性設(shè)置 | ||
19:18 | EPType | 設(shè)置通道類型00: Control01: Isochronous10: Bulk11: Interrupt |
15 | EPDir | 端點(diǎn)方向0:OUT1:IN |
14:11 | EPNum | 端點(diǎn)號(hào) |
10:0 | MPS | 對(duì)應(yīng)端點(diǎn)最大包大小 |
HCTSIZn:主機(jī)通道傳輸大小配置 | ||
30:29 | PID | 應(yīng)用設(shè)置數(shù)據(jù)的初始類型,后續(xù)的控制器硬件自動(dòng)更新(所以這里明確了哪些是軟件做哪些是硬件做,之前就提到過(guò)寫驅(qū)動(dòng)理解這一點(diǎn)很重要,這些信息都是從手冊(cè)中獲取)00: DATA001: DATA210: DATA111: MDATA (non-control) |
DCFG:設(shè)備配置寄存器,枚舉或者控制為設(shè)備模式時(shí)配置,只初始化配置一次 | ||
25:24 | PerSchIntvl | 周期調(diào)度間隔只有Scatter/Gather DMA模式才有配置一個(gè)微幀內(nèi)DMA花多少時(shí)間去處理同步IN數(shù)據(jù),剩余的時(shí)間處理非同步傳輸。對(duì)于UVC 同步傳輸?shù)瓤梢蕴岣咴撝狄赃_(dá)到高傳輸速率。如果沒(méi)有同步端點(diǎn)則該配置被忽略。00: 25% of (micro)frame.01: 50% of (micro)frame.10: 75% of (micro)frame.11: Reserved |
23 | DescDMA | 只有IP配置支持 Scatter/Gather DMA 才能使能。 支持的組合如下GAHBCFG.DMAEn=0,DCFG.DescDMA=0 => Slave mode GAHBCFG.DMAEn=0,DCFG.DescDMA=1 => Invalid GAHBCFG.DMAEn=1,DCFG.DescDMA=0 => Buffered DMA mode GAHBCFG.DMAEn=1,DCFG.DescDMA=1 => Scatter/Gather DMA mode |
10:4 | DevAddr | 收到主機(jī)的SetAddress命令后設(shè)置對(duì)應(yīng)的地址值 |
1:0 | DevSpd | 軟件設(shè)置該值要求硬件枚舉為對(duì)應(yīng)的速度。硬件速度枚舉后反應(yīng)最終實(shí)際的速度。也就是軟件可以要求,但是實(shí)際是多少硬件說(shuō)了算,這也是前面提到的什么是軟件做什么是硬件做的體現(xiàn),編程要知道這些信息。00:High speed (USB 2.0 PHY clock is 30 MHz or 60 MHz)01: Full speed (USB 2.0 PHY clock is 30 MHz or 60 MHz)10: Reserved11: Full speed (USB 1.1 transceiver clock is 48 MHz) |
DIEPCTLn/DOEPCTLn:端點(diǎn)控制寄存器,控制對(duì)應(yīng)端點(diǎn)的行為 | ||
29 | SetD1PID | Scatter/Gather DMA 和nonScatter/Gather DMA 模式都可使用。配置數(shù)據(jù)的類型為DATA1只對(duì)中斷/批量 IN和OUT端點(diǎn)有效。 |
28 | SetD0PID | Scatter/Gather DMA 和nonScatter/Gather DMA 模式都可使用。配置數(shù)據(jù)的類型為DATA0只對(duì)中斷/批量 IN和OUT端點(diǎn)有效。 |
19:18 | EPType | 端點(diǎn)類型00: Control01: Isochronous10: Bulk11: Interrupt |
10:0 | MPS | 對(duì)應(yīng)端點(diǎn)的最大包大小 |
寄存器描述
閱讀寄存器要注意下寄存器的屬性
讀寫屬性 | 描述 |
---|---|
RC | 讀清除 |
RS | 讀置位 |
RM | 讀會(huì)修改寄存器內(nèi)容 |
Wo | 只能寫一次 |
W1C | 寫2清除 |
W1S | 寫1置位 |
W1T | 寫1翻轉(zhuǎn) |
W0C | 寫0清除 |
W0S | 寫0置位 |
W0T | 寫0翻轉(zhuǎn) |
WC | 寫清除. |
WS | 寫置位 |
WM | 寫反轉(zhuǎn) |
no Read Behavior attribute | 不能讀Write-Only. |
no Write Behavior attribute | 不能寫Read-Only |
訪問(wèn)屬性 | 描述 |
---|---|
R | 只讀 |
W | 只寫 |
R/W | 可讀寫 |
R/W1C | 可讀,寫清除 |
RC/W1C | R讀清除,寫1清除 |
R/Wo | 可讀,只能寫一次. |
屬性 | 描述 |
---|---|
Volatile | IP-XACT規(guī)格定義的,寫后讀或者連續(xù)讀不保證內(nèi)容一致性。 |
Testable | IP-XACT規(guī)格定義的,可能的值unconstrained, untestable, readOnly, writeAsRead, restore. |
Reset Mask | IP-XACT規(guī)格定義的.復(fù)位值不確定.比如其復(fù)位值受其他寄存器或者硬件引腳影響或者基于RAM的寄存器. |
* Varies | 可變的,即根據(jù)實(shí)際的配置而變化 |
寄存器組織
寄存器按塊組織
DWC_otg_map/DWC_otg_intreg
所有寄存器如下
可以看到就是分為G開頭,H開頭和D開頭的。
總結(jié)
本文對(duì)控制器的寄存器有了一個(gè)整體上的概覽,先了解各大概,了解寄存器的組織結(jié)構(gòu),大致了解一下常用的寄存器。后面編程時(shí)再一個(gè)個(gè)對(duì)照每一個(gè)寄存器的描述去編寫代碼。
-
寄存器
+關(guān)注
關(guān)注
31文章
5401瀏覽量
122781 -
usb
+關(guān)注
關(guān)注
60文章
8066瀏覽量
269660 -
存儲(chǔ)
+關(guān)注
關(guān)注
13文章
4469瀏覽量
86895 -
驅(qū)動(dòng)開發(fā)
+關(guān)注
關(guān)注
0文章
133瀏覽量
12221 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
210
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x06 DWC2 USB2.0 IP 頭文件與寄存器的讀寫操作

基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2.0控制器簡(jiǎn)介

基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x02 DWC2 USB2.0 IP功能特征介紹

基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x04 DWC2 USB2.0 IP 架構(gòu)介紹

基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x07 DWC2 USB2.0 IP 配置參數(shù)
基于DWC2的USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解

基于DWC2的USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解

基于DWC2的USB驅(qū)動(dòng)開發(fā)-USB連接詳解

基于DWC2的USB驅(qū)動(dòng)開發(fā)-設(shè)備類驅(qū)動(dòng)框架

基于DWC2的USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解

基于DWC2的USB驅(qū)動(dòng)開發(fā)-數(shù)據(jù)不能發(fā)送問(wèn)題分析案例

新思 DWC2 的參考手冊(cè)從哪里可以下載
RK3399平臺(tái)上USB控制器和PHY的連接方式和配置說(shuō)明
如何對(duì)基于hal庫(kù)的DWC2 USB IP進(jìn)行調(diào)試呢
基于DWC2的USB驅(qū)動(dòng)開發(fā)-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd

評(píng)論