PCI总线操作 之 PCI配置周期
PCI总线协议中定义了256字节的配置空间,用来驱动和配置PCI设备。配置空间的寄存器在总线第六章有描述,这里主要讨论访问pci配置空间的总线命令的具体操作。
在PCI总线的拓扑结构中,每个PCI设备都有一个固定唯一的地址,我们称之为config address。在物理上,对pci设备的配置都需要通过此config address 译码找到对应的设备。也即是,设备的IDSEL 脚要被选中,当然此时AD[1:0]的值为“00”。找到PCI设备之后,访问内部的配置空间寄存器(64-Dword),是通过AD[7:2]和byte enable线来译码实现。如果pci针对某个config address去译码,没有任何设备反馈的话,那么此次访问以Master-Abort来终结。
这里要说明一个问题,IDSEL的连线和DeviceNO。
如果某设备IDSEL在线路上连接到AD16,那么该设备的PCI device NO为0=16-16。
如果IDSEL连接到总线上的AD17,则PCI DeviceNO为1=17-16;以此类推。那么对于DeviceNO为17-31怎么处理呢? 一般情况不会有设备存在。主桥会处理这类地址周期,但是不会去影响AD[31:16]线,并且以Master-Abort方式来结束这次传输。
下面是PCI配置周期的Read 时序图
IDSEL只是在配置周期的寻址阶段其效果。如上图中,为了保证IDSEL能稳定的被取样,需要在FRAME#动作之前,让地址总线多驱动一段时间,当做delay。
配置类型
为了适应PCI总线中的多层次结构,定义了两种总线配置类型,如下图所示,主要区别在与配置周期中地址阶段AD总线上的不同。
Type0和Type1的配置周期中明显的不同在于AD[1:0]线。Type0(当AD[1:0]=“00”)用来访问当前总线上挂载的pci设备。而type1(当AD[1:0]=“01”)用来访问非当前总线的pci设备,需要通过pci-pci bridge来解析到另外的bus上。Bridge解析到AD线,得到其下一层bus上某个device的DeviceNO,则会产生type0的配置周期给下一层bus,同时拉动IDSEL线去访问对应设备。
如果目标设备不是在下一层bus,则Bridge会产生一个type1的周期,普通设备不会响应type1,只有PCI-PCI bridge才会理会type1周期。通过BusNO一层一层的通过Bridge传导到对应的Bus上。如果某个Bridge发现该配置周期中的busNO为自己的secondary busNO,则它会将此配置周期进行剥离,解码。只保留AD[10:2]不变,AD[1:0]变成“00”,其他AD清零,同时拉动IDSEL线,访问响应的设备。