PCI设备配置空间问题

PCI设备配置空间问题

  一般来讲,pci总线接口的实现有两种方法,一种是用可编程器件CPLD或FPGA,另一种方法是用专用的接口芯片,象PLX公司的PCI9054,CH365等。二者各有优缺点,使用可编程器件呢,可以根据具体需要,优化接口逻辑,能获得较高的性能,灵活性是其最大的特点。但是由于PCI协议比较复杂,实现的时候比较困难,逻辑关系验证起来也比较麻烦。后一种方法恰好解决了这个设计难点,节省了开发时间,所以比较常用。

   我现在不清楚的在于,一个PCI设备从上电开始到能工作完整的配置过程。就以专用接口芯片开发的pci板卡为例。专用接口芯片是不是要提供配置空间?PCI的配置空间(pci配置寄存器)在哪儿,怎么分配的?一般来讲,对专用接口芯片内部寄存器的配置是通过E2PROM事先用编程器写入配置信息(包括设备识别号,供应商代码号,Local总线三个空间大小以及基址等),然后上电时加载E2PROM的内容到内部寄存器中。那么PCI配置寄存器和本地配置寄存器都指的哪儿的寄存器呢?

  可以解答上面的问题了,一般接口芯片的寄存器分为PCI配置寄存器和局部配置寄存器。二者都可以由PCI总线和串行EEPROM访问。而PCI配置寄存器中的设备ID,制造商ID,版本号,首区类代码,类别代码,指令寄存器和状态寄存器等寄存器在所有的PCI设备中都必须实现,通常操作系统可根据这些寄存器的内容来确定PCI设备并加载其驱动程序。 另外PCI配置寄存器还提供基址寄存器,它跟局部配置寄存器一起在地址空间重定位PCI设备。这些寄存器的内容都是通过EEPROM加载的。

  应该来讲,最终情况,肯定是系统分配给PCI卡一个存储空间,当系统通过PCI总线访问这个区域时,专用接口芯片就会应答,并且将总线上的地址转换为本地地址,进而进行相关操作。

PC机中包括三种空间:存储器空间、I/O空间、配置空间。存储器空间主要包括内存、显存、扩展ROM、设备缓冲区等,一般用于存放大量数据和进行数据块交换。I/O空间主要包括设备的控制寄存器和状态寄存器,一般用于控制和查询设备的工作状态以及少量数据的交换。配置空间主要用于向系统提供设备自身的基本信息,并接受系统对设备全局状态的控制和查询。

为避免地址冲突,PCI总线要求各个设备所占用的地址能够重定位,重定位是由设备的配置空间的基址寄存器实现的,通常情况下,各个设备的基址寄存器总是被BIOS或操作系统分配为不同的基址,从而将各个设备分别映射到不同的地址范围。在需要时,应用程序也可以自行修改基址寄存器中的基址,从而将设备映射到指定的地址范围。

后续:PCI总线2.1版规范指出,全部PCI设备必须实现PCI配置空间。2.2版规范说:每个设备,除了主总线桥,必须实现配置地址空间。可见,PCI的配置空间,就是在PCI板卡上实现的。这样看来,它指的就是专用接口芯片上的寄存器。

再续:看到一篇关于专用接口芯片PCI9054的文章,说,pci9054提供了三个物理总线接口:pci总线接口,EEPROM接口和局部总线接口。pci总线接口依据pci扩展板上定义的引脚分配情况将对应的信号连接在一起就行了;EEPROM中存放的是PCI9054的配置信息,系统加电时PCI9054自动加载其中的配置信息,并有BIOS通过PCI总线对配置寄存器读写,来完成各种控制功能。

续:BAR中可读不可写的位数决定了存储空间的大小,同样如果读回空间大小以后,将基地址写回去的时候,改变的也只是高位可写的。举例来说,如果从10h写全f读回fff00001,说明memory空间大小为1M,再往里写的时候同样只能改变高位的3个f,即这个设备的IO基址必然为xxx00001。其中x就是你往里写的。

2011.1.12续:EEPROM只是用来存储需要配置的寄存器信息的,对EEPROM的编程有两种方法:一是先用专门的烧录器把数据下载到EEPROM再插入板卡中,这种方法修改起来比较麻烦;二是用专用的软件在线写,如PLX公司提供的专用调试软件PLXmon。PLXmon具有以下功能:PCI总线的探测与选择;配置寄存器的检查和修改;内存空间的显示、修改和填充;EEPROM内容的读写等。利用这个工具,我们可以随时对EEPROM的内容进行在线修改,大大提高了效率。值得注意的是每次修改完EEPROM都要对系统进行重启,使PCI配置寄存器和本地空间配置寄存器能够重新加载新的值。

阅读更多
个人分类: pcie学习
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭