基于DWC2的USB驅動開發(fā)-發(fā)送相關的寄存器DMA寄存器詳解 (qq.com)
前言
如下寄存器DIEPxxx,對應IN端點,和發(fā)送數(shù)據(jù)相關,這一篇先介紹和DMA相關的兩個寄存器,其他的后續(xù)再講,
并且通過觀察其寄存器的實際值的變化來加深理解。
了解這些值的含義以及何時如何變化,可以在有問題時幫助進行調試,知道當前出于何種狀態(tài)。
以下實例是以Scatter/Gather DMA模式IN端點1進行操作
寄存器的地址偏移分別是
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模式時該寄存器的值即用戶指定的描述符鏈表的地址
非Scatter/Gather DMA時該寄存器的值即用戶指定的DMA待發(fā)送數(shù)據(jù)的地址。
必須DWORD即8字節(jié)對齊。
比如這里描述符鏈表使用了全局數(shù)組,用attribute指定對齊大小
attribute ((aligned(8))) static uint32_t s_dam[1024][2];
注意該寄存器在每次處理完描述符后會遞增,用戶可以通過該寄存器判斷DMA是否進行了描述符的處理。
注意該寄存器需要CTL寄存器ENA置位后才能回讀否則讀到的是0.
我們以一個實例來看該寄存器值的變化,以下是關鍵代碼,即準備一次DMA發(fā)送,前面描述符的準備過程不在這里貼出。
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é)的對齊的
此時a0為0x81008d8,即我們的描述符鏈表的地址
a4為寄存器地址0x3000934,sw a0,0(a4) 即將0x81008d8寫入寄存器0x3000934
注意在CTL寄存器使能端點之前是不能回讀該寄存器的值的,如下為0
執(zhí)行完sw語句再來看,此時DIEPDMA1還是0
在執(zhí)行完使能,CTL寄存器的ENA置位后才能看到,如下此時看待DIEPDMA1的值變?yōu)榱?x08100968,為什么不是寫入的0x81008d8呢,也就時之前說的,ENA一置位,DMA就會去處理該描述符,0x08100968-0x81008d8=0x90=144 ,144/8=18個描述符(一個描述符2個WORD8字節(jié))。
那么為什么該寄存器值遞增了這么多呢
那是因為我們這里配置p_dam就是配置了18個描述符,如下18個DWORD,所以可以看到如下18個描述符一起處理完了,最后一個描述符標志了是最后一個。
DIEPDMABi
寄存器偏移:0x91C + i*20
該寄存器只有Scatter/Gather DMA模式有效,非Scatter/Gather DMA模式,DIEPDMAi就是用戶緩沖區(qū)的地址,也就是Scatter/Gather DMA模式的本寄存器。
用于指示當前正在處理的用戶緩沖區(qū)的地址,DMA處理完指定緩沖區(qū)后就會更新。
所以從該寄存器可以看到是否處理了用戶的緩沖區(qū)數(shù)據(jù)。
同樣是CTL的ENA置位后,處理完描述符后更新,從以下可以看出最后一個描述的用戶數(shù)據(jù)緩沖區(qū)地址為0x8704400長度為0x3C1,所以處理完后DIEPDMAB1更新為了0x87047C1
總結
這里重點講解了DMA相關的兩個寄存器,主要是他們可以協(xié)助分析數(shù)據(jù)發(fā)送,比如有時候數(shù)據(jù)沒有發(fā)出,可以從這里看出是否處理了描述符,是否處理了用戶數(shù)據(jù),來協(xié)助判斷當前狀態(tài)。
審核編輯 黃宇
-
寄存器
+關注
關注
31文章
5401瀏覽量
122781 -
usb
+關注
關注
60文章
8066瀏覽量
269659 -
dma
+關注
關注
3文章
569瀏覽量
102041 -
驅動開發(fā)
+關注
關注
0文章
133瀏覽量
12221
發(fā)布評論請先 登錄
相關推薦
基于DWC2的USB驅動開發(fā)-0x06 DWC2 USB2.0 IP 頭文件與寄存器的讀寫操作

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

基于DWC2的USB驅動開發(fā)-0x0D PHY寄存器讀寫代碼編寫與測試

基于DWC2的USB驅動開發(fā)-DOEP接收相關的DMA寄存器詳解

評論