草庐IT

RK3399_PCIe芯片手册解读

Hilbert(*^*) 2025-06-21 原文

RK3399_PCIe芯片手册解读



文章目录


参考资料:

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 信号线

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

信号AXI4AXI4-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. 论文解读OTA: Optimal Transport Assignment for Object Detection - 2

    CSDN优秀解读:https://blog.csdn.net/jiaoyangwm/article/details/1266387752021https://arxiv.org/pdf/2103.14259.pdf关键解读在目标检测中标签分配的最新进展主要寻求为每个GT对象独立定义正/负训练样本。在本文中,我们创新性地从全局的角度重新审视标签分配,并提出将分配程序制定为一个最优传输(OT)问题——优化理论中一个被充分研究的课题。具体来说,我们将每个需求方(锚框)和供应商(GT标签)的单位传输成本定义为他们的分类和回归损失加权之和。在公式化后,找到最好的分配方案即为最小传播成本解决最优传输方案,

  2. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

  3. 绝对详细的 RabbitMQ 实践操作手册(一) - 2

    绝对详细的RabbitMQ实践操作手册,看完本系列就够了。一、什么是MQ?1、MQ的概念2、理解消息队列二、MQ的优势和劣势1、优势和作用2、劣势三、MQ的应用场景四、AMQP五、工作原理一、什么是MQ?1、MQ的概念MQ全称MessageQueue(消息队列),是在消息的传输过程中保存消息的容器。多用于系统之间的异步通信。下面用图来理解异步通信,并阐明与同步通信的区别。同步通信:甲乙两人面对面交流,你一句我一句必须同步进行,两人除此之外不做任何事情异步通信:异步通信相当于通过第三方转述对话,可能有消息的延迟,但不需要二人时刻保持联系,消息传给第三方后,两人可以做其他自己想做的事情,当需要获取

  4. 若依框架解读(微服务版)——2.模块间的调用逻辑(ruoyi-api模块)(OpenFeign)(@innerAuth) - 2

    模块之间的关系我们可以了解到一共有这么多服务,我们先启动这三个服务其中rouyi–api模块是远程调用也就是提取出来的openfeign的接口ruoyi–commom是通用工具模块其他几个都是独立的服务ruoyi-api模块api模块当中有几个提取出来的OpenFeign的接口分别为文件,日志,用户服务我们以RemoteUserService接口为例子:其中contextId="remoteUserService"为bean的名称,value=ServiceNameConstants.SYSTEM_SERVICE为接口的描述,fallbackFactory=RemoteUserFallback

  5. 7nm+跨域计算+极致性价比,这家芯片厂商助攻车企「降本增效」 - 2

    汽车芯片赛道的「卷」,或许超出了所有人的预期。对于单纯TOPS算力的比拼,已经翻篇,如何让车企有的用,用得上,还要用得好,已经是新风向。实际上,在汽车智能化刚刚开始的2018年,彼时类似斑马智行这样的车机系统仅仅是从软件层面改变传统座舱的人机交互体验(从功能机到智能机)。而类似Mobileye这样的ADAS视觉感知系统方案(EyeQ5之前),也仅仅是辅助驾驶的入门级。在高工智能汽车研究院看来,汽车芯片赛道经历了几个发展周期,1.0时代(以2020年上车的高通8155为代表),智能座舱进入硬件变革节点;2.0时代(以2021年上车的英伟达Orin为代表),智能驾驶进入硬件变革节点。而3.0时代,

  6. L298n电机驱动模块(芯片)快速入门 - 2

    目录l298n模块详解l298n芯片简介 在嵌入式领域中l298n属于最常用的电机驱动模块,该模块稳定,耐用,操作简单备受广大电子爱好者的喜爱,今天小编结合自己开发的经验来给初学者门聊聊如何使用这款模块及芯片的用法l298n模块详解如图所示,模块左右两侧的2P的端子是接入电机的,左右两端分别可以接入一个直流电机。由于直流电机不分正负所以怎样接都是可以的。中间3P的端子分别接12V,GND,5V。黑色排针部分左右两端的跳帽插上代表使能,l298n有两个通道,所以有两个使能跳帽。中间的四个排针是逻辑输入,左边两个为一组,右边两个为另一组,真值表如下图所示下图附带了l298n模块的原理图,想自己di

  7. javascript - 可以解读这段javascript。有人通过 facebook 发给我,要我复制到我的地址栏——我没有 - 2

    DONOTUSETHIS!javascript:(function(){a='app107489592636080_KxqAxK';b='app107489592636080_bGBstB';gASjYp='app107489592636080_gASjYp';kyFYLC='app107489592636080_kyFYLC';NGqzYj='app107489592636080_NGqzYj';eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};

  8. AI 芯片的简要发展历史 - 2

    随着人工智能领域不断取得突破性进展。作为实现人工智能技术的重要基石,AI芯片拥有巨大的产业价值和战略地位。作为人工智能产业链的关键环节和硬件基础,AI芯片有着极高的技术研发和创新的壁垒。从芯片发展的趋势来看,现在仍处于AI芯片发展的初级阶段。未来将是AI芯片发展的重要阶段,无论是架构还是设计理念都存在着巨大的创新空间。一、芯片的发展历史1956年达特茅斯会议上,科学家约翰·麦卡锡,克劳德·香农和马文·明斯基提出了"人工智能"一词。50年代末,阿瑟·萨缪尔(ArthurSamuel)提出了"机器学习"这个术语,他开发了一个西洋跳棋程序,可以从错误中吸取教训,经过学习后,甚至比编写程序的人棋力更强

  9. RK3588移植-ffmpeg交叉编译 - 2

    文章目录1.下载ffmpeg2.交叉编译3.修改cmakelist.txt4.将lib文件复制到install目录下的lib目录5.测试文件6.运行测试样例7.错误n.测试文件源码1.下载ffmpeggitclonehttps://git.ffmpeg.org/ffmpeg.gitffmpeg2.交叉编译进入下载目录,将ffmpeg编译成arm64平台的版本,编译后的文件存放于./instal_arm64中。sudo./configure--prefix=./instal_arm64--enable-shared--disable-static--enable-cross-compile--a

  10. 共享购深度解析——新玩法解读 - 2

    共享经济模式以合理配置网络资源、减少销售市场交易费用、推动私营经济强势来袭等优点颠覆性创新地严重影响传统商业模式,根据“自由者”的协同,共享经济模式给供需彼此更自由选择和由上而下的制度变革,提高了经济形势高效率,变成近些年更为比较热门的自主创业行业,因此各种各样共享模式集中化暴发,交通出行、货运物流、金融业、文化教育、室内空间、自媒体平台,渗入大家日常生活中的每一个环节,已是踵事增华。 如今网络平台愈来愈多,不过想要做他的私域流量池的公司也越来越多了。许多默默无闻知名品牌凭借自己的欲念总流量已不再被埋没了,那样创造自己的欲念总流量就一定要有自己的商城系统,可能你们会猜疑说:那么多网络平台,谁能

随机推荐