本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com)
前言
如下寄存器DIEPxxx,對(duì)應(yīng)IN端點(diǎn),和發(fā)送數(shù)據(jù)相關(guān),這一篇先介紹和DMA相關(guān)的兩個(gè)寄存器,其他的后續(xù)再講,
并且通過(guò)觀察其寄存器的實(shí)際值的變化來(lái)加深理解。
了解這些值的含義以及何時(shí)如何變化,可以在有問(wèn)題時(shí)幫助進(jìn)行調(diào)試,知道當(dāng)前出于何種狀態(tài)。
以下實(shí)例是以Scatter/Gather DMA模式IN端點(diǎn)1進(jìn)行操作
寄存器的地址偏移分別是
0x900+i*0x20
0x908+i*0x20
0x910+i*0x20
0x914+i*0x20
0x918+i*0x20
0x91C+i*0x20
DIEPDMA****i
寄存器偏移:0x914 + i*20
Scatter/Gather DMA模式時(shí)該寄存器的值即用戶指定的描述符鏈表的地址
非Scatter/Gather DMA時(shí)該寄存器的值即用戶指定的DMA待發(fā)送數(shù)據(jù)的地址。
必須DWORD即8字節(jié)對(duì)齊。
比如這里描述符鏈表使用了全局?jǐn)?shù)組,用attribute指定對(duì)齊大小
attribute ((aligned(8))) static uint32_t s_dam[1024][2];
注意該寄存器在每次處理完描述符后會(huì)遞增,用戶可以通過(guò)該寄存器判斷DMA是否進(jìn)行了描述符的處理。
注意該寄存器需要CTL寄存器ENA置位后才能回讀否則讀到的是0.
我們以一個(gè)實(shí)例來(lái)看該寄存器值的變化,以下是關(guān)鍵代碼,即準(zhǔn)備一次DMA發(fā)送,前面描述符的準(zhǔn)備過(guò)程不在這里貼出。
void ep_writedma(uint32_t dma, uint8_t epnum)
{
REG_DIEP_DMA(epnum) = dma;
REG_DIEP_CTL(epnum) |= (DEP_ENA_BIT | DEP_CLEAR_NAK);
}
以下是執(zhí)行REG_DIEP_DMA(epnum) = dma;前,寄存器DIEPDMA1的值為0
傳入的參數(shù)即描述符鏈表的地址是0x81008d8是8字節(jié)的對(duì)齊的
此時(shí)a0為0x81008d8,即我們的描述符鏈表的地址
a4為寄存器地址0x3000934,sw a0,0(a4) 即將0x81008d8寫入寄存器0x3000934
注意在CTL寄存器使能端點(diǎn)之前是不能回讀該寄存器的值的,如下為0
執(zhí)行完sw語(yǔ)句再來(lái)看,此時(shí)DIEPDMA1還是0
在執(zhí)行完使能,CTL寄存器的ENA置位后才能看到,如下此時(shí)看待DIEPDMA1的值變?yōu)榱?x08100968,為什么不是寫入的0x81008d8呢,也就時(shí)之前說(shuō)的,ENA一置位,DMA就會(huì)去處理該描述符,0x08100968-0x81008d8=0x90=144 ,144/8=18個(gè)描述符(一個(gè)描述符2個(gè)WORD8字節(jié))。
那么為什么該寄存器值遞增了這么多呢
那是因?yàn)槲覀冞@里配置p_dam就是配置了18個(gè)描述符,如下18個(gè)DWORD,所以可以看到如下18個(gè)描述符一起處理完了,最后一個(gè)描述符標(biāo)志了是最后一個(gè)。
DIEPDMABi
寄存器偏移:0x91C + i*20
該寄存器只有Scatter/Gather DMA模式有效,非Scatter/Gather DMA模式,DIEPDMAi就是用戶緩沖區(qū)的地址,也就是Scatter/Gather DMA模式的本寄存器。
用于指示當(dāng)前正在處理的用戶緩沖區(qū)的地址,DMA處理完指定緩沖區(qū)后就會(huì)更新。
所以從該寄存器可以看到是否處理了用戶的緩沖區(qū)數(shù)據(jù)。
同樣是CTL的ENA置位后,處理完描述符后更新,從以下可以看出最后一個(gè)描述的用戶數(shù)據(jù)緩沖區(qū)地址為0x8704400長(zhǎng)度為0x3C1,所以處理完后DIEPDMAB1更新為了0x87047C1
總結(jié)
這里重點(diǎn)講解了DMA相關(guān)的兩個(gè)寄存器,主要是他們可以協(xié)助分析數(shù)據(jù)發(fā)送,比如有時(shí)候數(shù)據(jù)沒(méi)有發(fā)出,可以從這里看出是否處理了描述符,是否處理了用戶數(shù)據(jù),來(lái)協(xié)助判斷當(dāng)前狀態(tài)。
審核編輯 黃宇
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
usb
+關(guān)注
關(guān)注
60文章
7936瀏覽量
264473 -
dma
+關(guān)注
關(guān)注
3文章
560瀏覽量
100544 -
驅(qū)動(dòng)開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
130瀏覽量
12072
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論