DMA 控制器 5-1
大綱 DMA簡介 概論 DMAC 資料傳送 DMAC暫存器 5-2
DMA簡介 早期電腦系統的週邊設備,以中斷CPU目前的工作來獲得CPU的服務。 CPU經常處於被中斷的狀況下,而導致系統效能降低 。 5-3
概論 DMAC可以將內部與外部週邊裝置的資料傳送至主記憶體,從主記憶體傳送資料至週邊裝置,或將資料從主記憶體傳送到主記憶體 DMAC具有16個優先權式的通道(channel0~channel15) DMAC服務提出傳送要求的對象 任何內部的周邊裝置 最多兩個外部的輔助晶片(companion chip) 5-4
DMAC(DMA控制器) XScale晶片的DMAC特性 DMAC區塊圖 DMAC通道 訊號說明 DMA_IRQ DMA通道優先權排程 讀取與寫入順序 位元組傳送順序 5-5
XScale晶片的DMAC特性 支援Flow-through傳送方式 資料會先通過DMAC後,才會被目的裝置的緩衝區或記憶體拴鎖住(latched) 支援以敘述元為基礎(descriptor-based)的傳輸方式,因此可允許許多命令形成串列或迴圈結構 5-6
DMAC區塊圖 5-7
DMAC通道 DMAC具有16個通道,每一個通道由4個32位元的暫存器所控制 每個通道可以經由設定其組態,以Flow-through傳輸方式服務任何內部的週邊設備或外部的週邊設備的其中一個 5-8
訊號說明 DREQ[1:0]: PREQ[37:0]: 當需要DMA傳輸請求時,外部輔助晶片會產生DREQ[1:0]訊號 為晶片內部週邊的主動高位內部訊息 訊號 訊號類型 目標/來源 定義 DREQ[1:0] 輸入 腳位 外部相容晶片請求線。DMAC偵測到此腳位的正向邊緣後,就當做是一個請求。 DMA_IRQ 輸出 中斷控制器 主動高電位訊號為一個請求。 PREQ[37:0] On-chip週邊 內部週邊DMA請求線。晶片內部週邊使用PREQ訊號送出請求。 直到DMAC完成自週邊傳送資料至記憶體後,才會再偵測PREQ訊號。 5-9
DREQ[1:0]訊號 DREQ[1:0]訊號必須維持觸發狀態4個MEMCLK之久,以允許DMA辨別0至1的轉換。 DMAC紀錄從0至1的轉換來辨別是否是一個新的要求。 除非前面的DMA資料開始傳送,否則外部輔助晶片不可觸發另一個DREQ。 5-10
DMA_IRQ 應用處理器具有16個IRQ訊號,每一個DMA通道都對應一個 每個DMA_IRQ都可在DMA中斷暫存器DINT內被讀取 使用者可遮蔽通道的DMA命令暫存器DCMD的一些位元來引發通道的中斷,例如:結束中斷致能位元ENDIRQEN、啟動中斷致能位元STARTIRQEN與停止中斷致能位元STOPIRQEN 5-11
DMA通道優先權排程 允許需要大頻寬的週邊比需要較小頻寬的週邊有較多機會得到服務 DMA通道內部分為4個組,每個組包含4個通道,在一個組中,每個通道會循環(round-robin)取得優先權 將DMA通道的4個組設定為0、1、2、3來排列優先順序,在一次循環中的服務順序為:0→1→0→2→0→1→0→3 5-12
所有通道同時執行時的通道優先權 組別 通道 優先權 被服務的次數 0, 1, 2, 3 最高 4/8 1 4, 5, 6, 7 次高 2/8 0, 1, 2, 3 最高 4/8 1 4, 5, 6, 7 次高 2/8 2 8, 9, 10, 11 低 1/8 3 12, 13, 14, 15 5-13
非所有通道同時執行時的通道優先權 狀態器之狀態在重置時為0 每當有一個通道被服務時,狀態器之狀態增加1 狀態器之各個狀態的DMA優先權設定 S0 > S1 > S2 > S3 1 S1 > S0 > S3 > S2 2 3 S2 > S3 > S0 > S1 4 5 6 7 S3 > S2 > S1 > S0 狀態器之狀態在重置時為0 每當有一個通道被服務時,狀態器之狀態增加1 當狀態器的狀態為7時,下一個狀態回到0 所有通道同時執行時的執行順序 5-14
通道優先權方法的範例 提出服務要求的通道 DMA通道優先權 ch0, ch1 0, 1, 0, 1, 0, 1, 0, 1, … 0, 0, 0, 15, 0, 0, 0, 15, … ch0, ch4, ch8, ch12 0, 4, 0, 8, 0, 4, 0, 12, … ch0, ch1, ch8, ch12 0, 1, 0, 8, 0, 1, 0, 12, … ch0, ch4 0, 4, 0, 0, 0, 4, 0, 4, … ch8, ch12 8, 12, 8, 8, 8, 12, 8, 12, … 5-15
DMA敘述元 DMAC有兩種不同的操作模式: 設定DMA通道控制/狀態暫存器DCSRx[NODESCFETCH]位元來決定使用哪種模式 敘述元抓取模式(Descriptor Fetch Mode) 非敘述元抓取模式 (No-Descriptor Fetch Mode) 設定DMA通道控制/狀態暫存器DCSRx[NODESCFETCH]位元來決定使用哪種模式 此兩種模式可同時在不同通道上使用,即當有些DMA通道在一個模式執行時,其他通道可在另一個模式執行 通道必須先停止執行,才可從一種模式換成另一種模式 5-16
DMA敘述元(cont.) 非敘述元抓取模式: 敘述元抓取模式: 在非敘述元抓取模式,敘述元位址暫存器DDADRx是保留的 軟體不可對DMA敘述元位址暫存器DDADRx做寫入,而且必須載入DMA來源位址暫存器DSADRx、DMA目的位址暫存器DTADRx與DMA命令暫存器DCMDx 當設定執行位元時,DMAC立刻開始傳輸資料,並且執行非敘述元抓取 敘述元抓取模式: 在此模式中,DMAC暫存器由主記憶體裡的DMA敘述元來載入 允許DMA通道傳輸資料至一些不連續的位置 5-17
DMA通道狀態 未初始化:重置之後通道為未初始化狀態 有效敘述元,非執行: 敘述元抓取,執行:從記憶體抓取敘述元 在敘述元抓取模式裡,軟體載入敘述元到通道的DDADR中 在非敘述元抓取模式裡,程式化DSADR、DTADR與DCMD數值 敘述元抓取,執行:從記憶體抓取敘述元 等待請求:在通道開始傳送資料之前,它會先等待請求 傳送資料:通道正在傳送資料 通道錯誤:通道發生錯誤,它會維持停止狀態直到軟體清除錯誤條件與重新初始化通道 停止:通道已停止 5-18
非敘述元抓取模式通道狀態 5-19
敘述元抓取模式通道狀態 5-20
讀取與寫入順序 DMAC確保資料不會保留在敘述元之間的通道緩衝區內 當一個敘述元被處理完成,通道內緩衝的讀取資料會被丟棄,而寫入資料會送至記憶體 直到敘述元被完全處理後,才會發佈DMA中斷 5-21
位元組傳送順序 DCMD[ENDIAN]位元指示當資料從記憶體內讀取或寫入至記憶體時字組內的位元組順序 DCMD[ENDIAN]位元設定為0:Little Endian傳輸 5-22
Little Endian傳送 5-23
尾端位元組處理 一般DMA傳輸的位元組大小和由DCMD[SIZE]所指定的處理大小相同 當敘述元處理資料的尾端時,在DCMD[LENGTH]區域裡的尾端位元組的數目也許會小於傳輸的位元組大小 若DCMD[FLOWSRC]和DCMD[FLOWTRG]位元都是0(均為立即開始傳輸),或是從內部週邊或輔助晶片接收到對應的要求,則DMA可以傳輸確切的尾端位元組數 5-24
尾端位元組處理需考慮的案例 DMA傳輸的位元組數目大小等於DCMD[LENGTH]或DCMD[SIZE]的最小值 記憶體至記憶體移動 輔助晶片相關傳輸 輔助晶片需提出要求 記憶體對內部週邊傳輸 大部分的週邊會傳送一個尾端位元組的傳送要求 內部週邊至記憶體傳輸 若週邊傳送出一個要求時 注意:大部分的周邊並不對尾端的位元組傳送出要求 5-25
尾端位元組處理需考慮的案例(cont.) 使用程式化I/O來處理尾端位元組 內部週邊至記憶體傳輸 週邊不傳送要求給尾端位元組時 必須依照以下的操作順序 將0寫入至DCSR[RUN]位元來停止DMA通道 等待直到通道停止 讀取通道的暫存器來檢查通道的狀態 執行程式化I/O傳送到週邊(非透過DMA) 設定DCSR[RUN]位元為1並重置DMA通道使得DMA通道能準備好以便進行未來的資料傳送 5-26
傳送資料 傳送資料說明 服務內部週邊 內部週邊DMA快速參考表 使用Flow-Through DMA讀取週期來服務內部週邊 服務輔助晶片和外部週邊 使用Flow-Through DMA讀取週期來服務外部週邊 使用flow-through DMA寫入來服務外部週邊 記憶體至記憶體移動 5-27
傳送資料說明 內部週邊與DMAC經由週邊匯流排連接,並使用Flow-through資料傳輸方式 除了寫入至快閃記憶體之外,主記憶體包含應用處理器所支援的任何記憶體 不支援寫入資料到快閃記憶體中,若寫入快閃記憶體,會引起一個匯流排錯誤 5-28
服務內部週邊 DMAC提供DMA要求給DMA要求通道對應暫存器(DMA Request Channel Map Register)(DRCMRx) DMA要求通道對應暫存器包含4個用來指定通道號碼的位元 內部週邊可被對應到16個可使用的通道的任何一個 內部週邊經由週邊要求匯流排(PREQ)來觸發要求位元 有任何一個PREQ訊號不為0,則根據DRCMRx對應的位元執行一個查詢的動作 內部週邊位址若在DSADR內,則DCMDx[FLOWSRC]位元必須設定為1。允許應用處理器在開始傳送之前等待要求 內部週邊位址若在DTADR裡,則DCMDx[FLOWTRG]位元必須設定為1 若DCMD[IRQEN]被設定為1,假如傳輸中的一個位元組導致DCMDx[LENGTH]減少為0,在該位元組傳輸的最後一個週期結束時會要求一個DMA中斷 5-29
內部週邊DMA快速參考表 單元 功能 FIFO位址 寬度 DCMD寬度 (binary) 突發傳輸 大小 來源 / 目的 DRCMR I2S (bytes) DCMD寬度 (binary) 突發傳輸 大小 來源 / 目的 DRCMR I2S 接收 0x40400080 4 11 8, 16, 32 來源 0x40000 0108 傳送 0x40000 010C BTUART 0x40200000 1 01 0x40000 0110 或尾端 0x40000 0114 FFUART 0x40100000 0x40000 0118 0x40000 011C 5-30
內部週邊DMA快速參考表 (cont.) 5-31 單元 功能 FIFO位址 寬度 (bytes) DCMD寬度 (binary) 突發傳輸大小 來源 / 目的 DRCMR AC97 麥克風 0x40500060 4 11 8, 16, 32 來源 0x40000 0120 數據機 接收 0x40500140 0x40000 0124 傳送 0x40000 0128 聲音 0x40500040 0x40000 012C 0x40000 0130 5-31
內部週邊DMA快速參考表 (cont.) 5-32 單元 功能 FIFO位址 寬度 (bytes) DCMD寬度 (binary) 突發傳輸大小 來源 / 目的 DRCMR SSP 接收 0x41000010 2 10 8, 16 來源 0x40000 0134 傳送 0x40000 0138 FICP 0x4080000C 1 01 8, 16, 32 0x40000 0144 或尾端 0x40000 0148 STUART 0x4070000C 0x40000 014C 0x40000 0150 MMC 0x41100040 32或尾端 0x40000 0154 0x40000 0158 5-32
內部週邊DMA快速參考表 (cont.) 5-33 單元 功能 FIFO位址 寬度 (bytes) DCMD寬度 (binary) 突發傳輸大小 來源 / 目的 DRCMR USB 端點1 傳送 0x40600100 1 01 32 0x40000 0164 端點2 接收 0x40600180 來源 0x40000 0168 端點3 傳送 0x40600200 0x40000 016C 端點4 接收 0x40600400 0x40000 0170 端點6 傳送 0x40600600 0x40000 0178 端點7 接收 0x40600680 0x40000 017C 端點8 傳送 0x40600700 0x40000 0180 端點9 接收 0x40600900 0x40000 0184 端點11 傳送 0x40600B00 0x40000 018C 端點12 接收 0x40600B80 0x40000 0190 端點13 傳送 0x40600C00 0x40000 0194 端點14 接收 0x40600E00 0x40000 019C 5-33
使用Flow-Through DMA讀取週期來服務內部週邊 當內部週邊經PREQ匯流排傳送一個要求給DMAC通道,而DMAC正在執行且設定組態為flow-through讀取時,內部週邊的flow-through DMA讀取就會開始執行。 傳輸的位元組數目由DCMDx[SIZE]指定 當要求為最高優先權的要求時,開始進行以下的過程: DMAC送出一個要求給記憶體控制器,將由DSADRx[31:0]定址的位元的數目讀取至DMAC內部的一個32位元組的臨時緩衝區。 DMAC傳送資料給定址在DTADRx[31:0]的I/O設備。DCMD[WIDTH]指定內部週邊資料傳輸的寬度。 傳輸的最後,DSADRx值會增加,增加的值即為DCMDx[LENGTH]和DCMD[SIZE]的兩者中的較小值。DCMDx[LENGTH]也會減少相同的值。 5-34
使用Flow-Through DMA讀取週期來服務內部週邊 (cont.) DSADR[SRCADDR] = 外部記憶體位址 DTADR[TRGADDR] = 內部週邊位址 DCMD[INCSRCADDR] = 1 DCMD[FLOWSRC] = 0 DCMD[FLOWTRG] = 0 5-35
使用Flow-Through DMA寫入週期來服務內部週邊 當內部週邊經PREQ匯流排傳送一個要求給DMAC通道,而DMAC正在執行且設定組態為flow-through寫入時,內部週邊的flow-through DMA讀取就會開始執行 傳輸的位元組數目由DCMDx[SIZE]指定 當要求為最高優先權的要求時,會開始進行以下的過程: DMAC從DSADRx[31:0]所定址的I/O設備傳送所需要的位元組數到DMAC寫入緩衝區。 DMAC經由內部匯流排傳送資料給記憶體控制器。DCMD[WIDTH]指定內部週邊資料傳輸的速度。 在傳輸的最後,DTADRx值會增加,增加的值即為DCMDx[LENGTH]和DCMD[SIZE]的兩者中的較小值。DCMDx[LENGTH]也會減少相同的值。 5-36
使用Flow-Through DMA寫入週期來服務內部週邊 (cont.) DSADR[SRCADDR] = 內部週邊位址 DTADR[TRGADDR] = 外部記憶體位址 DCMD[INCTRGADDR] = 1 DCMD[FLOWSRC] = 1 DCMD[FLOWTRG] = 0 5-37
服務輔助晶片和外部週邊 輔助晶片的要求為DREQ[1:0]。DREQ訊號可對應到16個可使用的通道之一。 若有任何DREQ訊號測試結果不為0,則會檢查DRCMRx裡對應的位元。 若外部週邊位址是在DSADR或DTADR內,則DCMDx[FLOWSRC]位址必須設定為1。這允許應用處理器在開始傳輸之前先等待要求。 若DCMDx[IRQEN]設定為1,在最後一個週期的尾端,會要求一個DMA中斷。最後週期是和可使DCMDx[ENGTH]由1減少為0的位元組有關。 5-38
使用Flow-Through DMA讀取週期來服務外部週邊 當外部週邊經DREQ[1:0]匯流排傳送一個要求給DMAC通道,而DMAC正在執行且設定組態為flow-through讀取時,外部週邊的flow-through DMA讀取就會開始執行 傳輸的位元組數目由DCMDx[SIZE]指定 當要求為最高優先權的要求時,會開始進行以下的過程: DMAC送出一個要求給記憶體控制器,將由DSADRx[31:0]定址的位元的數目讀取至DMAC內部的一個32位元組的臨時緩衝區。 DMAC傳輸緩衝區內的資料給定址在DTADRx[31:0]的外部設備。 傳輸的最後,DTADRx值會增加,增加的值即為DCMDx[LENGTH]和DCMD[SIZE]的兩者中的較小值。DCMDx[LENGTH]也會減少相同的值。 5-39
使用Flow-Through DMA讀取週期來服務外部週邊(cont.) DSADR[SRCADDR] = 外部記憶體位址 DTADR[TRGADDR] = 輔助晶片位址 DCMD[INCSRCADDR] = 1 DCMA[INCTRGADDR] = 0 DCMD[FLOWSRC] = 0 DCMD[FLOWTRG] = 1 5-40
使用flow-through DMA寫入來服務外部週邊 當外部週邊經DREQ[1:0]匯流排傳送一個要求給DMAC通道,而DMAC正在執行且設定組態為flow-through讀取時,外部週邊的flow-through DMA讀取就會開始執行 傳輸的位元組數目由DCMDx[SIZE]指定 當要求為最高優先權的要求時,會開始進行以下的過程: DMAC從DSADRx[31:0]所定址的I/O設備傳送所需要的位元組數到DMAC寫入緩衝區。 DMAC經內部匯流排傳送資料給記憶體控制器。 在傳輸的最後,DTADRx值會增加,增加的值即為DCMDx[LENGTH]和DCMD[SIZE]的兩者中的較小值。DCMDx[LENGTH]也會減少相同的值。 5-41
使用flow-through DMA寫入來服務外部週邊(cont.) DSADR[SRCADDR] = 輔助晶片位址 DTADR[TRGADDR] = 外部記憶體位址 DCMD[INCSRCADDR] = 0 DCMD[INCTRGADDR] = 1 DCMD[FLOWSRC] = 1 DCMD[FLOWTRG] = 0 5-42
記憶體至記憶體移動 處理器寫入至DCSR[RUN]位元,並且設定一個通道做記憶體至記憶體移動。DCMDx[FLOWSRC]與DCMD[FLOWTRG]位元必須設定為0。 若DCMD[IRQEN]被設定為1,在最後一個週期會引發一個DMA要求,而此週期與引起DCMDx[LENGTH]從1減少為0的位元組有關。 下列為一個flow-through DMA記憶體至記憶體讀取與寫入之步驟: 處理器寫入至DCSR[RUN]暫存器位元,並且開始做記憶體至記憶體的移動。 若應用處理器為敘述元抓取模式,通道會設定組態來抓取4字組的敘述元。通道傳送資料不會等待PREQ與DREQ被觸發。DCMDx[SIZE]與DCMDx[LENGTH]兩者中較小的值即為被傳送的位元組數目。 DMAC傳送要求至記憶體控制器,將由DSADRx[31:0]定址的位元的數目讀取至DMAC內部的一個32位元組的臨時緩衝區。 DMAC產生一個寫入週期至DTADRx[31:0]內定址的位置。 在傳送的最後,DSADRx與DTADRx會增加,而增加的值即為DCMD[SIZE]與DCMDx[LENGTH]兩者中較小的值。 5-43
DMAC暫存器 DMAC含有下列暫存器: DMA中斷暫存器(DINT) DMA通道控制/狀態暫存器(DCSR) DMA請求至通道映象暫存器(DRCMR) DMA敘述元位址暫存器(DDADR) DMA來源位址暫存器(DSADR) DMA目標位址暫存器(DTADR) DMA命令暫存器(DCMD) 5-44
DMA中斷暫存器(DINT) DINT記錄每一個通道的中斷 位元 名稱 說明 31:16 保留 讀取為未知,必須寫入為0。 15:0 CHLINTRx 通道「x」中斷(唯讀) 0 = 沒有中斷 1 = 中斷 5-45
DMA通道控制/狀態暫存器(DCSR) DCSR包含每個通道的控制與狀態位元 讀取此暫存器可找出中斷的來源 將讀取的值寫回暫存器可清除中斷 5-46
DMA請求至通道映象暫存器(DRCMR) 對DRCMRx之讀取/寫入請求會將每個DMA請求對應至通道 位元 名稱 說明 7 MAPVLD 0 = 要求沒有被對應 1 = 要求被對應至DRCMRx[3:0]所指示的通道。 3:0 CHLNUM 通道數目(讀取/寫入) 若DRCMR[MAPVLD]設定為1,則指示出通道數目。 不可將2個有效的要求對應至相同的通道,否則會產生無法預期的結果。 5-47
DMA敘述元位址暫存器(DDADR) DDADR包含特定通道的下一個敘述元的記憶體位址 在啟動電源時,此暫存器內的位元是未定義的 DDADR不包含任何其他內部週邊暫存器或DMA暫存器的位址 若通道為非敘述元抓取模式,則DDADR為保留的 5-48
DMA來源位址暫存器(DSADR) 在敘述元抓取模式,DSADR只可讀取 在非敘述元抓取模式,DSADR可讀取及寫入 在啟動電源時,此暫存器的位元是未定義的 DSADR不包括任何其他內部DMA、LCD或MEMC暫存器的位址 5-49
DMA目標位址暫存器(DTADR) 在敘述元抓取模式,DTADR只可讀取 在非敘述元抓取模式,DTADR可讀取及寫入 包含目前通道內的敘述元的目標位址(內部週邊或記憶體位置的位址) 在啟動電源時,暫存器內的位元是未定義的 DTADR不包含任何內部DMA、LCD或MEMC暫存器的位址 DTADR不包含快閃記憶體的位址,因為不支援從DMAC寫入至快閃記憶體 5-50
DMA命令暫存器(DCMD) 在敘述元抓取模式,DCMD只可讀取 在非敘述元抓取模式,DCMD可讀取及寫入 包含通道的控制位元與目前通道內的傳輸長度 啟動電源時,此暫存器內的位元會被設定為0 5-51