01.PCIE简介

PCI-Express(peripheral component interconnect express),简称PCIE,是一种高速串行计算机扩展总线标准,主要用于扩充计算机系统总线数据吞吐量以及提高设备通信速度。

PCIE本质上是一种全双工的的连接总线,传输数据量的大小由通道数lane决定的。一般,1个连接通道lane称为X1,每个通道lane由两对数据线组成,一对发送,一对接收,每对数据线包含两根差分线。即X1只有1个lane,4根数据线,每个时钟每个方向1bit数据传输。依次类推,X2就有2个lane,由8根数据线组成,每个时钟传输2bit。类似的还有X12、X16、X32。

▲图1-1 PCIE总线通道和速率关系

02.PCIE总线架构图

PCIE体系架构一般包含根组件RC(rootcomplex),交换器switch,终端设备EP(endpoint)等类型的PCIE设备组成。RC在总线架构中只有一个,用于处理器和内存子系统与I/O设备之间的连接,而switch的功能通常是以软件形式提供的,它包括两个或更多的逻辑PCI到PCI的连接桥(PCI-PCI Bridge),以保持与现有PCI兼容,具体功能类似现在的网络交换机。

▲图2-1 PCIE总线架构拓扑

当总线上存在多种PCIE设备时,主机host会依照深度优先的算法对全部的设备树上的PCIE设备进行枚举查询,统称PCIE设备枚举。

一般来说,当系统上电后,host会自动查询PCIE设备枚举以获取总线拓扑结构。除一些特殊系统外,普通的系统只会在开机阶段进行设备的扫描,启动成功后,即枚举过程结束后,即使插入一个PCIE设备,系统也不会再去识别它。

在SkyEye仿真平台中,我们使用相对应的接口连接来模拟实际的PCIE设备之间的总线连接,以ft2000为例,PCIE总线连接架构图2-2如下所示。

▲图2-2 ft2000a连接PCIE设备示意图

在SkyEye平台仿真PCIE总线设备时,最少需要拖拽3个模块,以ft2000a为例,需要拖拽ft2000a_pcie和ft2000a_pcie_memory模块作为RC设备;第二是需要拖拽pcie_linker作为总线连接器,主要承担的是PCIE桥或者交换器的功能;最后就需要添加PCIE终端设备,根据实际需要来添加相应的模块,可以存在多个终端设备。

在使用接口连接RC设备和pcie_linker设备时,需要选中两种接口,如下图所示:

▲图2-3 RC连接linker的接口

其中“pcie_bus_intf”主要用来实现PCIE总线的内存映射和读写功能。

同时,RC的设备属性上也需要设置PCIE的EP数量(不包括桥或者交换器),如下图所示:

▲图2-4 RC设备属性设置

使用pcie_linker可以1对多的连接,需要对接口连接中的索引值进行设定,如下图,需要注意的是,索引值的设置需要与上面的“pcie_num”对应,从0开始,一直到“pcie_num” - 1,且最大不超过64.

▲图2-5 linker连接EP设备接口

03.PCIE的BDF

每个PCIE设备在系统总线上都有自己的标识符,这个标识符就是BDF(Bus,Device,Function),PCIE的配置软件(即Root的应用层,一般是PC)应当有能力识别整个PCIE总线系统的拓扑逻辑,以及其中的每一条总线(Bus),每一个设备(Device)和每一项功能(Function)。

在BDF中,Bus Number占用8位,Device Number占用5位,Function Number占用3位。显然,PCIe总线最多支持256个子总线,每个子总线最多支持32个设备,每个设备最多支持8个功能,如下图所示:

▲图3-1 BDF空间分配

需要注意的是,每Bus0总是分配给RC,且每个设备必须要有功能0(Fun0),其他的7个功能(Fun1~Fun7)都是可选的。

SkyEye仿真实现PCIE设备的BAR地址设置则是在PCIE设备建模时对其配置信息结构体中对BDF进行配置。

▲图3-2 SkyEye仿真配置BDF

04.PCIE的配置空间

PCIE有三个相互独立的物理地址空间:设备存储器地址空间、I/O地址空间和配置空间。配置空间是PCIE所特有的一个物理空间。由于PCIE支持设备即插即用,所以PCIE设备不占用固定的内存地址空间或I/O地址空间,而是通过配置空间来实现地址映射的。

系统加电时,BIOS检测PCIE总线,确定所有连接在PCIE总线上的设备以及它们的配置要求,并进行系统配置。所以,所有的PCIE设备必须实现配置空间,从而能够实现参数的自动配置,实现真正的即插即用。

PCI总线规范定义的配置空间总长度为256个字节,配置信息按一定的顺序和大小依次存放。前64个字节的配置空间称为配置头,一般有两种,Type0和Type1,分别对应桥设备和终端设备。配置头的主要功能是用来识别设备、定义主机访问PCI卡的方式(I/O访问或者存储器访问,还有中断信息),Type0如图4-1所示,Type1如图4-2所示。

▲图4-1 终端设备Type0配置头

▲图4-2 桥设备Type1配置头

其中,配置头中的重要寄存器意义如下:

Vendor ID:厂商ID。知名的设备厂商的ID。FFFFh是一个非法厂商ID,可它来判断PCI设备是否存在。

Device ID:设备ID。某厂商生产的设备的ID。操作系统就是凭着 Vendor ID和Device ID 找到对应驱动程序的。

Class Code:类代码。共三字节,分别是类代码、子类代码、编程接口。类代码不仅用于区分设备类型,还是编程接口的规范,这就是为什么会有通用驱动程序。

IRQ Line:IRQ编号。PC机以前是靠两片8259芯片来管理16个硬件中断。现在为了支持对称多处理器,有了APIC(高级可编程中断控制器),它支持管理24个中断。

IRQ Pin:中断引脚。PCI有4个中断引脚,该寄存器表明该设备连接的是哪个引脚。

Status:设备状态字,具体每个BIT的意义见下图4-3

Command:设备状态字,具体含义见图4-4

Base Address Registers:决定PCI/PCIE设备空间映射到系统空间具体位置的寄存器,映射方式有两种,分别是IO和Memory映射,具体解析见图4-5​

▲图4-3 status解析图

▲command解析图

▲图4-5 BAR解析图

所有的PCIE终端设备在系统初始化后会在得到对应的配置空间信息,在SkyEye平台仿真也是如此。其中具体的配置信息需要手动设置,参考下图4-6。

一般需要配置的主要有设备对象指针obj,BDF,vendor_id和device_id,以及内存映射地址BAR和其映射长度,可以按照需要配置多个BAR空间。其余一些配置寄存器也可以手动设置,遵循Type0的配置空间格式,具体的配置空间信息可参考:

《skyeye_dev_bus_intf.h》

需要注意地是,在设置配置空间信息的时候,必须在new阶段,这主要是由skyeye平台初始化顺序决定的。

▲图4-6 PCIE终端设备初始化配置空间

除去上面提到的64B空间外的其余的192个字节称为本地配置空间,主要定义卡上局部总线的特性、本地空间基地址及范围等。而PCIE总线则继承了PCI总线的前256字节外,即0x00~0xFF,还额外扩充到了4K的配置空间,即0x00~0xFFF,其扩展形式是通过一种称为Capability的寄存器块来完成的,下图是具体的布局。

▲图4-6 PCIE配置空间扩展结构图

在原来的配置空间中,有一个寄存器指定了第一个Capability的位置,而第一个Capability又指定下一个Capability,构成了一串Capability,具体如下图所示,由于Capability的作用各不相同,且目前SkyEye关于此功能设置还未完善,这里不再赘述。

▲图4-7 Capability寄存器关系图

05.PCIE的建模仿真

5.1注册接口

对PCIE终端设备进行建模,设备需要注册两个接口,分别是memory_space和pcie_config_intf,其中pcie_config_intf接口声明在文件《skyeye_dev_bus_intf.h》中,主要用来传送其配置信息,如下所示:

▲图5-1 PCIE终端设备接口注册

注册接口实现后,需要对配置空间信息进行设置,具体操作参考第四节的内容。

5.2 BAR内存空间读写

在上一节设置完BAR的地址信息后,就需要实现不同的BAR地址映射功能,而我们主要通过memory_space接口实现,参考如下结构,读写同理。

▲图5-2 PCIE终端设备BAR地址映射接口

需要注意的是,PCIE终端设备中的memory_space接口中的第二个参数addr代表实际的映射地址,与以往的代表地址偏移不同。

带你了解PCIE通信原理相关推荐

  1. 带冲突检测的载波监听多路访问的原理_通信原理课程总结(二)

    在上一篇文章中,我把通信原理中的基础知识已经总结完毕,以后的内容就是利用前边的基础知识来进行更深层次的学习了,引出了通信原理中非常重要的一部分--调制与解调. 首先调制之所以重要,是因为: 调制可以把 ...

  2. 通信原理(5)—— 数字带通传输系统(ASK/FSK/PSK/DPSK)

    通信原理(5)-- 数字带通传输系统(ASK/FSK/PSK/DPSK) 数字带通--数字载波.数字频带.数字调制 数字调制方法--模拟调制法.数字键控法(振幅键控ASK.频移键控FSK.相移键控PS ...

  3. 【通信原理课程设计】基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真

    基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真 目录 基于MATLAB/Simulink的2ASK数字带通传输系统建模与仿真 课程设计要求 方法选择 设计步骤 结果显示与性能分 ...

  4. HwBinder驱动篇-Android10.0 HwBinder通信原理(十)

    摘要:本节主要来讲解Android10.0 HwBinder驱动的流程 阅读本文大约需要花费24分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设 ...

  5. Android10.0 Binder通信原理(八)-Framework层分析

    摘要:本节主要来讲解Android10.0 Binder 在Framework的使用分析 阅读本文大约需要花费15分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,An ...

  6. Android10.0 Binder通信原理(五)-Binder驱动分析

    摘要:本节主要来讲解Android10.0 Binder的驱动层分析 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计 ...

  7. Android10.0 Binder通信原理(三)-ServiceManager篇

    摘要:本节主要来讲解Android10.0 Binder中守护进程ServiceManager是如何启动.注册.获取服务 阅读本文大约需要花费35分钟. 文章首发微信公众号:IngresGe 专注于A ...

  8. 通信原理随机信号分析

    通信原理第二章 随机信号分析 一 随机过程 定义 测试n台性能相同的接收机,在同样条件下,不加信号测试其输出噪声,波形如图 (1)每一条曲线 ξi(t)\xi_i(t)ξi​(t) 都是一个随机起伏的 ...

  9. AT24C0X I2C通信原理

    /*********************************************************************** AT24C0X I2C通信原理* 说明:* 之前接触A ...

最新文章

  1. 机器学习博士自曝:实验室「阉割」我的创造力,劝你别读!
  2. Python Day18
  3. 调试node服务器-过程
  4. OpenCV——释放时错误[SourceReaderCB::~SourceReaderCB terminating async callback]解决方案
  5. VTK:可视化算法之LOxSeeds
  6. 正则表达式从入门到实战
  7. 函数指针与指针函数(C++工厂设计最喜欢用这个)
  8. 色彩管理实验 matlab,色彩管理实验报告1
  9. linux下的C语言编程(总结篇)
  10. Pandas高级操作
  11. Go语言的线程模型-线程阻塞+线程调度
  12. Scratch 3.X中的部分错误汇总
  13. 四阶巴特沃斯低通滤波器设计
  14. 加工中心计算机编程自学,如何快速学习数控加工中心编程
  15. 程序员的读书方法和反思方法!!:我们该如何学习知识?反思总结?
  16. java 跳跃表_你真的了解跳跃表吗
  17. 网络安全之密码安全基础
  18. 22-3-批量对excel文件重命名
  19. win10右键文件夹无反应
  20. linux 强制关闭进程

热门文章

  1. msf win10漏洞_【CVE20200796】漏洞复现
  2. div默认外边距是多少_CSS 外边距
  3. 链接oracle 灾难性故障,打开计划任务的时候出现灾难性故障.
  4. Go语言基础(四)—String与其他基本数据类型的转换
  5. java jtable 单元格编辑_java – 在基于JTable面板的单元格编辑器中...
  6. 选项在哪_心理测试:4种高跟鞋,比较喜欢哪一种?测试出你对物的欣赏面
  7. 中移M5311-NBIOT-OPENCPU开发-HTTP串口收发器
  8. matplotlib 添加偏移量
  9. 特征筛选4——斯皮尔曼相关系数筛选特征(单变量筛选)
  10. 解决关闭hbase时stop-hbase.sh报错stopping hbasecat: /tmp/hbase-xxxx-master.pid: No such file or directory