dma使用

1. DMA : 直接存儲訪問. 在不帶MPU或者DSP的情況下,外設和內存之間高性能數據傳輸.
2. 一個DMA傳輸器可以通過一個邏輯DMA通道來編程, 以適應應用需求.
3. 專用DMA控制器: ISP(camera image signal processor) DMA, EDMA(內嵌在IVA2.2子系統), 顯示DMA, USB HS(high-speed) DMA.
4. DMA控制器包含如下特徵:
   數據傳輸方向支持:  內存<-->內存, 內存<-->外設
   32個邏輯DMA通道支持:
     -- 多個同時傳輸
     -- 每個通道獨立配置
     -- 8位,16位,32位數據傳輸長度
     -- 軟件觸發或者硬件同步傳輸
     -- 線性源和目的地址產生
     -- 突發讀寫
     -- 多通道傳輸鏈
     -- 大小端轉換
   固定優先級DMA調度起, 先來先服務
   高達96個DMA請求
   常數填充
   4個可編程中斷請求輸出線
   FIFO深度: 256 x 32位
   電源管理支持
   自動空閒進入省電模式支持
   
DMA模塊有3個端口, 一個讀,一個寫,一個配置端口. 提供多個邏輯通道支持.
一個動態申請FIFO隊列內存池提供爲讀寫端口之間緩存.
讀寫端口是多線程的(寫端口有2個線程, 讀端口有4個線程), 也意味着在請求方向和響應方向裏,每個事務被一個線程ID(0,1,2,3)標誌. 這也允許讀端口同時有4個未完成的請求. 寫端口有兩個線程可用.

* DMA寄存器:
1) DMA4_REVISION     -- DMA版本寄存器
2) DMA4_IRQSTATUS_Lj     -- 中斷狀態寄存器. j表示4箇中斷線中的一個, 每個位表示一個通道.
3) DMA4_IRQENABLE_Lj     -- 中斷使能寄存器
4) DMA4_SYSSTATUS     -- 系統狀態寄存器, 查看復位狀態
5) DMA4_OCP_SYSCONFIG     -- DMA OCP系統配置寄存器
6) DMA4_CAPS_0-4     -- DMA能力寄存器
7) DMA4_GCR         -- 高低優先級通道共享FIFO
8) DMA4_CCRi         -- 通道控制寄存器
9) DMA4_CLNK_CTRLi     -- 通道鏈接控制寄存器
10)DMA4_CICRi         -- 通道中斷控制寄存器
11)DMA4_CSRi         -- 通道狀態寄存器
12)DMA4_CSDPi         -- 通道源/目的參數
13)DMA4_CENi         -- 通道一幀中元素個數
14)DMA4_CFNi         -- 通道一塊中的幀數
15)DMA4_CSSAi         -- 源地址
16)DMA4_CDSAi         -- 目的地址
17)DMA4_CSEIi         -- 通道源元素索引
18)DMA4_CSFIi         -- 通道源幀索引 或者 16位包大小
19)DMA4_CDEIi         -- 通道目的元素索引
20)DMA4_CDFIi         -- 通道目的幀索引 或者 16位包大小
21)DMA4_CSACi         -- 通道源地址當前值(只讀)
22)DMA4_CDACi         -- 通道目的地址當前值(只讀)
23)DMA4_CCENi         -- 通道當前傳輸元素個數
24)DMA4_CCFNi         -- 通道當前傳輸幀數
25)DMA4_COLORi         -- Color key or solid color pattern
26)DMA4_CDPi         -- 鏈接列表機器的各種參數配置
27)DMA4_CNDPi         -- 下一個鏈接列表機器的地址
28)DMA4_CCDNi         -- 包含鏈接列表中當前激活的的描述符數


DMA驅動分析
1.初始化
   1)omap_dma_base 爲基地址, dma_lch_count 爲通道數=32
   2)dma_chan 爲通道鏈表數組, 結構體struct omap_dma_lch.
   3)dma_linked_lch 通道鏈表信息數組, 結構體struct dma_link_info.
   4)dma_chan_count 鏈表數等於通道數. 並初始化通道鏈表數組
   5)配置DMA4_GCR寄存器.
      *設置一個邏輯通道最大FIFO深度爲0x10. 如果小於目標突發大小
      *不保留任何線程ID給高優先級讀寫端口
      *不固定分配高低優先級FIFO
      *已優先和常規隊列任意切換速率爲1
   6)建立DMA中斷處理函數(setup_irq, 中斷號12, L0線)
   7)配置DMA4_OCP_SYSCONFIG寄存器, 自動省電模式

2. dma中斷處理函數
   1)讀L0線的中斷狀態寄存器, 並查看並處理中斷的那個DMA邏輯通道
   2)讀通道狀態寄存器CSR, 並判斷該DMA通道的dev_id是否有效
   3)判斷是否在DMA鏈表中, 並設置狀態爲不啓動
     *如果當前通道的鏈表模式使能, 則下一個通道狀態設置爲啓動.
     *如果鏈表模式是動態鏈表, 則禁用鏈表(禁止通道中斷,禁用鏈表模式,標誌爲非激活)
   4)調用DMA回掉函數

3. DMA屬性設置
   1) 讀寫優先級(CCR)
   2) 數據位數(CSDP)
   3) 同步設置(CCR) --- 1.元素 2.塊 3.幀 4.包(package)
        注: 傳遞完之後產生中斷信號
   4) 同步源設置(CCR) --- 目的或者源 (包同步的話,包的元素個數由CSFI|CDFI指定)
   5) 同步控制(使用哪個DMA中斷號) (CCR)
   6) 設置幀的元素個數, 塊的幀數

   7) 設置源地址增長模式, 起始地址, 幀索引和元素索引

   8) 設置目的地址增長模式, 起始地址, 幀索引和元素索引

   9) 設置DMA源或者目的地址的burst方式

   10) 清中斷狀態,並設置中斷使能位(frame, last, block, packet, err)
   11) 使能DMA Linej中斷

   12) CCR中的DMA使能位置一.
        如果使用鏈表的話設置鏈表,使能各通道中斷,並只使用第一個通道的DMA
        停止DMA的時候也要把鏈表所有通道停掉,並禁用中斷

DMA鏈表使用必須再DMA使能之前, 禁用必須再DMA停掉之後. 鏈表是自環的.



















   















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章