PCI 总线及地址空间

来源:互联网 发布:mmd舞蹈动作数据 编辑:程序博客网 时间:2024/04/30 12:41

PCI的基本协议这里就不介绍了,因为一般的芯片协议都是集成好的,我只需要大体了解就行,不需要做芯片,我感觉就不需要太了解协议。 这里讲解是基于PLX 的9054(9052)芯片为基础的,本人只是入门,望批评指正。

一、地址映射与数据传输

上图中间部分是9054的内部结构图,9054实际上充当了一个“桥”的作用,即所谓的“桥片技术”。9054的作用其实是把LOCAL总线端管理的一片地址,和PCI总线端管理的一片地址一一对应起来,即所谓的地址映射,而PCI总线与PC机的CPU管理的内存地址又是一一对应的,这样就实现了桥:CPU 地址 <=> PCI 地址 <=> LOCAL 地址。

一般系统PCI地址是CPU地址一部分,关于PCI地址与系统地址关系可以看另一篇转载博文http://blog.csdn.net/lg2lh/article/details/8041029。

上面只是说了LOCAL总线与PCI总线以及CPU总线的对应关系,但是PCI技术的实际作用是进行数据传输。由内部结构图可以看出,9054内部没有什么存储单元,只有几个FIFO。那系统是怎么进行数据传输的呢,大家都知道一段地址对应了一段存储空间,由上面地址映射可以知道,PCI芯片9054实际就是把LOCAL总线地址管理的外部存储空间的数据传输到PCI总线地址对应的内存空间中,及CPU的内存空间。或者是将内存中的数据传输到LOCAL总线管理的外部地址空间中去。Local端地址总线管理的存储空间一般由我们的控制芯片如FPGA或MCU提供。

二、PCI9054的基本知识

PCI9054的引脚主要分为3部分:PCI总线接口,LOCAL总线接口,及串行EEPROM总线接口。

LOCAL总线的数据宽度为32位,时钟可达50Mhz。下面介绍三种总线的作用,接口图如下图所示。


PCI总线接口:负责与PC机PCI总线通信,要接至PCI板卡的金手指处,对32位系统,金手指一共120跟信号线,A,B两面各60根,1-62,其中50,51处,无金手指引脚,共60根。

LOCAL总线接口:主要负责LOCAL端地址数据管理,与外围CPLD或MCU相连。

串行EEPROM总线接口:主要负责PCI9054的所有的寄存器配置,将寄存器配置烧写至EEPROM,PCI设备上电后加载EEPROM内容,完成PCI9054的寄存器配置。主要包括:PCI配置寄存器,PCI本地配置寄存器,运行时间寄存器,DMA配置寄存器,I2O信息寄存器(消息队列寄存器?)。

 

PCI9054的PCI总线与LOCAL总线数据传输主要有三种模式:主模式,从模式,DMA模式。

而LOCAL总线的控制也有三种模式,M,C,J模式。其中常用C模式:地址数据总线非复用模式。

 

三、PCI9054的寄存器之间的关系

前面第一节讲到了PCI总线与LOCAL地址映射,以及PCI地址与PC机内存空间映射,一般PC机就认为PCI地址就是内存空间地址,所以9054解决的就是把LOCAL总线管理的地址空间与内存空间地址对应起来,下面讲一下如何通过9054寄存器配置映射关系。

要明确,是通过PLX_MON这个软件按要求配置好各寄存器内容,然后将数据烧写到EEPROM中,共17字。

首先看一下PCI9054寄存器主要有哪些,前面已说主要有五部分:PCI配置寄存器,PCI本地配置寄存器,运行时间寄存器,DMA配置寄存器,I2O信息寄存器(消息队列寄存器)

 

1、 PCI配置寄存器:主要用来配置与PCI总线相关的寄存器,例如,设备ID,供应商ID,类别代码,版本号,系统供应商ID,子系统ID等。PCI设备ID为9054,供应商ID为10B5,类别代码0680。对应寄存器如下:


主要介绍一下最后四个寄存器,这四个主要完成LOCAL端总线相关的寄存器在PCI总线的映射,以及LOCAL总线管理的地址空间在PCI总线上的映射。这四个寄存器都是由系统进行配置的,无法通过EEPROM配置。其中PCIBAR0,PCIBAR1,比较好理解,就是把LOCAL总线配置寄存器,DMA寄存器,运行寄存器映射到对应的内存空间去,配置的值就是他们在内存空间的起始地址

下面介绍PCIBAR2,PCIBAR3寄存器,后面会提到LOCAL总线管理了两部分地址空间,space0和space1。PCIBAR2,PCIBAR3就是把这两部分映射到PCI总线地址上,即把这两个空间映射到PC机的内存空间。PCIBAR2的配置值就是LOCAL总线端space0空间映射到PCI内存空间的起始地址,PCIBAR3的配置值则是LOCAL总线端space1空间映射到PCI内存空间的起始地址。而LOCAL总线端SPACE0和SPACE1在local端的实际地址及范围,则是由LOCAL配置寄存器决定。下面介绍LOCAL端配置寄存器。

 

2、 LOCAL配置寄存器


SPACE0对应的寄存器。

LAS0RRSPACE0基地址寄存器。这个寄存器与PCI总线的PCIBAR2寄存器相互对应,即LOCAL端的FPGA(MCU)就是通过访问这个地址来访问PCIBAR2所指的PCI内存空间

若此时LAS0RR设为0x80000001,而PCIBAR2设置值是0XE7000000.则对于PCI空间0XE7000000的访问就会映射到对本地空间0x80000001的访问。映射图如下。


LAS0BA:SPACE0空间的地址范围,在EEPROM的设置值是实际范围的补码

 

LAS1RR LAS1BA与上面两个相同,只是用来映射SPACE1空间起始地址和范围的,不再赘述。

 

3、 DMA配置寄存器


4、 寄存器配置方法

最后介绍一下EEPROM配置字,配置字有长加载模式和额外长加载模式,其中长加载模式共17个长字,额外长加载模式则22个长字。其中LAS1RR LAS1BA这两个寄存器是在额外长加载模式中配置的。对PLX9054最重要的配置就是完成对PCI寄存器和LOCAL寄存器的配置。17长字与22长字具体加载内容如下表。





以上转自:http://blog.csdn.net/lg2lh/article/details/8042008

以下转自:http://blog.csdn.net/lg2lh/article/details/8041029

PCI总线地址空间与系统地址空间的关系

1、PCI地址空间
PCI总线具有32位数据/地址复用总线,所以其存储地址空间为2的32次方=4GB。也就是PCI上的所有设备共同映射到这4GB上,每个PCI设备占用唯一的一段PCI地址,以便于PCI总线统一寻址。每个PCI设备通过PCI寄存器中的基地址寄存器来指定映射的首地址。PCI地址空间对应于计算机系统结构中的PCI总线。



2、系统地址空间

如果处理器具有32位的地址总线,其理论可寻址空间为2的32次方=4GB。但这并不意味着内存就可以4GB大小,其实XP系统最大内存大约为2GB,这与CPU访问系统中其它设备的存储器方式有关(比如CPU访问PCI总线上的存储器)。

计算机系统中在不同的物理位置上存在着不同设备,不同的设备又各自具有存储器,那么CPU如何访问这些存储器呢?CPU把系统中各个设备的存储空间映射到一个统一的存储空间上,称为系统存储空间共4GB,这样CPU就可以访问到所有的存储器。比如PCI存储器映射到从0xFFF80000开始的地址空间,显卡映射到0XFFF00000,再加上操作系统会占用一些空间,就只剩下不到2G能真正分配给物理内存了。(具体数值是为解释需要取的任意值,不代表真实情况)

系统地址空间对应于计算机系统结构中的前端总线(FSB)。



3、PCI总线地址与系统存储空间转换映射

我们假设在一个32位处理器中,其存储器域的0xF000-0000~0xF7FF-FFFF(128MB)这段物理地址空间与PCI总线的地址空间存在映射关系。

当处理器访问这段存储器地址空间时,HOST主桥将会认领这个存储器访问,并将这个存储器访问使用的物理地址空间转换为PCI总线地址空间,并与0x7000-0000~0x77FF-FFFF这段PCI总线地址空间对应。

为简化起见,我们假定在存储器域中只映射了PCI设备的存储器地址空间,而不映射PCI设备的I/O地址空间。而PCI设备的BAR空间使用0x7000-0000~0x77FF-FFFF这段PCI总线域的存储器地址空间。




PCI桥的BaseLimit寄存器保存“该桥所管理的PCI子树”的存储器或者I/O空间的基地址和长度。值得注意的是,PCI桥也是PCI总线上的一个设备,在其配置空间中也有BAR寄存器,本节不对PCIBAR寄存器进行说明,因为在多数情况下透明桥并不使用其内部的BAR寄存器。下文以32所示的处理器系统为例说明上述寄存器的初始化过程,该处理器系统使用的存储器域与PCI总线域的映射关系如31所示。

注意观察上图中PCI设备的BAR0寄存器值,如果PCI设备向下级联了(相当于PCI桥),BAR0是不变的,而且LIMIT寄存器受PCI未继续级联(而是直接接了PCI设备)的BAR0影响。

PCI设备的BAR寄存器中,包含该设备使用的PCI总线域的地址范围。在PCI设备的配置空间中共有6BAR寄存器,因此一个PCI设备最多可以使用632位的PCI总线地址空间,或者364位的PCI总线地址空间。这些BAR空间可以保存PCI总线域的存储器地址空间或者I/O地址空间,目前多数PCI设备仅使用存储器地址空间。而在通常情况下,一个PCI设备使用23BAR寄存器就足够了。

为简化起见,我们首先假定在32中所示的PCI总线树中,所有PCI Agent设备只使用了BAR0寄存器,其申请的数据空间大小为16M字节(0x1000000字节)而且不可预读,而且PCI桥不占用PCI总线地址空间,即PCI桥不含有BAR空间。并且假定当前HOST主桥已经完成了对PCI总线树的编号。

根据以上假设,系统软件该PCI总线树的遍历过程如下所示。

(1)      系统软件根据DFS算法,系统软件率先寻找到第一组PCI设备,分别为PCI设备31PCI设备32[1],并根据这两个PCI设备需要的PCI空间大小,从PCI总线地址空间中(0x7000-0000~0x77FF-FFFF)为这两个PCI设备的BAR0寄存器分配基地址,分别为0x7000-00000x7100-0000

(2)      当系统软件完成PCI总线3下所有设备的BAR空间的分配后,将初始化PCI3的配置空间。这个桥片的Memory Base寄存器保存其下所有PCI设备使用的“PCI总线域地址空间的基地址”,而Memory Limit寄存器保存其下PCI设备使用的“PCI总线域地址空间的大小”。系统软件将Memory Base寄存器赋值为0x7000-0000,而将Memory Limit寄存器赋值为0x200-0000

(3)      系统软件回朔到PCI总线2,并找到PCI总线2上的PCI设备21,并将PCI设备21BAR0寄存器赋值为0x7200-0000

(4)      完成PCI总线2的遍历后,系统软件初始化PCI2的配置寄存器,将Memory Base寄存器赋值为0x7000-0000Memory Limit寄存器赋值为0x300-0000

(5)      系统软件回朔到PCI总线1,并找到PCI设备11,并将这个设备的BAR0寄存器赋值为0x7300-0000。并将PCI1Memory Base寄存器赋值为0x7000-0000Memory Limit寄存器赋值为0x400-0000

(6)      系统软件回朔到PCI总线0,并在这条总线上发现另外一个PCI桥,即PCI4。并使用DFS算法继续遍历PCI4。首先系统软件将遍历PCI总线4,并发现PCI设备41PCI设备42,并将这两个PCI设备的BAR0寄存器分别赋值为0x7400-00000x7500-0000

(7)      系统软件初始化PCI4的配置寄存器,将Memory Base寄存器赋值为0x7400-0000Memory Limit寄存器赋值为0x200-0000。系统软件再次回到PCI总线0,这一次系统软件没有发现新的PCI桥,于是将初始化这条总线上的所有PCI设备。

(8)      PCI总线0上只有一个PCI设备,PCI设备01。系统软件将这个设备的BAR0寄存器赋值为0x7600-0000,并结束整个DFS遍历过程。



0 0
原创粉丝点击