1.概述
PCI总线是一种计算机的一种标准总线。其存在的目的就是想让cpu像访问内存一样去访问外设空间。
举个例子,比如访问一个emmc设备,对于emmc本身想要在0x00这个空间地址存东西的时候,对于cpu来说可能不是要操作0x00,因为两个的地址空间不一样,就需要PCI总线,能使cpu操作的时候通过PCI控制器来进行地址空间转换。其特点就是速度很快。
PCI是一种并行总线,由于PCI是并行总线,不同的数据线之间的信号会产生干扰,为了达到更高的速度,就诞生了PCIE这个协议。
1.1 PCI/PCIE的区别
PCI是并行数据,PCEI是串行。
PCIE可以达到更高的数据传输速度。
在硬件上PCIE使用的是差分信号。
2.PCI
2.1 总线与框架
2.1.1框架
大致的框图如上所示:
PCI 桥:当一条PCI总线不够用的时候,可以通过PCI来连接多个PCI总线。如上图可以看到就有两条PCI总线。
PCI 总线:PCI总线在设备中可以是树形结构来扩展开来的。
PCI 设备:分为主设备与目标设备,主设备是访问操作发起着,目标设备是被访问者。
2.1.2 信号相关
介绍几个比较关键的信号:
AD:数据与地址都是走这个信号来传输的。
FRAME:由这个信号来判断,AD到底是传输的地址还是数据。
IDSEL :需要对PCI设备进行配置的时候,用这个信号来选中设备。
C/BE :用来对应命令的类型。
2.2 访问非桥的PCI设备
要想使用PCI设备肯定得先配置某个PCI设备。
参考上述时序图:
(1).IDSEL信号先选中需要配置得设备。
(2). FRAME 拉低时【31:0】存下了一个32bit的物理地址值结构如下,来配置设备配置空间的寄存器。
(3).C/BE信号需要给到对应的值
type0就是指的非桥设备的配置空间,如下图所示。
2.2 访问桥的PCI设备
根桥下可能会挂载非PCI设备,而是挂新的桥设备来扩展更多的PCI设备,如下图。
步骤: (1) 可以用类似上述配置PCI设备的方式来配置桥,参考以下的桥设备的配置空间表。
(2)配置好桥之后,再配置后面的设备,参考下面的协议。
BUS Number:来确定是哪个子桥。
Device Number :来确定是这个子桥的哪个设备。
关于桥之间关系构建的参数:
primary bus number:上一级PCI桥总线号。
Secondary bus number:自己这级的PCI桥总线号。
Suboardinate Bus number :关联的最下级的PCI桥总线号。
3.PCIE
3.1 框图
3.2 传输
传输数据是四根差分信号:TXP(TX+),TXN(TX-),RXP(RX+),RXN(RX-)。一般这样的一组构成一个lane,有些设备可能会有多个line。
由于是串行信号,所以通信就需要通过打包。
一般传输分为三层:
事务层:基本数据的打包,读写数据类型,包含的数据等等。
数据链路层:防止丢包,所以增加SEQ,和CRC校验。
物理层:拆包发送接受。
head的完整格式:
其中有bus number,device number,Function number,register number等等来定位操作目标。