《Windows CE嵌入式开发入门——基于Xscale架构》第3章 存储控制器

任何一个处理器都必须与存储器紧密配合才能实现各种功能,处理器对存储器的控制能力对系统的整体性能有至关重要的影响。PXA255通过DMA控制器(DMA Controller)、存储控制器(Memory Controller)和MMU实现对各种存储器的控制。

3.1 DMA控制器(DMA ControllerDMAC

DMA控制传输(DMAC)是使CPU处理其他与数据总线无关的处理,而有DMA控制器负责数据传输的机制。这种机制使得CPU从繁重的数据传输中解脱出来,可以执行其他计算,从而大大提高了系统的运行速度。

PXA255DMA控制器提供了16DMA通道,从015。每个从外设传来的DMA请求信号必须持续一个时钟周期以上。这些通道提供了flow-through的数据传输方式。

DMA控制器的框架如图3-1所示。

<shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="[email protected]@[email protected]@[email protected]@[email protected]@5xe" filled="f" stroked="f"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></path><lock v:ext="edit" aspectratio="t"></lock></shapetype>《Windows CE嵌入式开发入门——基于Xscale架构》第3章 存储控制器

3‑1 DMA控制器

DMAC只支持flow-through传输方式。flow-through传输在数据被目标内存缓冲锁存之前,先通过DMACDMAC可以使用flow-through传输方式来执行内存至内存的数据传输。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.1</span></chsdate> DMAC通道

DMAC16个通道,每个通道由32位的寄存器控制。每个通道都可以为CPU内部或者外部的模块提供flow-through数据传输。外设每次传输数据的大小和端口的大小必须在通道的控制寄存器中设置。

软件要确保Cache中数据的一致性,由于DMA控制器并不探测Cache中数据是否有效,因此,系统中为DMA分配的内存区域应该被设置成非缓冲型的。在外设向处理器请求DMA传输时,外设的缓冲区应该被填满,如果有未填满的缓冲区出现在DMA传输中,则被认为是本次传输的最后一个传输包。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.2</span></chsdate> DMA信号

DMA中要使用到的信号有DREQ[1:0]DMA_IRQPERQ[37:0],具体如表3-1所示。

3-1 DMA信号

信号类型

来源/目标

DREQ[1:0]

输入

来自引脚

外部设备请求线信号,DMA探测这个信号的上升沿作为有效请求

DMA_IRQ

输出

中断控制器

高电平作为中断信号

PREQ[37:0]

输出

片上设备

内部设备的DMA请求信号线。片上设备使用PREQ来发送DMA请求

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.3</span></chsdate> DMA通道优先级模型

DMA通道优先级模型允许请求高带宽需求的设备请求比低带宽需求设备更频繁地被处理。DMA通道被分为4种类型,每种类型包含4个通道。通道在每个分类中按照round-robin优先级算法分配优先级。类型0具有最高优先级,类型1比类型2、类型3的优先级高。类型2、类型3具有相同的低优先级。高带宽需求设备必须被设置到类型0DMA通道。内存至内存的数据移动以及低带宽需求的设备请求必须被标记成通道类型2或者3。优先级模型并不能影响正在被执行的请求。

当所有通道都在进行数据传输时,那么它们将被按照以下顺序执行:

n 类型0执行;

n 类型1执行;

n 类型0执行;

n 类型2执行;

n 类型0执行;

n 类型1执行;

n 类型0执行;

n 类型3执行。

8次通道处理中,类型0将被执行4次,类型1被执行2次,类型2、类型3各被执行1次。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.4</span></chsdate> DMA描述符

DMAC可以在两种模式下运行:无描述符存取模式和描述符存取模式。模式的选取由DCSRx[NODESCFETCH]位决定。同样在同一时间内,不同的通道里可以分别使用这两种模式。

通道在转换运行模式之前必须停止数据处理。如果出现错误,则通道停留在停止状态,等待程序处理。

1.无描述符存取模式

在无描述符存取模式下,DDADRx被保留。程序不可以向DDADRx中写入数据,并且必须加载DSADRxDTADRxDCMDx寄存器。当运行位被设置,DMAC立刻运行以传输数据。无描述符存取在数据传输的开始时被执行。

一个典型的无描述符存取操作顺序如下。

1)复位后,通道处于未初始化状态。

2)设置DCSR[RUN]位为0,设置DCSR[NODESCFETCH]位为1

<shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><stroke joinstyle="miter"></stroke><path gradientshapeok="t" o:connecttype="rect"></path></shapetype><shape id="_x0000_s1027" style="margin-top: 23.3pt; z-index: 2; left: 0px; margin-left: 232.7pt; width: 187.3pt; text-indent: 0px; position: absolute; height: 240.8pt; text-align: left" stroked="f" type="#_x0000_t202"><textbox inset="0,0,0,0"></textbox><wrap type="square"></wrap></shape>3)程序将源地址写入DSADR寄存器,将目标地址写入DTADR寄存器,将命令写入DCMD寄存器。

4)向DCSR[RUN]位中写入1,然后无描述符存取被执行。

5)通道等待数据传输请求。

6)通道传输数据,数据量由DCMD[SIZE]DCMD[LENGTH]较小者决定。

7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。

8DDADR[STOP]被设置为1,通道运行终止。

DMA无描述符存取模式的状态如图3-2所示。
《Windows CE嵌入式开发入门——基于Xscale架构》第3章 存储控制器
3‑2 DMA无描述符存取模式

2.有描述符存取模式

在有描述符存取模式下,DMAC的寄存器用内存中的DMA描述符数据填充。多个DMA描述符可以被链成一个链表。这就允许DMA通道在一系列不连续的地址上进行数据传输。一个典型的有描述符存取模式的操作步骤如下。

1)复位后,通道处于未初始化状态。

2)程序将描述符地址(16字节对齐)写入DDADR寄存器。

3)程序向DCSR[RUN]中写入1

4DMACDDADR标记的地址中读取4字长的描述符,其中各字加载情况如下:

Word [0] -> DDADRx寄存器;

Word [1] -> DSADRx寄存器;

Word [2] -> DTADRx寄存器;

Word [3] -> DCMDx寄存器。

5)通道等待数据传输请求。

6)通道传输数据,数据量由DCMD[SIZE]DCMD[LENGTH]较小者决定。

7)在DCMD[LENGTH]被设置为0之前,通道等待下一次数据请求。

8DDADR[STOP]被设置为1,通道运行终止,否则继续运行。

DMA请求描述符的第一个字的0位决定了本描述符是否是本次操作中最后一个描述符,如果是,则在处理完本描述符后,DMAC停止操作。

DMA有描述符存取模式的状态如图3-3所示。

《Windows CE嵌入式开发入门——基于Xscale架构》第3章 存储控制器

3‑3 DMA有描述符存取模式

3.中断处理

如果程序接收到一个描述存取成功的中断,例如DCSRx[STARTINTR] = 0b1,则程序必须向这个位中写入1来清除中断标记。程序应当先读出DCSRx中的值,进行修改(DCSRx[STARTINTR]=0b1),不修改DCSRx[RUN],然后将修改后的值写回DCSRx

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.5</span></chsdate> DMA通道状态

一个DMA通道可以处于下列几种状态:

未初始化:通道在复位后处于未初始化状态;

有效描述符存取,未运行:在有描述符存取模式下,程序已经将描述符加载入通道的DDADR;在非描述符存取模式下,已经设置了DSADRDTADRDCMD值,但是DCSR[RUN]0

描述符存取,运行:正从内存中读取DMA描述符;

等待请求:通道正在等待开始传输数据的请求;

数据传输:通道正在传输数据;

通道错误:通道产生了错误,通道停留在停止状态,直到程序清除DCSR[RUN]位;

停止状态:通道终止运行。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.6</span></chsdate> 读写顺序

DMAC不能保证处理器到I/O设备(包括片上设备)的读写顺序。读写顺序必须由软件保证。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.7</span></chsdate> 字节传输顺序

DCMD[ENDIAN]位定义了一个字的数据写入内存或者从内存读出的顺序。DCMD[ENDIAN]0代表小端(Little Endian)模式顺序。

如果数据从内部设备传输到内存,DCMD[ENDI-
AN]
被设置为0,并且DCMD[SIZE]被设置为1,那么内存接收数据顺序如下:

Byte[0]

Byte[1]

Byte[2]

Byte[3]

小端模式传输顺序如图3-4所示。
《Windows CE嵌入式开发入门——基于Xscale架构》第3章 存储控制器
3‑4 小端模式传输顺序

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.8</span></chsdate> 传输数据

内部设备通过设备总线连接到DMAC,采用flow-through 数据传输方式。DMAC同样也可以执行内存至内存的flow-through数据传输。外部设备如伴随芯片直接和数据引脚连接,必须使用flow-through数据传输。

但是DMA操作不支持向flash中写入数据,否则会产生一个总线错误。在flow-through模式下,数据在被目标设备锁存前,先经过DMAC

1.内部设备数据传输

通道映射寄存器(DRCMRx)中有4位用来为DMA请求分配DMA号。一个内部设备可以被映射到16个可能的通道。内部设备可以通过内部设备总线来产生有效请求(PREQ)。PREQ信号被每个设备时钟(PCLK)采样,只要出现非0的(PCLK),就会触发一次DRCMRx寄存器相应位是否有效的查找。这允许请求被映射到不同的通道上。

如果内部设备地址被加载到DSADR中,DCMDx[FLOWSRC]位必须被设置为1。这允许处理器在初始化传输之前等待传输请求。如果内部设备地址被加载到DTADRDCMDx[FLOWTRG]必须被设置为1

如果DCMDx[IRQEN]位被设置为1,则在DCMDx[LENGTH]被减少至0后,产生一个DMA中断。

2.使用flow-through DMA读时序执行内部设备数据传输

当内部设备通过PREQ总线向DMAC产生一次DMA读请求后,就会执行一次flow-through DMA读操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级,则执行下列操作。

1DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。

2DMAC将数据传送到I/O设备中,地址由DTADRx[31:0]决定,DCMD[WIDTH]描述了内部设备通信的数据宽度。

3)在传输的最后,DSADRx自增,增加值为DCMDx[LENGTH]DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。

对于向内部设备的flow-through DMA读操作,DMAC寄存器应当进行如下设置:

DSADR[SRCADDR] = 内存地址;

DTADR[TRGADDR] = 内部设备地址;

DCMD[INCSRCADDR] = 1

DCMD[FLOWSRC] = 0

DCMD[FLOWTRG] = 1

3.使用flow-through DMA写时序执行内部设备数据传输

当内部设备通过PREQ总线向DMAC产生一次DMA写请求后,就会执行一次flow-through DMA写操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。

DMAC将由DSADRx[31:0]标记地址的I/O数据读入DMAC写缓冲。

DMAC将数据通过内部总线传输到存储控制器。DCMD[WIDTH]描述了内部设备通信的数据宽度。

在传输的最后,DTADRx自增,增加值为DCMDx[LENGTH]DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。

对于向内部设备的flow-through DMA写操作,DMAC寄存器应当如下设置:

DSADR[SRCADDR] = 内部设备地址;

DTADR[TRGADDR] = 内存地址;

DCMD[INCTRGADDR] = 1

DCMD[FLOWSRC] = 1

DCMD[FLOWTRG] = 0

4.伴随芯片和外部设备

1)使用flow-through DMA读时序执行外部设备数据传输

当外部设备通过DREQ[1:0]总线向DMAC产生一次DMA读请求后,就会执行一次flow-through DMA读操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。

DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。

DMAC将数据传送到I/O设备中,地址由DTADRx[31:0]决定。DCMD[WIDTH]描述了内部设备通信的数据宽度。

在传输的最后,DSADRx自增,增加值为DCMDx[LENGTH]DCMD[SIZE]较小者,而DCMDx[LENGTH]也自减去这个值。

对于向外部设备的flow-through DMA读操作,DMAC寄存器应当如下设置:

n DSADR[SRCADDR] = 内存地址;

n DTADR[TRGADDR] = companion chip地址;

n DCMD[INCSRCADDR] = 1

n DCMD[INCTRGADDR] = 0

n DCMD[FLOWSRC] = 0

n DCMD[FLOWTRG] = 1

2)使用flow-through DMA写时序执行外部设备数据传输

当外部设备通过DREQ总线向DMAC产生一次DMA写请求后,就会执行一次flow-through DMA写操作。需要传输的数据容量由DCMDx[SIZE]决定。当请求为最高优先级时,则执行下列操作。

DMAC将由DSADRx[31:0]标记地址的I/O数据读入DMAC写缓冲。

DMAC将数据通过内部总线传输到存储控制器。

在传输的最后,DTADRx自增,增加值为DCMDx[LENGTH]DCMD[SIZE]较小者,而CMDx[LENGTH]也自减去这个值。

对于向内部设备的flow-through DMA写操作,DMAC寄存器应当如下设置:

n DSADR[SRCADDR] = 内部设备地址;

n DTADR[TRGADDR] = 内存地址;

n DCMD[INCSRCADDR] = 0

n DCMD[INCTRGADDR] = 1

n DCMD[FLOWSRC] = 1

n DCMD[FLOWTRG] = 0

5.内存至内存数据移动

内存至内存数据移动不需要DREQPREQ的请求信号。处理器向DCSR[RUN]中写入1,然后有一个通道被配置成内存至内存移动。DCMDx[FLOWSRC]DCMD[FLOWTRG]必须被设置成0。如果DCMD[IRQEN]被设置为1,在DCMDx[LENGTH]减少为0时,产生一个DMA中断。

一次flow-through DMA内存至内存数据移动包含以下步骤。

处理器向DCSR[RUN]中写入1,开始内存至内存数据移动。

如果处于描述符存取模式,DMA通道读取4字描述符。通道开始传输数据而不需要等待PREQ或者DREQ信号有效。DCMDx[SIZE]DCMDx[LENGTH]中较小者描述了传输的数据量。

DMAC要求存储控制器读取数据容量到DMAC的缓冲区中,地址由DSADRx[31:0]决定。

DMACDTADRx[31:0]标记的地址中写入数据。

在传输的最后,DSADRxDTADRx自减,自减值为DCMD[SIZE]DCMDx[LENGTH]较小者。

<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US">3.1.9</span></chsdate> DMA控制寄存器一览

DMA控制寄存器信息如表3-2所示。

3-2 DMA控制寄存器信息

0x4000_0000

DCSR0

DMA通道