ARM922T核ZCP320A处理器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所示;
第二步是对配置数据寄存器进行读或写。
《ARM922T核ZCP320A处理器PCI总线操作(第3页)》