PCIE总线协议

1、pcie硬件

  1. pci是并行总线,在高速率下信号稳定性不能得到保证
  2. pcie是串行总线,差分信号传输,Tx+,Tx1,Rx+,Rx-为一条lane
  3. pcie总线是端对端的传输,之间为link

2、pcie总线的层次

  1. pcie是串行总线,类似以太网总线,pcie总线需要通过数据包来传输。
  2. 事务层,数据链接层,传输层。
  3. .事务层Tansaction Layer,传输的是TLP(tansaction Layer packer)。

3、TLP的主要字段

        Type的5位编码与Fmt字段一起用于规定事务类型、头标长度和是否有数据负载,如下图所示,只列举了一部分常用的类型

PCIE总线协议_第1张图片

        ftm type 来配置是config memory 读写 memory 读写,IO读写

4、pcie设备的配置过程

1.pcie设备config0,config1两种配置空间,Header Type来表示是桥设备(01)、还是一般的end point(00)。

桥设备:上一级总线号,本级总线号,下级最大的总线号

  • Pirmary Bus Number:上游总线号
  • Secondary Bus Number:自己的总线号
  • Subordinate Bus Number:下游总线号的最大数值 EP

需要的地址空间的size, 深度优先

  1. Read Config读配置空间,外设需要申请多大的地址空间
  2. alloc addr分配出一段空间(pci_addrA~100)
  3. 把分配出来的pci_addrA 写入config配置空间
  4. cpu就可以读某个cpu_addr来访问外设

5、pcie region转换 目的

  • CPU读写某个地址,就可以读写某个PCIe设备的配置空间
  • CPU读写某个地址,就可以读写某个PCIe设备的内存、寄存器

地址空间--分成两部分

  • CPU本身pcie控制器的配置寄存器
  • 后面的部分,就是用来访问pcie外设的

CPU想访问这个设备:Bus=bus,Dev=dev,Fun=fun,Reg=reg,那么CPU读写这个地址即可

0xF8000000 + (bus<<20) | (dev<<15) | (fun<<12) | (reg)

cpu再读写这个地址,这个地址在这些寄存器控制下构建出对应的TLP包

pci_addr = cpu_addr[19:0] | (addr0[31:20] << 20) | (addr1<<32)
         = 0x????? + (0xFA0 << 20) | (0 << 32) 
         = 0xFA0????? 

你可能感兴趣的:(总线外设驱动,嵌入式硬件)