本文轉(zhuǎn)自公眾號,歡迎關(guān)注
基于DWC2的USB驅(qū)動開發(fā)-DOEP接收相關(guān)的DMA寄存器詳解 (qq.com)
前言
前面我們詳細(xì)介紹了發(fā)送即DIEP相關(guān)的一些寄存器,這一篇我們來看看接收即DOEP相關(guān)的一些寄存器。形式上DOEP和DIEP寄存器是類似的。不過我們看寄存器列表會發(fā)現(xiàn)DOEP會少一個(gè)寄存器DTXFSTSi ,
什么會少這個(gè)寄存器呢?
因?yàn)榻邮帐撬卸它c(diǎn)共享一個(gè)接收緩沖區(qū)的,所以這里就沒有DRXFSTSi 這個(gè)對應(yīng)的寄存器來表示每個(gè)端點(diǎn)對應(yīng)的接收緩沖區(qū)剩余可用空間了。發(fā)送是可以配置為每個(gè)端點(diǎn)獨(dú)占一個(gè)緩沖區(qū)的所以有對應(yīng)的寄存器。
雖然POEP少了一個(gè)寄存器,但是寄存器偏移地址上,還是和PIEP保持對應(yīng)關(guān)系的,缺的位置還是預(yù)留了空間的,這對軟件來說比較方便,所以一般IP的設(shè)計(jì)也要考慮軟件的實(shí)現(xiàn)是否方便。
這一篇先來介紹DMA相關(guān)的寄存器,后面再講剩余的寄存器,為什么DMA寄存器要單獨(dú)講,因?yàn)槠浜苤匾私馄涫侨绾卧O(shè)置,如何更新,什么階段誰擁有等很重要,可以協(xié)助調(diào)試分析問題,并且DOEP和DIEP的DMA寄存器的行為有些許差異這點(diǎn)調(diào)試時(shí)是很重要的,所以這里重點(diǎn)講。
DOEPDMAi
該寄存器的偏移地址是
0xB14 + i*20,雖然端點(diǎn)0的寄存器手冊有單獨(dú)描述,但是其偏移地址還是符合該表達(dá)式的,實(shí)際描述內(nèi)容也是重復(fù)的。
這樣所有的寄存器我們可以使用同樣的宏來尋址
#define DOEP_DMA(n) (OTG_BASE + (0xb14 + (n)*0x20))
這也是IP設(shè)計(jì)寄存器地址設(shè)置要考慮的,方便軟件編程。
我們來看手冊的描述
如果是 Scatter/Gather DMA模式則該寄存器設(shè)置為描述符鏈表的地址,否則則設(shè)置接收緩沖區(qū)的地址,DMA接收到數(shù)據(jù)自動從RxFIFO搬運(yùn)到該處。
注意該寄存器必須8字節(jié)對齊。
該值在OUT DONE,接收到數(shù)據(jù)產(chǎn)生中斷后,軟件可以回讀其值,回讀的值為設(shè)置的值偏移已經(jīng)處理的描述符或者已經(jīng)接收的字節(jié)數(shù)。
注意該寄存器寫完后并不能立即回讀,此時(shí)回讀值為之前的值或者默認(rèn)值,只有OUT DONE中斷接收到數(shù)據(jù)之后才能回讀,此時(shí)EPena硬件清零,回讀的值已經(jīng)是按照上述描述更新的值。
在軟件設(shè)置該值(注意此時(shí)哪怕EPEna沒有置位也是一樣的)到OUT DONE中斷之前該寄存器由控制器所有,此時(shí)軟件不能再次寫,回讀也不能回讀出寫入的值。只有OUT DONE中斷之后EPEna硬件自動清零后才能讀會硬件更新的值,注意不是寫入值,時(shí)硬件根據(jù)處理了多少描述符或者接受了多少數(shù)據(jù)遞增后的值。
以下是實(shí)例
如下使用OUT端點(diǎn)2 設(shè)置
0x81012a0到DOEPDMAi ** ,** 0x81012a0是8字節(jié)對齊的,時(shí)描述符地址
執(zhí)行完REG_DOEP_DMA(epnum) = (uint32_t)(pep->dma_addr);后回讀DOEPDMAi****的值并沒有更新,此時(shí)軟件不能再寫,回讀也不能讀出設(shè)置值
CTL寄存器的EPEna置位,SNAK變?yōu)榱?表示不再NACK了,準(zhǔn)備接收數(shù)據(jù)了
進(jìn)入OUT DONE中斷再來看
CTL寄存器的EPEna位硬件清零0.表示接收到了數(shù)據(jù)
此時(shí)DOEPDMAi 0x81012a0變?yōu)榱?x81012a8,因?yàn)橹挥幸砸粋€(gè)描述符,所以處理完后偏移了8字節(jié)。
DOEPDMABi
該寄存器的偏移地址是
0xB1C + i*20
從上面可以看到
0x0000000變?yōu)榱?/p>
0x8100d58
之前是0x0000000是因?yàn)樵O(shè)置完后并不能回讀,實(shí)際的描述中對應(yīng)的緩沖區(qū)是
0x8100d38,0x8100d58-0x8100d38正好是接收到的數(shù)據(jù)的長度。
總結(jié)
DMA相關(guān)的兩個(gè)寄存器非常重要,可以幫助調(diào)試,但是要注意寫入之后并不能馬上回讀,也不能再寫,需要OUT DONE之后才能回讀和重新寫,寫入該寄存器到OUT DONE中斷之前該寄存器都是控制器所有。
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5425瀏覽量
123559 -
usb
+關(guān)注
關(guān)注
60文章
8150瀏覽量
271160 -
dma
+關(guān)注
關(guān)注
3文章
574瀏覽量
102420 -
驅(qū)動開發(fā)
+關(guān)注
關(guān)注
0文章
133瀏覽量
12262 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
236
發(fā)布評論請先 登錄
基于DWC2的USB驅(qū)動開發(fā)-0x06 DWC2 USB2.0 IP 頭文件與寄存器的讀寫操作

基于DWC2的USB驅(qū)動開發(fā)-IN端點(diǎn)發(fā)送相關(guān)的寄存器詳解

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

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

基于DWC2的USB驅(qū)動開發(fā)-0x05 DWC2 USB2.0 IP 寄存器介紹

基于DWC2的USB驅(qū)動開發(fā)-IAD描述符詳解

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

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

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

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

基于DWC2的USB驅(qū)動開發(fā)-控制傳輸中斷相關(guān)寄存器

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

評論