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停掉之后. 链表是自环的.



















   















你可能感兴趣的:(多线程,编程,image,struct,存储,Signal)