PCI/PCIE分为桥设备和非桥设备,这节介绍非乔设备的一个访问原理

怎么访问到某个PCI设备?
需要理解PCI本地总线信号。
| 类别 | 信号 |
|---|---|
| 系统引脚 | CLK:给PCI设备提供时钟RST#:用于复位PCI设备 |
| 地址/数据引脚 | AD[31:00]:地址、数据复用C/BE[3:0]:命令或者字节使能PAR:校验引脚 |
| 接口控制 | FRAME#:PCI主设备驱动此信号,表示一个传输开始了、进行中IRDY#:Initiator ready, 传输发起者就绪,一般由PCI主设备驱动此信号TRDY#:Target ready,目标设备驱动,表示它就绪了STOP#:目标设备驱动,表示它想停止当前传输LOCK#:锁定总线,独占总线,有PCI桥驱动此信号IDSEL:Initialization Device Select,配置设备时,用来选中某个PCI设备DEVSEL#:Device Select,PCI设备驱动此信号,表示说:我就是你想访问的设备 |
| 仲裁引脚 | REQ#:申请使用PCI总线GNT#:授予,表示你申请的PCI总线成功了,给你使用 |
| 错误通知引脚 | PERR#:奇偶校验错误SERR#:系统错误 |
| 中断引脚(可选) | INTA#、INTB#、INTC#、INTD# |

CPU发出地址addr_cpuPCI桥把addr_cpu转换为addr_pciPCI总线上所有设备都检测addr_pci地址,发现它属于某个设备的地址,该设备就负责完成此传输PCI设备可以简单地分为PCI Bridge(桥设备)和PCI Agent(非桥设备):
PCI Bridge:桥,用来扩展PCI设备,必定有一个Root Bridge,下面还可以有其他Bridge。PCI Agent:真正的PCI设备(比如网卡),是PCI树的最末端《PCI_SPEV_V3_0》中提到了设备的访问格式,如下图:


IDSEL 拉高选中要访问的设备FRAME#拉低有效的第一个时钟CLK的情况下,在AD总线上写入Address,后面再写入Data,用来设置像访问的哪个地址和哪个寄存器‘C/BE#去配置读/写寄存器操作,比如第一次就要去读设备配置信息,分配内存空间等