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