想学习单片机的同学可以关注、私信我或者在评论区回复我要入门。这一期我们主要介绍在内核中简单使用DMA实现内存数据传递。因为文章中没有介绍与框架相关的程序,只是使用字符设备来操作DMA,同时也没有抽象的层次,因此本文中代码分析部分会比较简单。但我还是会将文章分为两部分,第一部分我将介绍与DMA相关的知识。而第二部分讲解在内核中如何通过代码实现DMA的数据传递。
第一部分:DMA相关知识
计算机系统中各种常用的数据输入/输出方法有查询方式和中断方式,这些方式常见于CPU与慢速及中速外设之间的数据交换。但当高速外设要与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,就在一定程度上限制了数据传送的速率。直接存储器存取(DMA)就是为了解决这个问题而生的。
采用DMA方式,在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。同时很重要的一点是当DMA传输数据时,并不占用CPU资源,在这个时候CPU可以空出手来做其他的事情。这样我们既可以做大量数据的高速传输又可以让CPU有时间和资源去做其他的事情。
在S3C2440A中,已经有了集成了DMA模块,可以用来传递高速传输数据。数据传输有三个要素:源,目的,长度。
在2440中我们的源与目的地选择有四种情况:
·1.源头和目的都在系统总线上
·2.源在系统总线,而目的在外部总线
·3.源在外部总线,而目的在系统总线
·4.源头和目的都在外部总线
2440中源与目的实际上是通信的双方,而这双方是通过请求DMA传递信息的,所以我们将上面这些向DMA发送请求的(不管是源还是目的)称为请求源。他们请求DMA来传输数据。而在2440中有四条通道来设置不同的请求源。
DMA模式介绍:
DMA service mode:single service&Whole service。前一模式下,一次DMA请求完成一项原子操作,并且transfer count的值减1。后一模式下,一次DMA请求完成一批原子操作,直到transfer count等于0表示完成一次整体服务。
DMA DREQ/DACK PROTOCOL:DMA请求和应答的协议有两种,Demond mode和 Handshake mode。
两者对Request和Ack的时序定义有所不同:
·在Demond模式下,如果DMA完成一次请求后如果Request仍然有效,那么DMA就认为这是下一次DMA请求,马上就会开始下一次的传输;
·在Handshake模式下,DMA完成一次请求后等待Request信号无效,如果Request无效,DMA会无效ACK两个时钟周期,再等待下一次Request。
下面我们来介绍DMA中数据传输的格式,注意,这里说的是传输格式,而不是传输的大小。在DMA中有两种传输格式,单元传输和burst4传输,相对于单元传输的每次读写一个单元,burst4可以一次完成四个单元的读写。单元代表的就是数据的大小有:字节,半字,字。
了解完上面的知识我们就可以了解总的数据的传输大小了:DSZ x TSZ x TC,其中DSZ就是上面说的数据的大小,TSZ是传输的格式,而TC是传输的次数。他们的乘积就是整个数据的大小了。
在我们的S3C2440中他是使用三态的有限状态机(