Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2305029
  • 博文数量: 318
  • 博客积分: 8752
  • 博客等级: 中将
  • 技术积分: 4944
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 07:56
文章分类

全部博文(318)

文章存档

2019年(1)

2017年(2)

2016年(12)

2015年(2)

2014年(1)

2013年(17)

2012年(22)

2011年(9)

2010年(37)

2009年(33)

2008年(44)

2007年(43)

2006年(95)

分类:

2007-03-08 15:24:30

【摘要】本文介绍了基于ARM7的SAMSUNG 的一款32位RISC芯片S3C44B0X中DMA的原理,并且给出了各种类型DMA的具体应用的实现方法。全文重点旨在分析不同需求如何使用相匹配的DMA,以及需要注意的关键问题。
【关键词】 S3C44B0X  BDMA  ZDMA

随着嵌入式系统的发展,越来越多的应用要求高速外设与系统内存或者要在系统内存的不同区域之间进行大量数据的快速传送时,如果采用普通的数据传输方式.要占用一定的CPU资源,就在一定程度上限制了CPU对其它事件的实时响应。为了提高对CPU资源的利用率,微机系统中的直接存储器存取(DMA)的数据传送控制方式就被引入嵌入式系统中,DMA方式就是在一定时间段内,由DMA控制器取代CPU,获得总线控制权,来实现内存与外设或者内存的不同区域之间大量数据的快速传送。而带有DMA控制器的基于ARM7TDI核的三星公司的CPU芯片S3C44B0X目前在市场上占有一定的份额。为此,本文以S3C44B0X为例,详细论述了S3C44B0X 中DMA的原理与实现。
这款芯片S3C44B0X有4路DMA控制器,分为ZDMA(通用 DMA)和BDMA(桥 DMA) (见下图1) 。ZDMA和BDMA都可以由指令启动,也可以有内部外设和外部请求引脚来请求启动。其中ZDMA被连到SSB(Samsung System Bus)总线上,ZDMA用来在存储器到存储器、存储器到IO存储器(固定地址)、IO设备到存储器之间传输数据.。BDMA是SSB和SPB(Samsung Peripheral Bus)之间的接口层,相当于一个桥,因此称为桥DMA。也就是说,BDMA控制器只能在连到SPB上的IO装置(外设)与存储器之间传输数据。在这种情况下,连到SPB上的IO装置如UART,IIS,SIO。下面来分别介绍ZDMA和BDMA的特性:
 

ZDMA控制器可以用来以从存储器到存储器的方式传输数据,而且不同于BDMA可以用来在映射在存储器地址空间的设备和外部存储器之间传输数据,这样使得数据传输的源和目的既可以是固定的也可以是外部存储器。举例来说,数据传输的一端可以是固定地址的网卡寄存器,另一端可以是外部存储器如SDRAM。另外,S3C44B0X有一个4字的FIFO缓冲来支持4字突发DMA传输。特别的, ZDMA最大的特性是on-the-fly模式,可以减少在外部存储器和外部可寻址的外设之间DMA操作的周期数。在通常情况下,DMA传输包括两个分开的周期,一个是从源存储器或者I/O设备“读”,另一个是“写“入目的存储器或者I/O设备。为了完成这两个操作,存储控制器从数据总线上读数据,再把这个数据写到数据总线上去。由于on-the-fly模式有不可分割的读写周期,换句话说,存储控制器产生目的和源设备在数据总线上读写数据的确认信号,同时,存储控制器可以产生存储器入口的读/写相关的控制信号。在这点上ZDMA与普通的DMA不同,从而on-the-fly模式可以减少DMA操作的周期数。要运行on-the-fly模式,源的总线宽度必须和目的的相同。
BDMA是在SSB与SPB的接口层——桥中。BDMA控制器只能在连到SPB上的IO装置(外设)与存储器之间传输数据,在这种情况下,连到SPB上的IO装置有UART,IIS,SIO。也就是说,BDMA是用于在外部存储器和挂接在外围总线上的外设之间传输数据。通常,CPU或者其它的主设备应该通过存储控制器访问挂接在外围总线上的外存。不过要注意BDMA也是一种主设备,需要利用挂在系统总线上的存储控制器来完成从存储器(外围设备)到外围设备(存储器)的数据传输。由于BDMA是存在于系统总线和外围总线的接口层(桥),它可以在两个设备之间传输数据。因为BDMA没有临时缓冲区,而且挂在外围总线上的设备速度比较慢,所以BDMA不支持4字突发(BLOCK传输模式)DMA传输。存储器之间的传输数据最好用ZDMA传输,来提供高的传输速度。
此外,有四种外部DMA请求/应答协议,以下作一一介绍:
HANDSHAKE模式
在HANDSHAKE模式,对于DMA请求,只发出单一的DMA应答。DMA服务在一个DMA运行周期中表示为一对不可分的读写周期,在一个DMA周期,总线控制器不分配给其它的总线主设备总线使用权。 如果在一个DMA周期中,使用者想把总线使用权交给更高优先级的主控制器,就要使用SINGLE STEP模式,这将在下面提到。
SINGEL STEP模式
SINGEL STEP模式表示有两个DMA应答周期来指示读写周期。这种模式通常用在测试或者调试的时候,因为在读和写之间系统总线占有权可以交给其它的主控制器。在读写周期之间,总线控制器重新估计优先级来决定新的总线控制者。这样,这种模式下,数据传输要比HAND SHAKE模式来的慢。
WHOLE SERVICE模式
WHOLE SERVICE模式表示指定的DMA运行数量将被单一的DMA请求激活,而且如果没有进一步的DMA请求的话会继续进行下去。在一般情况下,如果DMA传输数量太大的话,由于其它的总线服务不能进行,所以在这个模式中长时间的总线占用可能会带来一些问题。为了解决这类问题,提出了WHOLE SERVICE模式,DMA在每个UNIT传输完成时释放总线控制权,当DMA 释放总线控制权,其它的总线控制器(例如CPU,其它的DMA和外部总线控制器)将会获得总线占有权。WHOLE SERVICE模式的这个特征可以提供最佳的总线分配状况。防止总线的使用权被莫个DMA所垄断。
DEMAND 模式
在DEMAND 模式下,只要DMA请求信号持续,就会有连续的DMA传输周期。在这种模式下,在一个DMA周期中,将不允许把总线使用权交给其它提出DMA请求的优先级高的总线控制器。换句话说,就是任何其它总线控制器都不能获得总线使用权。
另外,不同于外部DMA请求/应答协议,还有表示每个传输单元读/写的数量的DMA传输模式。其有三种传输模式,包括unit传输模式,block传输模式,on_ the_ fly传输模式。
Unit传输模式
这个模式表示在每个DMA请求恰好发生一个DMA读/写周期,即一个字的读,然后一个字的写。
Block (4-word) 传输模式
这个模式表示在一个连续的4-word的写周期之前有一个连续的4-word读周期发生,也就是说4 个字突发读, 然后4 个字突发写,因此传输的数据个数应当是16字节的倍数。
On-the-fly传输模式
这种模式下,当DMA读/写数据时,一个固定地址的外设也同时写/读这个数据。而在其它模式下,DMA读周期发生在写周期之前。也就是说,读写同时发生,DMA应答信号通知外设读或者写,同时存储控制器应该产生读相关或者写相关控制信号给外存。如果外设支持这种模式,数据传输效率将会提高一倍。

  在应用开发的网络语音终端系统中,其中实现对从网络收下来的音频流进行实时播放是占用CPU资源比较多的任务,而且对数据处理及时性的要求非常高。如果采用普通的数据传送方式就会大大占用CPU资源,使得CPU来不及响应其它的任务,从而会对整个系统造成一定的冲击。而整个系统正好采用的CPU是S3C44B0X,从上面的介绍,可以看到S3C44B0X的两款DMA就可以用来缓解这一数据传送中的CPU资源紧张。
首先,由于ZDMA控制器可以用来以从存储器到存储器的方式传输数据,而且不同于BDMA可以用来在映射在存储器地址空间的设备和外部存储器之间传输数据,这样使得数据传输的源和目的既可以是固定的也可以是外部存储器。我们针对ZDMA的这一特点,从网络上收音频数据这一工作就可以借用DMA完成,也就时说利用ZDMA从网卡控制器的缓存到SDRAM之间进行数据传输。接着,就需要对ZDMA的各个寄存器进行合理的配置。ZDMA有三个寄存器包括ZDMA控制寄存器,ZDMA源寄存器,ZDMA目的寄存器,ZDMA计数寄存器。
下面就简单介绍一下各个寄存器的配置方法:
1. ZDMA控制寄存器:
INT       [7:6]         保留  00
STE      [5:4]         DMA通道的状态(只读)
                      在DMA的传输计数开始之前,STE呆在准备好状态
00 = Ready           01 = Not TC yet
10 = Terminal Count    11 = N/A
QDS     [3:2]        忽落/允许外部 DMA 请求 (nXDREQ)
00 = Enable    other = Disable
CMD     [1:0]         软件命令
00: 没有命令.在写 01,10,11后, CMD 位被自动清nXDREQ允许
01: 由S/W启动DMA操作 S/W启动功能能用在whole mode. 
10: 停止DMA操作. 但 nXDREQ仍允许
11: 取消DMA 操作
所以只要设置QDS和CMD位就可以了,QDS位为ENALBE,而CMD位为启动DMA操作。

2.ZDMAn的初始当前源地址寄存器:
位名称                  BIT         描述
DST                    [31:30]     传输的数据类型,在块传输模式,DST必须是10
00 = Byte, 01 = Half word
10 = Word, 11 = Not used
DAL                     [29:28]     加载地址变动方向
00 = N/A, 01 = Increment
10 = Decrement, 11 = Fixed
ISADDR/CSADDR         [27:0]      ZDMAn的初始/当前源地址
在ISADDR/CSADDR位填入源地址,即网卡寄存器的地址。因为此源地址是固定的,相当于一个FIFO的作用,所以DAL位设置为FIXED(11)。又由于传输的数据类型为16BIT,故而DST位设置为HALF WORD(01)。

3.ZDMAn的初始当前目标地址寄存器
位名称                  BIT         描述
OPT                 [31:30]        DMA内部选项推荐值 OPT = 10 
bit 31: 指示在单步模式 nXDREQ 如何采样 
bit 30:  如果DST是半字或字和 DMA 模式不是块传输模式,该位起作用
1: DMA做字或半字交换
传输前: B0,B1,B2,B3,B4,B5,B6,B7...
字交换后: B3,B2,B1,B0,B7,B6,B5,B4,...
半字交换后: B1,B0,B3,B2,B5,B4,B7,B6,...
0: 正常
DAS               [29:28]      地址方向
00 = N/A 01 = Increment
10 = Decrement 11 = Fixed
IDADDR/CDADDR   [27:0]   ZDMAn的初始/当前目标地址
在IDADDR/CDADDR位填入目标地址,即在SDRAM中的一段BUFFER的起始地址。因为此目标地址是递增的,所以DAL位设置为Increment(01)。

4.ZAMA计数寄存器
位名称                  BIT         描述
QSC                 [31:30]    选择DMA 请求源 
00 = nXDREQ[0]    01 = nXDREQ[1]
10 = N/A          11 = N/A
QTY               [29:28]      DREQ 协议类型
00 = Handshake     01 = Single step
10 = Whole Service   11 = Demand
TMD              [27:26]      传输模式
00 = Not used                   01 = Unit transfer mode
10 = Block(4-word) transfer mode  11 = On the fly
OTF              [25:24]      On the fly mode 有效
00 = N/A                 01 = N/A
10 = Read time on the fly  11 = Write time on the fly
INTS             [23:22]      中断模式设置
00 = 查询模式      01 = N/A
10 =无论什么时候传输都产生中断 
11 =当中断计数时产生中断
AR               [21]        在DMA计数到0时自动加载和自动开始
0 = Disable
1 = Enable.
EN               [20]       DMA H/W允许/不允许
0 = Disable DMA
1 = Enable DMA.
如果 S/W 命令取消, DMA 操作也将被取消和EN位被清除
在中断计数时,EN位也被清除。
注:不要同时设置ZDICNTD的EN位和其它位 用户必须在设置其它位后设置EN位,步骤如下:
1. Set ZDICNT register with disabled En bit.
2. Set EN bit enable.
ICNT/CCNT    [19:0]       ZDMAn的初始/当前传输计数值.,必须正确设置
                               如果传输单位为字节,ICNT每次减小1
                               如果传输单位为半字,ICNT每次减小2
如果传输单位为字,ICNT每次减小4
在ICNT/CCNT位填入所传输的数据的大小,要注意不要同时设置ZDMA计数寄存器的EN位和其它位,用户必须在设置其它位后设置EN位。中断方式为结束整个传输的时候产生一次中断,所以INTS位设置为11(当中断计数时产生中断)。又因为整个网卡寄存器到SDRAM之间的数据传输时,每个UNIT传输完成的时候,CPU需要占用总线完成其它的任务,所以采用unit传输模式,请求/应答协议则采用WHOLE SERVIC模式。即TMD位设置为01(Unit transfer mode),QTY位为10(WHOLE SERVICE)。
  至此,从网卡控制器的缓存到SDRAM的ZDMA初始化寄存器工作已经完成。ZDMA就会自动把网卡控制器缓存中的数据搬到SDRAM的BUFFER中来。当完成所有数据的搬运工作之后,就会发生一次ZDMA中断。

另外,由于S3C44B0X的IIS支持一路DMA传输方式,而且BDMA也就是正好用来在外部存储器和挂接在外围总线上的外设之间传输数据。所以,那么播放音频数据这一工作就可以借用BDMA来完成了,也就是说利用BDMA来完成这一从外部存储器SDRAM到外围设备IIS控制器的FIFO之间的数据传输工作,大大减少的对CPU资源的占有。可以使CPU有更多的时间来完成整个系统的工作。同样的,我们也需要对BDMA的各个寄存器进行合理的配置。具体步骤如下:
1.BDMA控制寄存器
位名称      BIT          描述
INT       [7:6]         保留  00
STE      [5:4]         DMA通道的状态(只读)
                       在DMA的传输计数开始之前,STE呆在准备好状态
00 = Ready           01 = Not TC yet
10 = Terminal Count    11 = N/A
QDS     [3:2]          忽落/允许外部 DMA 请求 (nXDREQ)
00 = Enable    other = Disable
CMD     [1:0]         软件命令
00: 没有命令.在写 01,10,11后, CMD 位被自动清除。, 
01: 保留 
10: 保留
11: 取消DMA 操作
    所以只要设置QDS和CMD位就可以了,QDS位为ENALBE,而CMD位为启动DMA操作。
2.BDMAn的初始当前源地址寄存器位定义
位名称              BIT         描述
DST               [31:30]     传输的数据类型
00 = Byte, 01 = Half word
10 = Word, 11 = Not used
DAL               [29:28]      加载地址变动方向
00 = N/A, 01 = Increment
10 = Decrement, 11 = Fixed
ISADDR/CSADDR   [27:0]      BDMAn的初始/当前源地址
在ISADDR/CSADDR位填入源地址,即在SDRAM中的一段BUFFER的起始地址。因为此源地址是固定的,所以DAL位设置为INCREMENT(01)。又由于传输的数据类型为16BIT,故而DST位设置为HALF WORD(01)。
3. BDMAn的初始当前目标地址寄存器
位名称                  BIT         描述
TDM                 [31:30]       传输方向模式
00 = 保留
01 = M2IO (从外部存储器到内部外设) 
10 = IO2M (从内部外设到外部存储器)
11= IO2IO (从内部外设到内部外设)
注:即使不使用BAMA通道,你也必须改变该值。
DAS                 [29:28]        地址方向
00 = N/A        01 = Increment
10 = Decrement  11 = Fixed
IDADDR/CDADDR     [27:0]       BDMAn的初始/当前目标地址
在IDADDR/CDADDR位填入目标地址,即IIS的FIFO。因为此目标地址是固定的,所以DAS位设置为FIXED(11)。又因为传输方向为外部存储器到从内部外设,所以TDM位设置为01(M2IO 从外部存储器到内部外设))。
4.BAMA计数寄存器
位名称                  BIT         描述
QSC                  [31:30]    选择DMA 请求源 
00 = N/A    01 = IIS
10 = UART0        11 = SIO
Reserved              [29:28]     00 = Handshake
Reserved              [27:26]       传输模式
                            01 = Unit transfer mode
Reserved              [25:24]       00 = N/A                
INTS                  [23:22]        中断模式设置
00 = 查询模式      01 = N/A
10 =无论什么时候传输都产生中断 
11 =当中断计数时产生中断
AR                    [21]           在DMA计数到0时自动加载和自动开始
0 = Disable 1 = Enable.
EN                    [20]           DMA H/W允许/不允许
0 = Disable DMA  1 = Enable DMA.
如果 S/W 命令取消, DMA 操作也将被取消和EN位被清除
在中断计数时,EN位也被清除。
注:不要同时设置BDICNTD的EN位和其它位 用户必须在设置其它位后设置EN位,步骤如下:
1. Set BDICNT register with disabled En bit.
2. Set EN bit enable.
ICNT/CCNT    [19:0]       BDMAn的初始/当前传输计数值. 
 先要设置请求源为IIS控制器,所以QSC位设置为01。在ICNT/CCNT位填入所传输的数据的大小,要注意不要同时设置BDMA计数寄存器的EN位和其它位,用户必须在设置其它位后设置EN位。中断方式为结束整个传输的时候产生一次中断,所以INTS位设置为11(当中断计数时产生中断)。而且要采用AUTO_RELOAD方式,即当一次DMA传输完成后(计数为零时),会自动进行第二次的DMA传输工作。这对于传输大量的音频数据流是非常重要的保证,可以帮助用户自动完成持续的数据搬家工作。最后只要在控制器寄存器使能DMA请求,这样,所有配置就完成了,它会自动完成从SDRAM的数据到IIS控制器的FIFO搬家工作。大大提高了效率。即AR位设置为ENABLE.
阅读(1871) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~