摘要:本文简要说明了ZCP320A处理器内部集成的PCI总线接口、编程模式及工作模式,并介绍了作为主设备时如何访问外部扩展的RTL8139 PCI网卡设备。为以后的设计者提供借鉴及应用基础。
关键词:ARM922T ZCP320A PCI总线 RTL8139
ZCP320A采用了ARM公司的ARM922T核,ARM922T是ARM9TDMI通用处理器家族中的一员采用哈佛结构内部使用5级流水线支持32位的ARM指令系统和16位的Thumb指令系统包括两个相互独立的8KB 的数据和指令高速缓存,高速缓存行的长度是8个字。ARM922T 实现增强型ARM结构v4MMU以提供对指令和数据地址的转换和访问许可检测。ARM922T 支持ARM调试结构协处理器以及Tracking ICE。
ZCP320A内部使用三条AHB总线连接实现功能所需的主从设备。每条AHB总线连接一个主设备和多个从设备。根据总线连接的主设备的不同,三条总线分别被命名为COREBUS(ARM9 核作为该总线的主设备)、PBUS(PCI桥作为该总线的主设备)和DBUS(DMA控制器作为该总线的主设备)。这三条总线由总线管理模块统一进行管理。
ZCP320A集成的PCI总线接口是一个符合PCI协议2.2的总线接口。由于ZCP320A的内部总线是符合AMBA AHB协议的总线,所以在ZCP320A中设计了一个AHB-PCI的桥来实现AMBA AHB协议到PCI协议的转换。PCI总线通过AHB-PCI桥连接到内部AHB总线。
1 PCI总线接口概述
在ZCP320A中设计了一个AHB-PCI的桥来实现AMBA AHB协议到PCI协议的转换。PCI总线通过AHB-PCI桥连接到内部AHB总线。如图1所示。
AHB-PCI 桥是实现AHB总线和PCI总线的协议转换,实现AHB总线和PCI 总线之间数据交换的一个设备,AHB-PCI桥是32位的,即AHB总线和PCI总线都是32位的地址/数据总线。在CPU内部桥和两条内部总线相连接,COREBUS 和PBUS。这两条内部总线都符合AMBA AHB总线协议。在COREBUS上,ARM CORE 作为该总线的唯一主设备,桥则作为该总线的一个从设备。在PBUS上,桥作为该总线的唯一主设备,PCI缓冲及存储器则作为其从设备。在CPU外部,桥则和PCI总线相连接。通过COREBUS, ARM CORE访问桥及穿过桥访问外部的PCI设备。外部的PCI设备则通过PCI总线访问该桥并穿过桥到PBUS上访问CPU的内部存储器等资源。桥为PCI总线和内部ARM CORE及内部存储器的通信提供了数据缓冲。ARM CORE写数据缓冲由两个FIFO组成,每个FIFO可容纳32字节的数据和4 字节的地址。ARM CORE读数据缓冲由一个FIFO组成,该FIFO可容纳32字节的数据和4字节的地址。在另一侧PCI写数据缓冲由两个FIFO组成,每个FIFO可容纳32字节的数据和4字节的地址。PCI读数据缓冲由一个FIFO组成,此FIFO也可容纳32字节的数据和4字节的地址。当有大量数据需要进行传输的时候,桥上提供了DMA控制器供使用,可以大大提高数据通信效率。该DMA 控制器具有一个32字节的接收FIFO和一个32字节的发送FIFO。因此DMA在传输数据的时候可以实现乒乓效应,也就是说在接收的同时发送数据。
通过AHB-PCI桥,内部的ARM核可以对外部PCI设备进行访问;同时,外部的PCI设备也可以对内部的CPU资源进行访问。当AHB-PCI桥作为COREBUS上的从设备的时候,它从COREBUS上接收ARM发出读/写命令,然后在PCI总线上发起相应的传输,也就是说此时桥作为PCI的主设备。当外部PCI设备对AHB-PCI桥进行访问的时候,桥作为PCI从设备接收PCI 总线上的命令,同时作为AHB主设备在PBUS上发起相应的操作以达到访问CPU资源的目的。这就是CPU访问外部设备和外部设备访问CPU资源的两条路径。
ZCP320A的PCI桥在PCI总线仲裁方面,可以用外部的仲裁器,也可以用桥本身提供的仲裁器。设计人员可以根据需要选择用外部的仲裁器,还是用ZCP320A的PCI桥上的仲裁器。这个选择通过配置PCI混合控制寄存器PCI_MISC_CTL(偏移地址是0x100)的位12。如果使用外部仲裁器则将该位配置为1,而如果使用桥内部的仲裁器则将该位配置为0。桥上的PCI 仲裁器最多支持6个PCI主设备(包括ZCP320A本身)。其仲裁算法为分组轮循的优先算法。
ZCP320A提供了地址转换功能和地址空间范围定义功能。地址转换包括两个方向,一是从ARM CORE到外部PCI空间的地址转换;二是从PCI空间到PBUS空间的转换。地址转换和地址空间范围都是通过一个称为地址窗口的机制来实现的。在从ARM CORE到外部PCI空间的方向定义了4个窗口,即窗口0/1/2/3,每个窗口由两个寄存器来定义,窗口基地址寄存器(CBUS_BST0/1/2/3)和窗口控制寄存器(CBUS_TI0/1/2/3_CTL)。在窗口基地址寄存器中定义了该窗口在COREBUS上的基地址及该窗口的属性(存储器或I/O空间是否可预取,是否可对32位的任一字节进行访问),而在窗口控制寄存器中则定义了该窗口转换到PCI空间后的基地址,该窗口的大小及窗口使能控制和地址转换使能控制。在从PCI 空间到PBUS空间的方向也定义了4个窗口,PCI寄存器窗口和PCI从设备窗口0/1/2。其中PCI寄存器窗口由一个寄存器(PCI_BSREG)来控制该窗口在PCI总线空间的基地址及窗口属性,而PCI 从设备窗口0/1/2则由两个寄存器来定义,即窗口基地址寄存器(PCI_BST0/1/2)和窗口控制寄存器(PCI_TI0/1/2)。在窗口基地址寄存器中定义了该窗口在PCI总线上的基地址及窗口属性(存储器或I/O空间是否可预取,是否可对32位的任一字节进行访问),而在窗口控制寄存器中则定义了该窗口转换到PBUS空间后的基地址及该窗口的大小窗口使能控制和地址转换使能控制。
2 PCI总线编程模式
PCI桥上的寄存器占了4K的空间,从偏移地址0x000到0xfff。其中0x000到0x0ff是PCI协议中的标准PCI配置寄存器。这部分的寄存器可以从COREBUS和PCI 总线上进行访问,在COREBUS上访问的时候是当作存储器访问,而在PCI总线上则只能通过配置访问来进行。
偏移地址从0x100到0x1ff是扩展的PCI寄存器,用来定义桥作为PCI从设备时的窗口以及一些其它的控制。其中0x120是锁寄存器,用来控制寄存器区的写访问。
偏移地址从0x200到0x2ff是COREBUS控制寄存器,用来控制COREBUS上的窗口和地址属性。即桥作为PCI主设备时使用该组寄存器。
偏移地址从0x300到0x3ff是错误检测和处理寄存器。这部分的寄存器是对桥的错误进行控制,对错误的状态进行检测并报告。
偏移地址从0x400到0x4ff是DMA控制器部分寄存器。这部分的寄存器是DMA的专用命令寄存器,用来控制和管理桥上的DMA的工作。
另外还有两个配置寄存器0xcf8配置地址寄存器和0xcfc配置数据寄存器。ARM CORE在COREBUS上通过对这两个寄存器的操作实现对外部的PCI设备的配置操作。
PCI寄存器区在COREBUS总线上的基地址是0xe0000000 ,而在PCI总线上的基地址是可配置的,在PCI_BSREG寄存器中配置。
桥上的寄存器既可以由ARM核在COREBUS上访问,也可以由外部的PCI主设备通过PCI总线访问。寄存器区有一个锁的机制,用来保护寄存器。锁可以保证在同一时间只有一个设备可以对寄存器区的值进行修改。当ARM CORE通过COREBUS来访问桥上的寄存器或外部PCI设备通过PCI总线访问桥上的寄存器的时候,必须先对寄存器进行锁定成功以后才能对寄存器进行写操作,而读操作则没有这个限制。锁机制的实现是通过锁寄存器REG_LOCK 来实现的。锁定的具体方法是:对锁寄存器偏移地址0x120写入0x1,然后通过读该寄存器来查看加锁是否已经成功。如果读得的该寄存器的值是0x1,则说明已经锁定了桥上的寄存器区,对寄存器的配置就可以进行了。而如果读得的结果是0x0的话,说明锁定失败。对于寄存器读操作来说,没有加锁的限制。因为读操作不改变寄存器的值。当对寄存器配置结束后必须消除对寄存器区的锁定,这样其它的设备才可以对寄存器进行配置。具体方法是对锁寄存器0x120写0x0。
3 PCI主设备工作模式
由于ZCP320A处理器带有PCI总线接口,所以我们设计一般是处理器上集成的PCI桥作为主设备,而外部扩展的PCI设备则作为从设备。下面以外扩的以太网卡RTL8139为例说明如何操作RTL8139中的寄存器。
在输出通道中,AHB-PCI桥作为COREBUS的从设备,同时作为PCI总线的主设备。它从COREBUS上接收命令,然后在PCI总线上发起相应的传输。图2描述了就是桥作为PCI 主设备时的内部结构。
3.1 初始化PCI桥
下面例程都是基于C语言,其中
#define REG_READ(addr,offset,data) \par*data = (*(volatile UINT32*)((addr)+(offset)))
#define REG_WRITE(addr,offset,data) \par (*(volatile UINT32*)((addr)+(offset))) = data
(1)锁寄存器并判断是否锁成功
REG_WRITE(0xe0000000,0x120,1);
REG_ READ (0xe0000000,0x120,&data);
if(!(data & 0x1)) return;
(2)配置COREBUS窗口基地址寄存器和控制寄存器
在COREBUS 上的地址空间分配与在PCI总线上的地址空间分配是独立的。PCI的数据空间在COREBUS上所占的范围是1G+512M到2G-1之间,地址范围是0x60000000到0x7fffffff 这里的基地址是固定的,为0x60000000。而地址范围可以根据实际情况来确定,通过相关的控制寄存器实现。同时,ZCP320A要访问的PCI设备的地址空间是不确定的,可能是所有的32位的地址空间的任意一段或几段,所以需要一个地址转换机制来实现地址空间从COREBUS到PCI总线之间的转换。
对于RTL8139,窗口基地址寄存器和控制寄存器配置如下:
REG_WRITE(0xe0000000,0x204,0x60000008);
/*windows 0,BaseAddr 0x60000000,CoreBus,Prefech */
REG_WRITE(0xe0000000,0x214,0x10000043);
/* PCI Bus RTL8139 BaseAddr: 0x100000000~0x1000ffff,大小为64K */
REG_WRITE(0xe0000000,0x208,0x00000000);./* Disable windows 1 */
REG_WRITE(0xe0000000,0x20C,0x00000000); /* Disable windows 2 */
REG_WRITE(0xe0000000,0x210,0x00000000); /* Disable windows 3 */
(3)使能PCI桥作为主设备
REG_WRITE(0xe0000000,0x04,0x06); /* Enable PCI Master */
3.2 配置RTL8139网卡的PCI配置空间寄存器
对于ARM核来说,通过AHB-PCI桥对外部PCI设备进行配置访问实际上是通过对配置地址寄存器(0xcf8)和配置数据寄存器(0xcfc)的访问来实现的,要对外部PCI设备进行配置访问。软件设计人员要执行以下两步:
第一步是将地址写入配置地址寄存器中,如图3所示;
第二步是对配置数据寄存器进行读或写。
配置地址寄存器的位31是配置使能位。在进行配置操作时必须将该位设置为1。30-24位是保留位;23-16位是总线号,直接连接在ZCP320A的PC 接口的总线为0号总线。15-11位是设备号,它主要取决于硬件信号IDSEL连接到哪个地址线(AD16-AD31)上,AD16-AD31分别表示设备号0-15。10-8位是功能号,对于单功能设备,其值为0。7-2是外部PCI设备的PCI配置空间寄存器偏移量。
要访问RTL8139,需要对其PCI配置空间寄存器作如下配置:
REG_WRITE(0xe0000000,0xcf8,0x80001814); /* Access 8139 BAR0 */
REG_WRITE(0xe0000000,0xcfc, 0x10000000); /* Set BAR0=0x100000000 */
REG_WRITE(0xe0000000,0xcf8,0x80001804);
/* Access 8139 Command and Status Register */
REG_WRITE(0xe0000000,0xcfc, 0x02000147);
/* Enable Bus Master and Memory , IO Access */
/* 下面是读取8139的VID和DID */
REG_WRITE(0xe0000000,0xcf8,0x80001800);
/* Access 8139 VID and DID Register */
REG_READ(0xe0000000,0xcfc, &VIDDID);
由此,我们可以利用已知的VID和DID来查找PCI总线是否存在该设备。由于8139的INTA直接连接到ZCP320A处理器的外部中断1引脚,所以不需要对配置空间的0x3c进行写操作。从此以后我们可以利用0x10000000作为RTL8139的基地址来访问RTL8139的寄存器。如访问偏移地址0x0000~0x0005来读取8139的MAC地址,即
for(i=0;i<6;i++)
mac[i] = *(UCHAR *)(0x10000000 + i);
接下来我们就可以编写RTL8139的驱动程序了,在此就论述了。
3.3 访问外部PCI设备需要注意的事项
ZCP320A要通过PCI桥对外部的PCI设备进行配置访问需要执行的步骤如下:
(1) 在硬件上要保证连接正确,主要有所要配置的从设备的IDSEL连接到哪一根地址线上,也就是它的设备号是多少。
(2)对PCI配置地址寄存器(0xcf8)进行正确配置,使它和硬件连接一致,主要指总线号和设备号。
(3)对PCI配置数据寄存器(0xcfc)进行读/写访问,从而实现对外部PCI设备的配置访问。
另外要注意的是由于作配置访问的时候要对配置地址和数据寄存器进行访问,而这两个寄存器属于桥上的寄存器区,所以要先对寄存器区进行锁定,然后才能进行配置写操作。
4 PCI从设备工作模式
在AHB-PCI 桥的输入通道,桥作为PCI总线的从设备同时作为AHB PBUS 的主设备,外部扩展的PCI设备则为主设备。桥从PCI总线上接收传输命令并在PBUS上发起相应的操作访问CPU的资源并反馈回去,通过FIFO将数据在PCI总线和PBUS之间传输实现两种总线协议的转换。
PBUS和PCI总线是PCI桥作为PCI从设备同时作为PBUS上的AHB主设备时的两条连接总线,这两条总线相互独立又通过PCI桥联系起来。
如图4所示。
外部PCI主设备可以通过AHB-PCI桥来访问PBUS上的SDRAM、FLASH以及PCI数据缓冲区A、B等。
至于PCI作为从设备,一般比较少用。所以在此不再介绍。
5 结束语
ZCP320A内部集成的PCI总线接口,大大简化了系统设计。可以无缝扩展PCI设备,例如网卡、显卡等。访问外部扩展的PCI设备只需按照上述说明即可。