RK3399_PCIe芯片手册解读



文章目录

  • RK3399_PCIe芯片手册解读
  • 参考资料:
    • 一、 AXI总线
      • 1.1 连接方式
      • 1.2 五个通道
      • 1.3 信号线
      • 1.4 PCIe控制器
    • 二、 地址空间和寄存器介绍
      • 2.1 想达到的目的
      • 2.2 地址空间
      • 2.3 寄存器介绍
        • 2.3.1 用于配置空间
        • 2.3.2 用于内存和IO
    • 三、 访问示例
      • 3.1 配置空间读写示例
        • 3.1.1 配置Region 0用于读写配置空间
        • 3.1.2 配置Region 0地址转换
        • 3.1.3 CPU读写Region 0的地址
      • 3.2 MEM/IO读写示例
        • 3.2.1 配置Region 1用于内存读写
        • 3.2.2 配置Region 1地址转换
  • 致谢

参考资料:

  • 《PCI Express Technology 3.0》,Mike Jackson, Ravi Budruk; MindShare, Inc.
  • 《PCIe扫盲系列博文》,作者Felix,这是对《PCI Express Technology》的理解与翻译
  • 《PCI EXPRESS体系结构导读 (王齐)》
  • 《PCI Express_ Base Specification Revision 4.0 Version 0.3 ( PDFDrive )》
  • 《NCB-PCI_Express_Base_5.0r1.0-2019-05-22》
  • SOC中AXI总线是如何连接的
  • AXI总线整理总结
  • PCIe中MSI和MSI-X中断机制
  • 开发板资料:
    • 开发板Firefly-rk3399资料

AXI相关:

  • ug1037-vivado-axi-reference-guide.pdf

       ug1037-vivado-axi-reference-guide.pdf
    
  • AXI总线你需要知道的事儿

  • AXI总线整理总结

  • AMBA、AHB、APB、AXI总线介绍及对比

一、 AXI总线

1.1 连接方式

我们一直使用这个图来简化CPU与外设之间的连接:

实际芯片中,CPU与外设之间的连接更加复杂,高速设备之间通过AXI总线连接。AXI总线总传输数据的双方分为Master和Slave,Master发起传输,Slave回应传输。Master和Slave是多对多的关系,它们之间读、写可以同时进行的,内部结构图如下:

1.2 五个通道

在AXI总线中,读写可以同时进行,有5个通道:

  • 读:

    • 读地址通道:传输读操作的地址
    • 读数据通道:传输读到的数据
  • 写:
    • 写地址通道:传输写操作的地址
    • 写数据通道:传输要写的数据
    • 写响应通道:传输写操作的结果

通道名称 通道功能 数据流向
read address 读地址通道 主机->从机
read data 读数据通道(包括数据通道和读响应通道) 从机->主机
write address 写地址通道 主机->从机
write data 写数据通道 主机->从机
write response 写响应通道 从机->主机

1.3 信号线

我们只列出本节视频关心的信号线:

信号 AXI4 AXI4-Lite
AWADDR 写地址通道:地址线,最多可达64位 写地址通道:地址线,最多可达64位
WDATA 写数据通道:数据线,32~1024位 写数据通道:数据线,32位
ARADDR 读地址通道:地址线,最多可达64位 读地址通道:地址线,最多可达64位
RDATA 读数据通道:数据线,32~1024位 写数据通道:数据线,32位

1.4 PCIe控制器

RK3399的PCIe控制器就是挂在AXI总线上,在芯片手册中可以看到:

  • AWADDR:AXI总线的写地址通道地址线,简单理解就是CPU要写PCIe控制器时发出的地址线
  • ARADDR :AXI总线的读地址通道地址线,简单理解就是CPU要读PCIe控制器时发出的地址线

二、 地址空间和寄存器介绍

2.1 想达到的目的

使用PCIe时,我们编程时想达到这个目的:

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

    简单地说,就是把CPU发出的addr,转换为右边的TLP头部:PCI地址、头部的其他信息。

这涉及两部分:

  • 怎么把CPU地址转换为PCI地址
  • 怎么提供TLP头部信息中的其他部分

2.2 地址空间

RK3399访问PCIe控制器时,CPU地址空间可以分为:

  • Client Register Set:地址范围 0xFD000000~0xFD7FFFFF,比如选择PCIe协议的版本(Gen1/Gen2)、电源控制等
  • Core Register Set :地址范围 0xFD800000~0xFDFFFFFF,所谓核心寄存器就是用来进行设置地址映射的寄存器等
  • Region 0:0xF8000000~0xF9FFFFFF , 32MB,用于访问外接的PCIe设备的配置空间
  • Region 1:0xFA000000~0xFA0FFFFF,1MB,用于地址转换
  • Region 2:0xFA100000~0xFA1FFFFF,1MB,用于地址转换
  • ……
  • Region 32:0xFBF00000~0xFBFFFFFF,1MB,用于地址转换

其中Region 0大小为32MB,Region1~31大小分别为1MB。

CPU访问Region 0的地址时,将会导致PCIe控制器发出读写配置空间的TLP。

CPU访问Region 1~32的地址时,将会导致PCIe控制器发出读写内存、IO空间的TLP。

2.3 寄存器介绍

CPU访问一个地址,导致PCIe控制器发出TLP。TLP里含有PCIe地址、其他信息。

这些寄存器必定涉及这2部分:

  • 地址转换:把CPU地址转换为PCIe地址
  • 提供TLP的其他信息

Region0、Region1~32,每个Region都有类似的寄存器。

一个Region,可以用于读写配置空间,可以用于读写内存空间、可以用于读写IO空间,还可以用于读写消息。

这由Region对应的寄存器决定。

每个Region都有一样寄存器,以Region 0为例,有6个寄存器:


CPU访问某个Region时,它是想干嘛?

  • 读写配置空间、发出对应TLP?
  • 读写内存空间、发出对应TLP?
  • 读写IO空间、发出对应TLP?
  • 读写消息、发出对应TLP?

到底是发出哪种TLP,由Region对应的ob_desc0寄存器决定:

ob_desc0[3:0] 作用
1010 发出的TLP用于访问Type 0的配置空间
1011 发出的TLP用于访问Type 1的配置空间
0010 发出的TLP用于读写内存空间
0110 发出的TLP用于读写IO空间
1100 发出的TLP是"Normal Message"
1101 发出的TLP是"Vendor-Defined Message"

CPU访问某个Region时,最终都是要发出TLP,TLP的内容怎么确定?

  • 地址信息:ob_addr0/1把CPU地址转换为PCIe地址,提供TLP里面的地址信息

  • 其他信息:ob_desc0/1/2/3提供TLP的其他信息

2.3.1 用于配置空间

Region0一般用于读写配置空间,它对应的寄存器如下:

2.3.2 用于内存和IO

三、 访问示例

3.1 配置空间读写示例

要读写设备的配置空间,首先要定位:Bus/Dev/Function/Reg:

怎么发出这些"Bus/Dev/Function/Register"信息?如下图所示:


当Region 0的寄存器ob_desc0[3:0]被配置为读写配置空间时, CPU发出Region 0的地址,地址里面隐含有这些信息:

  • Bus:cpu_addr[27:20]
  • Dev:cpu_addr[19:15]
  • Fun:cpu_addr[14:12]
  • Reg:cpu_addr[11:0]

使用过程步骤如下。

3.1.1 配置Region 0用于读写配置空间

3.1.2 配置Region 0地址转换

比如我们可以设置bit[5:0]为27,意味着cpu_addr[27:0]这28条地址线都会传入TLP。

3.1.3 CPU读写Region 0的地址

Region 0的地址范围是:0xF8000000~0xF9FFFFFF。

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

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

3.2 MEM/IO读写示例

3.2.1 配置Region 1用于内存读写

3.2.2 配置Region 1地址转换

addr0、addr1寄存器里保存的是PCIe地址,也就是CPU发出这个Region的CPU地址后,将会转换为某个PCI地址。

怎么转换?由addr0、addr1决定。

Region 1的CPU地址范围是:0xFA000000~0xFA0FFFFF,是1M空间。

我们一般会让PCI地址等于CPU地址,所以这样设置:

  • addr0:

    • [5:0]等于19,表示CPU_ADDR[19:0]共20位地址传入TLP
    • [31:8]等于0xFA0000
  • addr1:设置为0

如上设置后,CPU读写地址时0xFA0???,就会转换为PCI地址:0xFA0???,转换过程如下:

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


致谢

以上笔记源自韦东山老师的视频课程,感谢韦老师,韦老师是嵌入式培训界一股清流,为嵌入式linux开发点起的星星之火,也愿韦老师桃李满园。聚是一团火,散是满天星!

在这样一个速食的时代,坚持做自己,慢下来,潜心琢磨,心怀敬畏,领悟知识,才能向下扎到根,向上捅破天,背着世界往前行!
仅此向嵌入行业里的每一个认真做技术的从业者致敬!



RK3399_PCIe芯片手册解读相关推荐

  1. 【hx717称重传感器采集芯片】双输入通道高精度 24 位模/数(A/D)转换器芯片(附芯片手册)

    一.Hx717芯片简介 以下是官方文档的简介 HX717A/B 采用了海芯科技专利技术,是一款专为高精度电子计量仪表而设计的 24 位 A/D转换器芯片.与同类型其它芯片相比,该芯片集成了包括稳压电源 ...

  2. Zynq7000硬件开发之Xilinx官方技术手册解读(二)

    Zynq7000硬件开发之Xilinx官方技术手册解读(二) 案头语:欢迎有兴趣学习硬件开发,可以跟随本系列文章的更新节奏去学习.实际操作. 本次更新内容主要为如何查找需要的技术手册,器件选型注意事项 ...

  3. MF RC522读卡芯片手册

    MF RC522读卡芯片手册 http://www.docin.com/p-1684819035.html https://wenku.baidu.com/view/2510e4e3590102020 ...

  4. 树莓派IO口驱动代码的编写、微机总线地址、物理地址、虚拟地址、BCM2835芯片手册

    地址总线: 百度百科解释: 地址总线 (Address Bus:又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/ ...

  5. tiny4412(用户手册及芯片手册)

    本人最近刚开始入手tiny4412开发板  因为手中只有板子没有资料 所以这几天一直在网上找相关资料,,发现很少有免费分享原理图及用户手册的  我也是大约找了一天多才有些收获  独独缺了原理图 如果列 ...

  6. FPGA芯片手册阅读技巧

    FPGA的管脚主要包括:用户I/O(User I/O).配置管脚.电源.时钟及特殊应用管脚等.其中有些管脚可有多种用途,所以在设计FPGA电路之前,需要认真的阅读相应FPGA的芯片手册. 下面以ALT ...

  7. 树莓派高阶课程7:树莓派博通BCM2835芯片手册导读

    树莓派博通BCM2835芯片手册导读 驱动的两大利器: 电路图:通过电路图找到寄存器 芯片手册:进行编写 1.树莓派寄存器的介绍: GPFSEL0 GPIO Function Select 0: // ...

  8. 树莓派博通BCM2835芯片手册导读

    驱动两大利器︰电路图(通过电路图找寄存器)和芯片手册. 寄存器 芯片手册第六章P89∶ 字段名 描述 用法 GPFSEL0 GPIO Function select 0,功能选择输出/输入 以引脚9举 ...

  9. 树莓派——8、树莓派博通BCM2835芯片手册导读

    (122条消息) 树莓派高阶课程7:树莓派博通BCM2835芯片手册导读_哒宰的自我修养的博客-CSDN博客 博通BCM2835芯片手册导读 驱动的两大利器: 电路图:通过电路图找到寄存器 芯片手册: ...

最新文章

  1. Java实现图的深度和广度优先遍历算法
  2. ora-12514报错解决方法
  3. 一种提高单片机i/o口驱动能力的方法
  4. 京东智联云分布式低延时RTC系统
  5. 如何在ESXi 5.5主机上安装ESXi 5.5客户机
  6. 超级好用 将html字符串,转化为纯文本
  7. ajax返回的数据怎么显示出来_Excel输入汉字、拼音首字母就能显示数据出来,录数据时逐步提示...
  8. UserWarning: Matplotlib is currently using agg,which is a non-GUI backend, so cannot show the figure
  9. Spring安全依赖查找
  10. GD32创建工程与启动文件选择
  11. java静态代理和动态代理的区别
  12. 微信小程序-获取当前城市位置经纬度,并解析位置信息
  13. 域名检测监控报警系统
  14. SiTime硅晶振MEMS谐振子制作工艺详解
  15. 如何提高产品质量-开发维度
  16. Wifi无法自动连接的问题
  17. 周长为定长的所有平面四边形P中,面积最大的为正方形。
  18. linux进程间的通信实验,linux实验进程之间的通信.doc
  19. Program4Pc Audio Editor v9.1 音频编辑软件中文便携版
  20. PHP递归获取文件夹和文件

热门文章

  1. outlook2010设置msn的邮箱
  2. 问道五周年服务器维护公告,礼包送不停 《问道》五周年普天同庆
  3. 软件测试-App测试流程及测试点
  4. iptv错误代码2003什么意思_IPTV错误代码
  5. 程序设计第十题 数列有序
  6. Nature发文:基础科学创新速度放缓,已经进入「增量时代」
  7. 面向对象嵌入式系统开发4-嵌入式系统分析
  8. 2020浦发极客算法拉力赛_如何评价2020腾讯安全平台部极客技术挑战赛?
  9. Ubuntu12.10中安装电驴下载工具aMule-DLP
  10. GMSL采集板基于NVIDIA Jetson Orin NX Devkit平台