硬件开发——PCIE

硬件开发——PCIE

小狼@http://blog.csdn.net/xiaolangyangyang


一、引脚定义

  • SMBUS:10kHz~100KHz,用于传输PCIe卡信息(如智能电源管理)
  • JTAG:
  • 设插拔:PRSNT1#和PRSNT2#用于PCIe热插拔,在PCIe卡上,PRSNT1#和PRSNT2#短接,而在处理器主板中,PRSNT1#信号接地,PRSNT2#信号通过上拉电阻拉高,PCIe卡插入时,处理器端的PRSNT2#被接地,拔出时,PRSNT2#被电阻上拉。如下图所示:

二、配置空间及枚举过程

  • 配置空间穷举
  • BAR寄存器初始化

        向BAR寄存器写入0xFFFF_FFFF,如果读出是0xFFF0_0000,BAR的[19:0]写不进数据,说明BAR需要的Size是1M,此时:
        BAR初始化为0x0000_0000,则占用PCIe域0x0000_0000~0x000F_FFFF的1M空间;
        BAR初始化为0x0010_0000,则占用PCIe域0x0010_0000~0x001F_FFFF的1M空间;
        可见初始化的BAR地址要与BAR Size整数倍对齐

  • 地址映射

        使用inbound/outbound

  • 数据传输

        RC和EP访问映射过后的CPU域地址即可,访问指令会被PCIe IP转换成TLP包在PCI域进行传输,TLP传输时的地址是PCI域的地址,在RC端和EP端都会进行地址映射。

三、协议(TLP包传输)

四、问题总结

1、inbound、outbound和BAR写入的地址是什么
        DSP作为RC,FPGA作为EP,DSP的0x60000000~0x6FFFFFFF(256M)地址用来做PCIe地址映射,
        OB_SIZE=1M时:将0x60000000~0x61FFFFFF分成32个region,每个region1M;
        OB_SIZE=2M时:将0x60000000~0x63FFFFFF分成32个region,每个region2M;
        OB_SIZE=4M时:将0x60000000~0x67FFFFFF分成32个region,每个region4M;
        OB_SIZE=8M时:将0x60000000~0x6FFFFFFF分成32个region,每个region8M;
        OB_OFFSET_INDEX[n]寄存器写入的是PCIe域地址。
        如:OB_SIZE = 1M,OB_OFFSET_INDEX[0] = 0x7000000,DSP[0x60000000] -> PCIe[0x70000000],长度1M
        如果BAR0写入地址是0x70000000,则DSP[0x60000000]映射到BAR0,长度1M
        OB_SIZE = 1M,OB_OFFSET_INDEX[1] = 0x7000000,DSP[0x60100000] -> PCIe[0x70000000],长度1M
        如果BAR0写入地址是0x70000000,则DSP[0x60100000]映射到BAR0,长度1M
        inbound、outbound及BAR写入的都是PCIe域地址

2、inbound、outbound寄存器是在什么时候进行配置的

        inbound、outbound寄存器都是在驱动里进行MEM映射时进行配置

3、中断和DMA

        大部分DMA位于PCIe板卡,BAR空间有DMA寄存器映射,可在上位机驱动内使用板卡的DMA,DMA使用的PCIe域地址,使用上位机MEM地址时需要先映射到PCIe域地址。

4、xilinx PCIe IP(RC、EP)使用

5、BAR空间是怎么初始化的(假设BAR空间为1M,0x100000)?

        向BAR寄存器写入0xFFFFFFF,读回的值取反加1即为BAR空间长度;
        1、写入0xFFFFFFF,即向BAR写入的地址是0xFFFFFFF;
        2、但这个地址是无效的,实际能设置的最大地址是0xFFF00000;
        3、0xFFF00000就是BAR寄存器能设置的最大地址,所以0x100000为BAR长度。

6、BAR的地址是从哪里分配的,分配原则是什么,mem映射的地址分配原则是什么?

7、任务

        1、编译lspci,了解其使用;
        2、xilinx高速采集卡系列文章;
        3、配置Xilinx PCIe IP EP(包括中断、DMA);
        4、Xilinx PS端PCIe模块寄存器;
        5、查看Linux内核中的枚举代码;
        6、写一个Nvme盘读写驱动。

8、lspci命令

        40000000-400003ff : 0000:00:1f.1
        a)40000000-400003ff:地址范围
        b)0000(16bit):域
        c)00(8bit):总线编号
        d)1F(5bit):设备号
        e)1(3bit):功能号

9、IMX6的PCIe

  1. 配置空间:使用ECAM机制
  2. 地址映射

  • 首先指定region和direction,后面的control、base、limit、target寄存器就属于指定的region和direction
  • outbound region范围(CX_ATU_NUM_OUTBOUND_REGIONS):4
  • inbound region范围(CX_ATU_NUM_INBOUND_REGIONS):4,1
  • 最小映射size(CX_ATU_MIN_REGION_SIZE):64KB

PCIE Inbound Outbound 地址配置,DMA传输
pcie inbound和outbound关系
教程:FPGA PCIE调试及DSP代码的讲解
【干货】从CPU角度理解PCIe续集
PCIe学习(二):PCIe DMA关键模块分析之一
dma与pcie
PCIe网卡驱动实现分析(一)--- PCIe基础知识
NVMe驱动解析-关键的BAR空间
PCIE 之RC与EP之间数据传输
PCI设备BAR空间的初始化
米联客ZYNQ——Linux系统移植教程之脚本文件解读
PCIE配置空间设置
lspci
linux lspci命令详解(linux查看硬件配置命令)
lspci命令整理
Xilinx ZYNQ Ultrascale+ 性能测试之 PL/PS PCIe Root Port NVMe

PCIe总线-简介(一)
PCIe总线-存储器域和PCIe总线域访问流程分析(二)
PCIe总线-配置空间介绍(三)
PCIe总线-MPS MRRS RCB参数介绍(四)
PCIe总线-事物层之TLP通用格式介绍(五)
PCIe总线-事物层之TLP请求和完成报文格式介绍(六)
PCIe总线-事物层之TLP路由介绍(七)
PCIe总线-RK3588 PCIe子系统简介(八)
PCIe总线-RK3588 PCIe驱动设备树介绍(九)
PCIe总线-RK3588 PCIe平台驱动分析(十)

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值