本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注基于DWC2的USB驅(qū)動(dòng)開(kāi)發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com)
前言
上一篇我們介紹了IN端點(diǎn),發(fā)送,DMA相關(guān)的兩個(gè)寄存器,這一篇繼續(xù)講另外的幾個(gè)寄存器。
DIEPCTLi
偏移地址 0x900+i*20
該寄存器控制端點(diǎn)的屬性,使能等,是端點(diǎn)操作的核心寄存器
傳輸使能與禁能
Bit31和bit30
其實(shí)這里名字Enable和Disable取的并不合適,這里實(shí)際并不是指的端點(diǎn)的使能和禁能,更確切的說(shuō)應(yīng)該是啟動(dòng)和停止DMA對(duì)描述符連鏈表,DMA緩沖數(shù)據(jù)的處理,啟動(dòng)和停止端點(diǎn)數(shù)據(jù)的傳輸。
端點(diǎn)的使能也就是激活應(yīng)該是bit15。
軟件在準(zhǔn)備好描述符( Scatter/Gather DMA )即DIEPDMAi以及描述符鏈表后,置位該位,硬件就會(huì)開(kāi)始處理該描述符。對(duì)于非Scatter/Gather DMA 的DMA則是準(zhǔn)備好DMA對(duì)應(yīng)的緩沖區(qū)也是配置DIEPDMAi后使能該位硬件開(kāi)始DMA處理。當(dāng)然這里DMA處理描述符和DMA緩沖區(qū)實(shí)際就是搬運(yùn)數(shù)據(jù)到TxFIFO中去,所以要TxFIFO有空閑才會(huì)進(jìn)行。
注意硬件在發(fā)送完數(shù)據(jù)后產(chǎn)生相應(yīng)的中斷時(shí)會(huì)自動(dòng)清除該位即SETUP的完成,數(shù)據(jù)發(fā)送完成時(shí),即相當(dāng)于自動(dòng)流控,發(fā)送完后硬件自動(dòng)Disable,軟件重新配置相應(yīng)的描述符和DMA再重新Enable。否則不Disable此時(shí)軟件還沒(méi)準(zhǔn)備好描述符和DMA就會(huì)沒(méi)有數(shù)據(jù)可發(fā)。
另外手動(dòng)置位EPDis時(shí) EPEna也會(huì)清零,兩者互斥。
而EPDis表示停止傳輸,軟件只能在EPEna之前置位過(guò)才能置位該位,在停止中斷中硬件自動(dòng)清除該位。
注意置位后不是一定數(shù)據(jù)傳輸馬上就停止了,要到停止中斷才能確認(rèn)是停止了。
即DIEPINTi寄存器的bit1 EPDisbld為1.
端點(diǎn)激活
硬件收到復(fù)位信號(hào)后清除該位(EP0的不置位,因?yàn)镋P0要默認(rèn)使能,用于控制傳輸進(jìn)行枚舉),軟件在設(shè)置配置,設(shè)置接口的標(biāo)準(zhǔn)請(qǐng)求時(shí)置位該位。
PID設(shè)置
設(shè)置PID,注意Scatter-Gather DMA模式是在描述符中設(shè)置PID的,所以這里保留
Bit16可以查看當(dāng)前的PID狀態(tài)
NACK操作
軟件設(shè)置SNAK該位以發(fā)送NACK用于流控
注意硬件在SETUP完成后也會(huì)置位改位,所以軟件在開(kāi)啟新的傳輸時(shí)需要置位CNAK和EPEna以停止NACK和啟動(dòng)傳輸。
DIEPINTi的bit6 INEPNakEff置位表示SNAK設(shè)置NACK生效。
Bit17 NAKSts表示當(dāng)前是否出于NAK狀態(tài)
發(fā)送FIFO號(hào)
Shared FIFO模式非周期端點(diǎn)共用一個(gè)發(fā)送FIFO所以這里必須為0,
只有獨(dú)立發(fā)送FIFO模式,或者周期端點(diǎn),則每個(gè)發(fā)送IN端點(diǎn)可以對(duì)應(yīng)一個(gè)獨(dú)立的TxFIFO
STALL
軟件置位該為以產(chǎn)生STALL的ACK
端點(diǎn)類型
下一個(gè)端點(diǎn)
Shared FIFO模式才有,必須要DMA模式才有(Slave
模式不需要)
對(duì)于每個(gè)發(fā)送端點(diǎn)獨(dú)立FIFO模式也不需要,因?yàn)槎际仟?dú)立控制的,
只有Shared FIFO模式共享FIFO所以才需要鏈表告訴DMA下一個(gè)處理哪個(gè)端點(diǎn)
端點(diǎn)最大包大小
DIEPINTi****中斷狀態(tài)
這里是某個(gè)端點(diǎn)詳細(xì)的中斷原因,其中中斷的使能是總的中斷使能控制DAINTMSK,即控制哪一個(gè)端點(diǎn)的中斷使能,
其中bit0 XferCompl表示發(fā)送完,是最重要的中斷狀態(tài)
DIEPTSIZi
發(fā)送大小寄存器
一個(gè)微幀發(fā)送包數(shù)MC
注意Scatter-Gather DMA在描述中配置,不使用該寄存器的MC
該位只有內(nèi)部DMA的非Scatter-Gather DMA模式使用
包數(shù)
注意每搬運(yùn)完一個(gè)包到TxFIFO,該值會(huì)遞減,所以可以看該寄存器看已經(jīng)搬運(yùn)完的包數(shù)
同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器
傳輸大小
指定一次DMA傳輸?shù)拇笮?/p>
同樣注意Scatter-Gather DMA在描述中配置,也不使用該寄存器
該值也會(huì)根據(jù)已經(jīng)處理完的數(shù)據(jù)量遞減
其中x 由GHWCFG3的bit4:0可以看到
DTXFSTSi
該寄存器可以看指定端點(diǎn)對(duì)應(yīng)的TxFIFO剩余空閑的空間大小
實(shí)例
Scatter/Gather DMA模式
核心代碼如下即配置DMA地址,使能EPEna,清除NACK。這里沒(méi)有貼出描述符的填充過(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);
}
如下是EPena置位前后寄存器值,該位軟件置位后傳輸完后硬件自動(dòng)清零
DIEPINT1 的bit0 XferCompl置位說(shuō)明DMA處理完了
Bit9 BNAIntr置位說(shuō)明DMA處理完后面沒(méi)有描述符需要處理了。
DIEPDMA1,DIEPDMAB1變?yōu)榱?x08100968和0x207047c8這個(gè)上一篇文章已經(jīng)分析過(guò)了
DTXFSTS1為0x00000300
DIEPTXFi 0x104+(i-1)*4
看到TxFIFO1的大小是0x300,也就是都發(fā)送完了TxFIFO中又都空閑了
DIEPTSIZ1由0x13C5變?yōu)榱?x3F7003b1.
EPEna之后
可以看到描述的狀態(tài)也變?yōu)榱薉MA Done,長(zhǎng)度也變?yōu)榱?表示發(fā)送完了。
總結(jié)
以上是IN端點(diǎn)發(fā)送數(shù)據(jù),DMA和端點(diǎn)相關(guān)需要配置的寄存器,需要注意的是Scatter/Gather DMA模式 一些狀態(tài),比如發(fā)送包數(shù),長(zhǎng)度放在了描述符中去了。
熟悉以上寄存器對(duì)編寫驅(qū)動(dòng)控制IN端點(diǎn)發(fā)送數(shù)據(jù)至關(guān)重要,一些寄存器也可以給調(diào)試提供信息。
-
寄存器
+關(guān)注
關(guān)注
31文章
5253瀏覽量
119205 -
usb
+關(guān)注
關(guān)注
60文章
7773瀏覽量
262390 -
dma
+關(guān)注
關(guān)注
3文章
552瀏覽量
99931 -
驅(qū)動(dòng)開(kāi)發(fā)
+關(guān)注
關(guān)注
0文章
130瀏覽量
12036 -
DWC2
+關(guān)注
關(guān)注
0文章
35瀏覽量
110
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論