1.为什么需要DMA
首先看串口来传递信息:发送字符串。
发送函数:在uart.c里增加下面发送函数:
接下来在main.c里调用:
编译make,
烧写到开发板:
制作SD卡,设置开发板从SD卡启动,设置好minicom后给开发板上电,紧接着按着空格键:
选择[1]格式化NandFlash:
按照上面,选择从USB烧写image,然后选择1,烧写uboot。然后把USB线拉到虚拟机,会显示USB按着成功了。接下来就可以烧写编译好的.bin文件了。
在Linux里按着USB驱动:
接下来烧写:
串口信息:
设置开发板从NandFlash启动:
可以看到我们串口的信息已经打印出来了。说明串口发送信息成功了。
接下来看原始数据的传输:
上面就是原始数据的传输机制,输出的传输需要CPU全程参与,当buf里的数据很大的时候,这机制就浪费了CPU的大部分资源。
所以DMA机制就出现了,有DMA的机制如下:
该机制里,当需要传输数据的时候,CPU给DMA控制器命令,告诉DMA要去源地址拿数据,送到目的地址,然后就可以去干别的事了。DMA控制器接受到CPU的命令后,通过内存与串口的数据通道,会不停从源地址获取数据,送到目的地址,知道结束。这就是DMADirect Memory Access机制。
接下来看看2440的DMA:
可以看到2440的DMA是四通道的。
每一个通道的请求源:
DMA的基本时序:
例如UART0的请求源,对应的是通道0(Ch-0),UART2对应的是通道3.
DMA请求到启动的过程时序图:
首先是DREQ,DMA请求信号生效,当请求信号生效两个时钟之后,响应信号DACK生效,生效的时间是3个时钟。DMA控制器正式接管了总线,就可以实现Read and Write了。
DMA的两种工作模式:
6410的DMA:
可以看到6410有四个DMA控制器,每一个控制器有8个通道,就是说6410支持的是32DMA通道。
32通道支持的DMA源:
第一行的意思是:在DMA0或者SDMA0控制器的0通道上面,可以使用的是UART0源。依此类推。
四个控制器是DMA0,DMA1和SDMA0和SDMA1。在默认的情况使用的是SDMA控制器,默认值是0.
基本工作时序:
原理跟2440一样的。
210的DMA:
上面可以看到210支持两种类型的DMA:一种是内存到内存的,另一种是内存到外设的。
210有三个控制器:DMA(内存)、DMA0、DMA1.
三个控制器对应的DMA源:
可以看到DMA源的后面都的是by only DMA0或DMA1,说明这种的DMA源只能给对应的DMA控制器处理,如果是空白的则两个都可以处理。