PCIE总线记录

  • 描述
  • PCI分类与速度
  • PCIE连接拓扑与角色
  • PCIE接口定义
  • PCIE数据传输方式与中断
  • 在PCIE中有两种数据传输方式:
  • PCIE中断:
  • PCIE协议栈与工作流程
  • PCIE地址空间分类
  • 实例分析
  • PCIE两种访问方式


描述

PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等功能。PCIe交由PCI-SIG(PCI特殊兴趣组织)认证发布后才改名为“PCI-Express”,简称“PCI-e”。它的主要优势就是数据传输速率高,目前最高的16X 2.0版本可达到10GB/s,而且还有相当大的发展潜力。PCI Express也有多种规格,从PCI Express x1到PCI Express x32,能满足将来一定时间内出现的低速设备和高速设备的需求。PCI-Express最新的接口是PCIe 3.0接口,其比特率为8Gbps,约为上一代产品带宽的两倍,并且包含发射器和接收器均衡、PLL改善以及时钟数据恢复等一系列重要的新功能,用以改善数据传输和数据保护性能。

PCI分类与速度

BIOS PCI总线扫描进度不动 pcie总线_BIOS PCI总线扫描进度不动

PCIE连接拓扑与角色

BIOS PCI总线扫描进度不动 pcie总线_BIOS PCI总线扫描进度不动_02


EP设备:终端设备。

RC设备:根总线设备,总线控制器。

BG设备:桥设备。将pcie总线转换成其他总线的设备,或者反之。类似于网关。

SW设备:连接多个pci终端设备在同一总线域的设备。类似于交换机。

PCIE接口定义

BIOS PCI总线扫描进度不动 pcie总线_ci_03

PRSNT1/2#:热插拔信号引脚
SMCLK+SMDAT:SMBUS信号接口,用于管理pcie设备。
TCK+TDI+TDO+TMS+TRST#:jtag接口,用于调试pcie设备。
WAKE#:唤醒引脚。
PERST#:复位引脚。
CLKREQ#:时钟请求引脚。
REFCLK+/-:差分时钟引脚。
HS O/I p/n (0):差分IO引脚。

Tips:实际使用中可以根据需求删减引脚。

PCIE数据传输方式与中断

在PCIE中有两种数据传输方式:

DMA(Direct Memory Access),直接内存访问,在该模式下,数据传送不是由CPU负责处理,而是由一个特殊的处理器DMA控制器来完成,因此占用极少的CPU资源。
PIO(Programmed Input-Output),可编程输入输出,在该模式下,数据传送由CPU执行I/O端口指令来按照字节或更大的数据单位来处理,占用大量的CPU资源,数据传输速度也大大低于DMA模式。举例老说,在DMA方式下,如果copy文件的同时在播放mp3音乐,则不受丝毫影响;如果在PIO模式下,则会发现音乐声时断时续,这是因为大部分CPU资源被文件传输占用。

PCIE中断:

在PCIE总线中没有中断引脚,所以中断信号通过MSI的方式传输。也就是中断信号与数据信号一起传输。

PCIE协议栈与工作流程

BIOS PCI总线扫描进度不动 pcie总线_BIOS PCI总线扫描进度不动_04

  1. pcie设备上电或者复位,并且电源与pll变稳定后。pcie就会开始尝试建立连接。当链路处于有效状态,终端设备就会告诉总线设备自己已经准备好建立连接了。两者状态同步后,总线设备LTSSM开始检测可用的通道数,并且开始链路训练,用来确认该状态下的链路最佳的通信参数。
  2. 物理层的linkup建立后,数据链路模块开始工作,并且初始化控制流。
  3. 控制流初始化完毕后。数据链路模块发信号给传输层模块,告诉他准备好允许发送/接收TLP流量。

Tips:在正常操作期间,LTSSM和数据链路模块继续管理底层链路完整性。 4、pcie枚举发现新设备。

PCIE地址空间分类

pcie的空间分为io、mem与配置空间。配置空间是每一个PCI设备都要提供的一个寄存器,位于硬件设备中,它的作用是:

  1. 告诉系统本硬件的名称、生产厂商、设备类型、版本、是否支持背靠背传输等信息;
  2. 告诉系统本硬件需要的IO、中断、MEMORY等资源的数量;
  3. 接受系统赋予以上资源的基地址;

EP设备配置空间

BIOS PCI总线扫描进度不动 pcie总线_嵌入式硬件_05

实例分析

BIOS PCI总线扫描进度不动 pcie总线_linux_06

bar中的地址,就是linux kernel map中的物理地址(linux kernel如果是32位,那么虚拟内存大小是一块4G的空间,各个外设比如pci,ddr等通过映射的方式可以将物理地址映射上来)。另外这个bar地址是上电后系统根据实际配置情况与bar信息经过映射的地址,保存在pci设备中的配置信息记录的是设备在pci空间中的地址与长度等信息。

BIOS PCI总线扫描进度不动 pcie总线_嵌入式硬件_07


拿到bar中的地址信息了。我们就等于拿到了pcie设备的寄存器起始地址了。接下来就可以正式编写设备驱动了。

PCIE两种访问方式

BIOS PCI总线扫描进度不动 pcie总线_ci_08

默认情况下,RC outbound的方式访问PCIE设备。如果需要RC inbound,那么需要额外配置。

(参考来源组内大佬的分享文档)