转自:http://blog.techbulo.com/tech/artical/1462.html
1、基本概念
在本驱动程序中,我们打算在内存中开辟两个空间,分别作为源和目的。我们用两个方法将源中的数据写到目的中,一种方法是让cpu去做,另外一种发放是让DMA去做!好的,闲话少说,直接分析代码:
DISRCn | bit | Description | Initial State |
S_ADDR | [30:0] | 源起始地址 | 0x00000000 |
DISRCCn | bit | Description | Initial State |
LOC | [1] | 用于选择源的位置 0:源在系统总线上 1:源在外设总线上 |
0 |
INC | [0] | 用于选择地址是否自动增加 0:地址自动增加 1:地址固定不变(此时即便是burst 模式下,传输过程中地址自动增加, 但是一旦传输完这一次数据,地址又变为初值) |
0 |
DIDSTn | bit | Description | Initial State |
D_ADDR | [30:0] | 目的起始地址 | 0x00000000 |
DIDSTCn | Bit | Description | Initial State |
CHK_INT | [2] | 当设置为自动加载时,用来选择中断发生的时间 0:TC为0是产生中断 1:自动加载完成的时候产生中断 |
0 |
LOC | [1] | 用于选择目的设备的位置 0:目的设备在系统总线上 1:目的设备在外设总线上 |
0 |
INC | [0] | 用于选择地址是否自动增加 0:地址自动增加 1:地址固定不变(此时即便是burst模式下,传输过程中地址自动增加,但是一旦传输完这一次数据,地址又重新变为初值) |
0 |
DCONn | Bit | Description | Initial State |
DMD_HS | [31] | 选择为Demand模式或者是握手模式 0:选择为Demand模式 1:选择为握手模式 这 两种模式下都是当发生请求时,DMA控制器开始传输数据并且发出 应 答信号,不同点是握手模式下,当DMA控制器收到请求撤销信号,并且自 身发出应答撤销信号之后才能接收下一次请求。而在Demand模式下,并 不需要等待请求撤销信号,他只需要撤销自身的应答信号,然后等待下一 次的请求。 |
0 |
SYNC | [30] | 选择DREQ/DACK的同步 0:DREQ and DACK 与PCLK同步 1:DREQ and DACK 与HCLK同步 因此当设备在AHB系统总线时,这一位必须为1,而当设备在APB系统 时,它应该被设为0。当设备位于外部系统时,应根据具体情况而定。 |
0 |
INT | [29] | 是否使能中断 0:禁止中断,用户需要查看状态寄存器来判断传输是否完成 1:使能中断,所有的传输完成之后产生中断信号 |
0 |
TSZ | [28] | 选择一个原子传输的大小 0:单元传输(一次传输一个单元) 1:突发传输(一次传输四个单元) |
0 |
SERVMODE | [27] | 选择是单服务模式还是整体服务模式 0:单服务模式,当一次原子传输完成后需要等待下一个DMA请求 1:整体服务模式,进行多次原子传输,知道传输计数值到达0 |
0 |
HWSRCSEL | [26:24] | 为每一个DMA选择DMA请求源 具体参见芯片手册 |
000 |
SWHW_SEL | [23] | 选择DMA源为软件请求模式还是硬件请求模式 0:软件请求模式,需要将寄存器DMASKTRIG的SW_TRIG置位 1:硬件请求模式 |
0 |
RELOAD | [22] | 是否自动重新装载 0:自动重装,当目前的传输计数值变为0时,自动重装 1:不自动重装 RELOAD[1]被设置为0以防无意识地进行新的DMA传输 |
0 |
DSZ | [21:20] | 要被传输的数据的大小 00 = Byte 01 = Half word 10 = Word 11 = reserved |
00 |
TC | [19:0] | 初始化传输计数 | 0000 |
DSTATn | Bit | Description | Initial State |
STAT | [21:20] | DMA控制器的状态 00:DMA控制器已经准备好接收下一个DMA请求 01:DMA控制器正在处理DMA请求 |
00 |
CURR_TC | [19:0] | 传输计数的当前值 每个原子传输减1 |
DCSRCn | Bit | Description | Initial State |
CURR_SRC | [30:0] | 当前的源地址 | 0x00000000 |
DCDSTn | Bit | Description | Initial State |
CURR_DST | [30:0] | 当前的目的地址 | 0x00000000 |
DMASKTRIGn | Bit | Description | Initial State |
STOP | [2] | 停止DMA操作 1:当前的原子传输完成之后,就停止DMA操作。如果当前没有原子 传输正在进行,就立即结束。 |
|
ON_OFF | [1] | DMA通道的开/闭 0:DMA通道关闭 1:DMA通道打开,并且处理DMA请求 |
|
SW_TRIG | [0] | 1:在软件请求模式时触发DMA通道 |