您好,欢迎访问三七文档
PCI是PeripheralComponentInterconnect(外设部件互连标准)的缩写,它是目前个人电脑中使用最为广泛的接口,其位宽为32位或64位,工作频率为33MHz,最大数据传输率为133MB/sec(32位)和266MB/sec(64位)。可插接显卡、声卡、网卡、内置Modem、内置ADSLModem、USB2.0卡、IEEE1394卡、IDE接口卡、RAID卡、电视卡、视频采集卡以及其它种类繁多的扩展卡.目前PCI-E是PCI最新的发展方向,串行,点对点传输,每个传输通道独享带宽;支持双向传输模式和数据分通道传输模式;在PCI-E3.0规范中,X32端口的双向速率高达320Gbps,可以满足新一代的I/O接口,比如:千兆(GE)、万兆(10GE)的以太网技术、4G/8G的FC技术一.PCI引脚1.接口控制管脚(出问题时常测这些管脚)FRAME#:帧周期信号。Master驱动,表示一次访问的开始和持续时间。FRAME#无效时,是传输的最后一个数据周期。IRDY#:Master准备好信号。TRDY#:Slave准备好信号。当这两者同时有效时,才能进行完整的数据传输,否则即为等待周期。在写周期,IRDY#信号有效时,表示有效的数据信号已在AD0~AD31中建立;在读周期,IRDY#信号有效时,表示Master已做好接收数据的准备。在写周期,TRDY#信号有效,表示Slave已做好了接收数据的准备。在读周期,TRDY#信号有效,表示有效数据已被送入AD0~AD31中,STOP#:停止数据传送信号,由Slave发出。当它有效时,表示Slave请求Master终止当前的数据传送。IDSEL:初始化设备选择信号。在读写配置空间时,用作Slave的片选信号(Slave通常把IDSEL连到AD[31:0]上的一根,PFA中的deviceid就是这么确定的)DEVSEL#:设备选择信号,由Slave驱动,该信号有效时,当前Slave设备已被选中二.时序读时序写时序:三.PCI配置空间256字节的PCI配置空间分为64字节的头标区和192字节的设备相关区两部分。头标区的各个寄存器用来唯一地识别设备;设备相关区则保存一些与设备相关的数据。配置空间的头标区又分为两部分:前16个字节的定义在各种类型的PCI设备中都是一样的;剩余的字节随设备类型不同而有所不同。位于偏移地址0EH处的头标类型字段规定了头标区的布局结构。目前,规范定义了三种头标类型。头标类型设备2PCI-CardBus桥1PCI-PCI桥0除上述桥外的所有设备因为PCI网卡的头标类型是0,所以下面我们就来详细说说其布局结构,至于其他类型的头标请读者自行阅读。图3就是头标类型0的头标区的布局。头标区中的寄存器根据功能可分成下面几组:1.设备的识别(1)供应商代码:该寄存器用于识别PCI设备的制造商,具体代码由PCISIG()分配。0FFFFH是无效的供应商代码。(2)设备代码。该寄存器用来标识某供应商生产的具体设备,代码由各供应商定义。供应商代码和设备代码,读者可以到网站查阅。图3头标类型0的头标区的布局(3)版本号。该寄存器用来定义指定设备的版本信息。(4)头标类型。该字段的第7位为“1”标识该设备是多功能设备,为“0”标识为单功能设备;该字段的0~6位就是上文表中所述的头标类型。(5)设备分类代码。用来标识设备的总体功能和特定的寄存器级编程接口。上面5个字段均为只读类型,所有的PCI设备都必须实现其功能。2.设备控制和设备状态(1)命令寄存器为一个设备发出和响应PCI总线命令提供粗略的控制。图4就是命令寄存器格式。图4命令寄存器格式我们比较感兴趣的位有:a.位0(I/O空间控制):控制对I/O空间访问的响应。该位为0时,禁止设备响应对I/O空间的访问;该位为1时,允许设备响应I/O空间的访问。缺省设置为0。b.位1(存储器空间控制):控制一个设备对存储器空间访问的响应。该位为0时,禁止响应;该位为1时,允许设备响应对存储器空间的访问。缺省设置为0。至于其他位的功能,读者若有兴趣可以自行查阅。(2)状态寄存器用来记录PCI总线有关的状态信息。3.基址寄存器PCI设备中,除了配置空间外,还有两个物理空间:内存空间和I/O空间。为了访问这两个地址空间,就必须使用基址寄存器。头标类型0中涉及3种基址寄存器:内存空间基址寄存器、I/O空间基址寄存器和扩展ROM基址寄存器。关于基址寄存器,我们下一章重点讲述。4.其他寄存器其他寄存器包括一些本文不涉及到的寄存器,如中断引脚、中断线等等。有兴趣的读者可以自行阅读。四.PCI配置空间的访问上面说过,PCI规范使用从0CF8H~0CFFH这8个I/O地址来访问所有设备的PCI配置空间。这8个字节实际上构成了两个32位寄存器:0CF8H寄存器叫做“配置地址寄存器”;0CFCH叫做“配置数据寄存器”。当要访问配置空间的寄存器时,先向地址寄存器写上目标地址,然后就可以从数据寄存器中读写数据了。我们说过,PCI配置空间对应于一个PCI逻辑设备,所以要访问一个配置空间的某个寄存器,必须要指定:PCI总线号、PCI设备号、PCI设备功能号和寄存器号。配置地址寄存器的格式如下:313024231615111087210使能位保留总线号设备号功能号寄存器号00第0、1位上的“0”是用来要求你只能按双字(4字节)来读写配置空间寄存器。第31位“使能位”用来决定是否允许访问配置空间:为“1”时表示可以访问;为“0”时表示不可以访问。例如,为了读总线号0、设备号17H、功能号0的30H寄存器,你可以使用下面的代码:…MOVEAX,8000B830HMOVDX,0CF8HOUTDX,EAXMOVDX,0CFCHINEAX,DA…五.PCI配置空间的遍历从上面的配置地址寄存器的格式我们可以看出:总线号从0~255、设备号从0~31、功能号从0~7。根据配置空间的第0个寄存器是否返回0FFFFH值来判断是否存在该PCI设备。下面是PCI配置空间遍历的流程图:图5遍历PCI配置空间流程图六.基址寄存器PCI设备中,除了配置空间外,还有两个物理空间:内存空间和I/O空间。为了访问这两个地址空间,就必须使用基址寄存器。头标类型0中涉及3种基址寄存器:内存空间基址寄存器、I/O空间基址寄存器和扩展ROM基址寄存器。PCI设备可以在地址空间中浮动是PCI局部总线中最重要的功能之一。它能够简化设备的配置过程。在系统上电时,与设备无关的系统软件必须确定有哪些设备存在,同时建立一个统一的地址映射关系,并确定一个设备是否有扩展ROM。1.地址映射加电软件在引导操作系统之前必须建立一个统一的地址映射。也就是说,必须确定在系统中有多少存储器以及系统中的I/O控制器要求多少地址空间。当这些信息确定之后,加电软件便可以把I/O控制器映射到合理的地址空间并引导系统。为了使这种映射能够做到与响应的设备无关,从而在配置空间的头标区中安排了一个供映射时使用的基址寄存器。在所有的基址寄存器中,位0均为只读位并且用来决定能够是存储器空间还是I/O空间。如果该位为0,则表示映射到存储器空间;若为1则表示映射到I/O地址空间。2.存储器基地址寄存器映射到存储器空间的基址寄存器可以是32位宽度,也可以是64位宽度(支持映射到一个64位地址空间时)(如图6)。图632/64存储器基地址寄存器格式其中位0要用硬件方法使其恒为0。而位2和位1两位用来表示映射类型,具体如下:位2和位1映射类型00基地址寄存器为32位宽,可以在32位表示的存储器地址范围的任何地方进行映射01保留10基地址寄存器为64位宽,可以映射到以64位表示的存储器空间的任何地方11保留至于位3,若数据是可预取的,就应将它置为1,否则清0。该寄存器的区域各位用来将一设备映射到存储器空间。基地址寄存器中用于32位存储器译码器的位【31::4】和用于64位存储器译码器的位【63::4】称为基地址单元。它的作用是:确定与译码器相关的存储器的大小;给译码器分配地址。如果存储器设备需要小于4K的存储空间,规范建议存储器范围强行设为4KB。3.I/O基地址寄存器映射到I/O空间的基址寄存器宽度总是32位(如图7):图7I/O基地址寄存器格式其中位0值为1(用硬件实现的),位1为保留位并且其读出值必须为0,其余各位用来把设备映射到I/O空间。当基地址寄存器位0的返回值为1时,表示这是一个I/O译码器,而不是存储器译码器,位1保留并总是返回0,【31::2】是基地址单元,并用于确定需要的I/O块容量,设置它的起始地址。规范要求映射它的控制寄存器组到I/O空间的设备不必请求每个I/O基地址寄存器超过256个单元。4.确定块容量和分配地址范围要确定存储器的容量或I/O空间大小可以通过简单地向基地址寄存器写入全“1”并回读来确定。若返回一个是0值,则表示未实现基地址寄存器;如果读回地值为非0,则编程人员通过从基地址单元的最低有效位向上扫描返回值以找到第一个被成功置“1”的位来确定所需存储器的容量或I/0空间的大小。假设寄存器的位0是一个加权二进制1,那么位1的值就是2,位2的值就是4,依此类推。这样,在基地址单元中第一个发现的1所对应的加权二进制值便是所需的空间数。这也是寄存器的第一个可读/可写位,在它之上的所有位钧定义为可读/可写位。这个信息发现后,程序将32/64位存储器起始地址或32位I/O地址写入基地址寄存器中。5.扩展ROM基地址寄存器有些PCI设备,尤其是那些准备用于PC结构扩展板上的设备,需要EPROM作为扩展ROM。为此,在配置空间偏移地址30H处开始定义了四个字节的寄存器,用来处理这个扩展ROM的基地址和大小。(如图8)图8扩展ROM基地址寄存器格式该寄存器和32位基地址寄存器相比,除了位的编码和用途不同之外,其它功能完全相似。它的高21位对应于扩展ROM基地址的高21位。一个设备实际实现的位数取决于该设备要求多大的地址空间。例如,一个设备要求它的扩展ROM映射到一64KB存储区域时,它就应该实现此寄存器的高16位,其它5位用硬件方法使它们恒为0。凡是支持扩展ROM的设备必须实现这个寄存器。与设备无关的配置软件通过对扩展ROM基址寄存器的地址位上写入全“1”,然后再读回以确定设备要求多大的地址范围。所有的无关位上都返回0,从而有效地指出了地址边界,也就知道了设备要求的这一块地址空间的大小。一个设备要求的地址空间范围不能超过16MB。这个寄存器的位0用来控制相应的设备是否能够接受对其扩展ROM的访问。当该位为0时,禁止访问设备的扩展ROM地址空间;当该位为1时,允许将本寄存器的其它位作为参数进行地址译码。命令寄存器中的存储器空间位优先于扩展ROM的使能位,但是,如果存储器空间位和扩展ROM的的使能位同时为1时,设备就必须响应对其扩展ROM的访问。扩展ROM的使能位在复位后应该为0。七.PCI拓扑结构PCI拓扑结构,有如下例子在上图的总线结构中,ethernet设备和pci-pcibridge的资源空间必须要是pcibus0的一个子集同理,SCSI和VIDEO同类型资源必须要是pci_bus1的子集。CPU访问PCI的过程是这样的(只有一个根总线和pci-pcibridge过滤窗口功能打开的情况):1.cpu向pci发出一个I/O请求。首先经过根总线.它会判断是否在它的资源范围内.如果在它的范围,它就会丢向总线所在的每一个设备.包括pcibridge.如果没有在根总线的资源范围,则不会处理这个请求.2.如果pci设备判断该地址属于它的资源范围,则处理后发出应答3.pcibridge接收到这个请求,它会判断I/O地址是否在它的资源范围内.如果在它的范围,它会把它丢到它的下层子线.4.下层总线经过经过相同的处理后,就会找到这个PCI设备了一个PCI设备访问其它PCI设备或者其它外设的过程:1.首先这个PCI发出一个请求,这个请求会在总线上广播2.
本文标题:PCI设备快速编程
链接地址:https://www.777doc.com/doc-2849230 .html