ARM922T核ZCP320A处理器PCI总线操作
2 PCI总线编程模式 3.1 初始化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 主设备时的内部结构。
下面例程都是基于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所示;
第二步是对配置数据寄存器进行读或写。
PCI总线 相关文章:
- 基于PCI总线的双DSP系统及WDM驱动程序设计(01-26)
- 1553B总线在嵌入式系统中的应用(01-29)
- 基于DSP的PCI总线数据采集系统的研究(03-02)
- 采用PCI9052设计PCI总线运动控制卡(05-04)
- 采用8位单片机驱动PCI总线网卡的设计方案(03-02)
- 基于cPCI总线的嵌入式遥测前端处理器系统设计(04-27)