1、PCI典型拓扑
2、type0和type1
名称 | 含义 |
---|---|
Bus Number | 设备所在总线号 |
Device Number | 设备分配到的设备号 |
Function Number | 功能号,有的设备是支持多个功能的,最多8种功能 |
Register Number | 要访问的寄存器地址 |
(1)type0和type1的区别:AD[1:0]是00代表是type0,AD[1:0]是01代表是type1;
(2)type0功能:用于配置挂载在本地PCI总线上的设备;
(3)type1功能:用于将配置信息发送给其他PCI总线段的设备;
总结:type0是配置直接挂载在PCI总线上的设备,type1是用于配置通过PCI桥挂载的设备;
3、为什么type1需要指定Bus Number、Device Number ?
3.1、PCI根桥配置直接挂载的PCI设备
(1)type0只使用了AD[10:0],AD[31:11]是空闲的,可以用于选中PCI设备,也就是和PCI设备的IDSEL引脚相连;
(2)假设AD[31:11]每个引脚都连接一个PCI设备的IDSEL引脚,根桥可以依次拉高每个引脚,每次选中一个设备;
(3)选中一个PCI设备后,在AD线上发送type0配置信息,只有被选中的PCI设备才会去响应type0;
(4)因为通过IDSEL引脚去唯一确定了哪个PCI设备会响应,所以不需要再通过Bus Number和Device Number去确定响应设备;
3.2、PCI根桥配置通过PCI桥挂载的PCI设备
(1)首先回顾,PCI根桥选中直接挂载的PCI设备,是通过与PCI设备IDSEL引脚直连的AD[31:11],但是通过PCI桥挂载的PCI设备,PCI根桥并没有和间接挂载的PCI设备的IDSEL引脚相连的AD线,所以根桥是不能通过直接操作PCI设备的IDSEL引脚来选择PCI设备;
(2)PCI桥设备自己会去扫描挂载在PCI总线上的设备,用type0配置信息,就和上面 3.1的过程是一样的,扫描完会给每个PCI设备分配一个PCI设备号;
(3)PCI根桥会给PCI桥分配PCI总线号;
(4)当根桥发出type1配置信息,直接挂载的PCI设备会忽略掉,PCI桥设备会比较总线号,如果总线号是自己能处理的就会转发;
(5)当配置信息转发到type1中指定的总线号所在的PCI段时,PCI桥会通过Device Number去选择设备,也是通过IDSEL引脚;
(6)总线号对应的PCI桥会把type1转换成type0发到PCI总线上;
补充:因为pci桥已经通过解析PCI总线号和Device Number来选中PCI设备的IDSEL引脚,所以后续传输就可以直接使用type0;
3.3、PCI桥对type1的处理
4、两种配置空间
4.1、配置空间的布局
(1)一个PCI设备最多支持8种功能,每种功能都有256字节的配置空间;
(2)256字节的配置空间分为两部分:前64字节是预定义的,所以的PCI设备都是一样的,64字节以后的配置空间由PCI设备自定义;
(3)配置空间分为三种,上面列出的是Header type 0、Header type 1,还有一种是CardBus桥的头,这种很少用;
4.2、PCI桥如何识别两种配置空间
(1)Header type 0是PCI终端设备使用的配置空间,Header type 1是PCI桥使用的配置空间;
(2)PCI桥设备会依次扫描每个PCI插槽,尝试读取每个插槽上的PCI设备配置空间的地址为0xE的寄存器值,也就是Header Type,如果是"00"则是Header type 0,如果是"01"则是Header type 1;
4.3、总要的配置空间字段介绍
配置空间每个字段详细的含义介绍,阅读《PCI_SPEV_V3_0.pdf》的6.2节;
5、读配置空间的时序图
(1)第三个周期上升沿:PCI桥将要访问的配置信息发到AD总线上,可以使type0或者type1,同时将要访问设备的IDSEL引脚拉高,C/BE命令线上是"配置读"命令;
(2)第五个周期上升沿:被选中的设备将DEVSEL#引脚拉低,并将数据发送到AD线上,将TRDY#拉低;PCI桥准备好接收将IRDY#拉低,FRAME#被拉高,表示这是最后一个数据;
(3)对PCI时序图不清楚的可以参考博客:《pci总线协议学习笔记——PCI总线基本概念》;
6、参考资料:
(1)https://blog.csdn.net/gsjthxy/article/details/125819667;
(2)韦东山驱动大全课程;