2:PCIe Header配置空间

news2024/9/24 13:19:41

目录

1.概述     

 2.Header Type0

2.1 HeaderType字段

2.2 Class寄存器

2.3 Cache Line Size 寄存器

2.4 Subsystem ID 和 Subsystem Vendor ID 寄存器

2.5 Capabilities Pointer 寄存器

2.6 Interrupt Line 寄存器

2.7 Interrupt Pin 寄存器

2.8 Base Address Register 0~5寄存器

2.9 Command 寄存器

2.10 Status 寄存器

2.11 Latency Timer 寄存器

3.Header Type1

3.1 Secondary Status 寄存器

3.2 Secondary Latency Timer 寄存器

3.3 I/O Limit 和 I/O Base 寄存器

3.4 Memory Limit 和 Memory Base 寄存器

3.5 Prefetchable Memory Limit 和 Prefetchable Memory Base 寄存器

3.6 I/O Base Upper 16 Bits and I/O Limit Upper 16寄存器

3.7 Bridge Control Register


1.概述     

        每个PCIE设备都有自己的独立的一段配置空间,该部分空间是这个设备的,系统会给这个设备分配一段内存空间,CPU访问这段内存空间即访问对此设备的配置空间。设备在出厂时,配置空间是有默认初始值的。

        PCIe配置空间两种类型的Header Type(Type0和Type1),Type0和Type1,这是因为PCIe设备分为Bridge和Agent两种类型,Agent的配置空间类型称为Type 0类型,Bridge的配置空间类型称为Type1类型。

        PCIe软件在枚举时会依次读取每台设备中功能0的厂商ID,当返回一个不为全F的值时表明设备存在,然后读取头(Header)寄存器中的头类型(Head Type)字段,确定是桥或端点设备或其它类型,以及单功能/多功能设备。

 2.Header Type0

  • DeviceID+VendorID:芯片厂商固化在芯片内部,只读,比如我们的产品
  1. PCIe转PCI总线的桥片:0xabcd16c3;
  2. WIFI Master chip:0x790614c3;
  3. WIFI Slave chip:0x790a14c3。
  • Revision ID 和 Class Code 寄存器

这两个寄存器只读。其中 Revision ID 寄存器记载 PCI 设备的版本号。该寄存器可以被 认为是 Device ID 寄存器的扩展。

2.1 HeaderType字段

  • 通过此字段可以判断Device是Bridge设备还是Agent设备。

         第7位为1表示当前 PCI 设备是多功能设备,为0表示为单功能设备。

        第6~0位表示当前配置空间的类型,为0表示该设备使用 PCI Agent 设备的配置空间,普 通 PCI 设备都使用这种配置头;为1表示使用 PCI 桥的配置空间,PCI 桥使用这种配置 头;为2表示使用 Cardbus 桥片的配置空间,Card Bus 桥片在这里暂时不介绍。

2.2 Class寄存器

        这个寄存器属于PCI兼容寄存器,要求强制实现。如下图,它是个24bits的只读存储器, 分为3个区域:基类、子类和编程接口。用于确定该功能的基本功能和功能更为明确的 子类,以及在某些情况下的寄存器专用编程接口。

        高字节用于定义该功能的基类;

        中间字节用于定义基类中的子类;

        低字节用于定义编程接口。

 下表列出了当前新定义的基类代码:

         当操作系统试图与类驱动程序一起工作的功能时,类代码寄存器很有用。操作系统能找 出一个具有基类代码和子类代码的功能,驱动程序就能与该功能一起工作。类驱动程序 比制造商提供的仅与某个特定功能一起工作的驱动程序更具灵活性。编程接口字节:为准确识别寄存器组的布局提供了最终的尺度。

2.3 Cache Line Size 寄存器

        该寄存器记录CPU使用的 Cache 行长度。在 PCI 总线中和 Cache 相关的总线事务,如 存储器写并无效和 Cache 多行读等总线事务需要使用这个寄存器。值得注意的是,该寄 存器由系统软件设置,但是在 PCI 设备的运行过程中,只有其硬件逻辑才会使用该寄存 器,比如 PCI 设备的硬件逻辑需要得知处理器系统 Cache 行的大小,才能进行存储器写 并无效总线事务,单行读和多行读总线事务。

如果 PCI 设备不支持与 Cache 相关的总线事务,系统软件可以不设置该寄存器,此时该 寄存器为初始值0x00。对于 PCIe 设备,该寄存器的值无意义,因为 PCIe 设备在进行数 据传送时,在其报文中含有一次数据传送的大小,PCIe 总线控制器可以使用这个“大小”, 判断数据区域与 Cache 行的对应关系。

2.4 Subsystem ID 和 Subsystem Vendor ID 寄存器

        这两个寄存器和Device ID和Vendor ID类似,也是记录PCI设备的生产厂商和设备名 称。 但是这两个寄存器和Device ID与Vendor ID 寄存器略有不同。例如Xilinx公司在 FGPA 中集成了一个PCIe总线接口的 IP 核,即 LogiCORE。用户可以使用LogiCORE 设 计各种各样基于PCIe 总线的设备,但是这些设备的 Device ID 都是0x10EE,而Vendor ID 为0x0007[3]。这里即可使用Subsystem ID和Subsystem Vendor ID 寄存器来区分这 些 设备。

2.5 Capabilities Pointer 寄存器

        在 PCI 设备中,该寄存器是可选的,但是在 PCI-X 和 PCIe 设备中必须支持这个寄存 器,Capabilities Pointer 寄存器存放 Capabilities 寄存器组的基地址,PCI 设备使用 Capabilities 寄存器组存放一些与 PCI 设备相关的扩展配置信息。

2.6 Interrupt Line 寄存器

        这个寄存器是系统软件对PCI设备进行配置时写入的,该寄存器记录当前PCI 设备使 用的中断向量号,设备驱动程序可以通过这个寄存器,判断当前 PCI 设备使用处理器系 统中的哪个中断向量号,并将驱动程序的中断服务例程注册到操作系统中。

2.7 Interrupt Pin 寄存器

        这个寄存器保存 PCI 设备使用的中断引脚,PCI 总线提供了四个中断引脚 INTA#、 INTB#、INTC#和 INTD#。Interrupt Pin 寄存器为1时表示使用 INTA#引脚向中断控制器 提交中断请求,为2表示使用 INTB#,为3表示使用 INTC#,为4表示使用 INTD#。

        如果 PCI 设备只有一个子设备时,该设备只能使用 INTA#;如果有多个子设备时,可以使 用 INTB~D#信号。如果 PCI 设备不使用这些中断引脚,向处理器提交中断请求时,该寄存 器的值必须为0。

2.8 Base Address Register 0~5寄存器

        该组寄存器简称为 BAR 寄存器,BAR 寄存器保存 PCI 设备使用的地址空间的基地址, 该基地址保存的是该设备在PCI总线域中的地址。其中每一个设备最多可以有6个基 址空间,但多数设备不会使用这么多组地址空间。

        在 PCI 设备复位之后,该寄存器将存放 PCI 设备需要使用的基址空间大小,这段空间是 I/O 空间还是存储器空间,如果是存储器空间该空间是否可预取。

        获得 PCI 设备使用的 BAR 空间的长度,其方法是向 BAR 寄存器写入0xFFFF-FFFF,之后 再读取该寄存器。

        处理器访问 PCI 设备的 BAR 空间时,需要使用 BAR 寄存器提供的基地址。值得注意的 是,处理器使用存储器域的地址,而 BAR 寄存器存放 PCI 总线域的地址。因此处理器系 统并不能直接使用“BAR 寄存器+偏移”的方式访问 PCI 设备的寄存器空间,而需要将 PCI 总线域的地址转换为存储器域的地址。

        在 Linux 系统中,ioremap 函数的输入参数为存储器域的物理地址,而不能 使用 PCI 总 线域的物理地址。

        而在 pci_dev->resource[bar].start 参数中保存的地址已经经过 PCI 总线域到存储器域 的地址转换,因此在编写 Linux 系统的设备驱动程序时,需要使用 pci_dev->resource[bar].start 参数中的物理地址,然后再经过 ioremap 函数将物理地址 转换为“存储器域”的虚拟地址。

WIFI chip 7906 BAR空间:

2.9 Command 寄存器

        该寄存器为 PCI 设备的命令寄存器,该寄存器在初始化时,其值为0,此时这个 PCI 设备 除了能够接收配置请求总线事务之外,不能接收任何存储器或者 I/O 请求。系统软件需 要合理设置该寄存器之后,才能访问该设备的存储器或者 I/O 空间。在 Linux 系统中, 设备驱动程序调用 pci_enable_device 函数,使能该寄存器的 I/O 和 Memory Space 位 之后,才能访问该设备的存储器或者 I/O 地址空间。

2.10 Status 寄存器

        该寄存器的绝大多数位都是只读位,保存 PCI 设备的状态。

2.11 Latency Timer 寄存器

        在 PCI 总线中,多个设备共享同一条总线带宽。该寄存器用来控制 PCI 设备占用 PCI 总线的时间,当 PCI 设备获得总线使用权,并使能 Frame#信号后,Latency Timer 寄存器 将递减,当该寄存器归零后,该设备将使用超时机制停止[6]对当前总线的使用。

        如果当前总线事务为 Memeory Write and Invalidate 时,需要保证对一个完整 Cache行 的操作结束后才能停止当前总线事务。对于多数 PCI 设备而言,该寄存器的值为32或 者64,以保证一次突发传送的基本单位为一个 Cache 行。

        PCIe 设备不需要使用该寄存器,该寄存器的值必须为0。因为 PCIe 总线的仲裁方法与 PCI 总线不同,使用的连接方法也与 PCI 总线不同。

3.Header Type1

  • Subordinate Bus Number、Secondary Bus Number 和 Primary Bus Number 寄存器

  •  Primary Bus Number:代表朝向RC方向的PCI 总线号。
  • Secondary Bus Number:代表下游链路的PCI 总线号。
  • Subordinate Bus Number:代表了下游端口上最高(大)的总线号。当没有接桥的时候,二级总线号和从属总线号是一样的值。

3.1 Secondary Status 寄存器

        该寄存器的含义与 PCI Agent 配置空间的 Status 寄存器的含义相近,PCI 桥的 Secondary Status 寄存器记录 Secondary Bus 的状态,而不是 PCI 桥作为 PCI 设备时使用的状态。

3.2 Secondary Latency Timer 寄存器

        该寄存器的含义与 PCI Agent 配置空间的 Latency Timer 寄存器的含义相近,PCI 桥的Secondary Latency Timer 寄存器管理 Secondary Bus 的超时机制,即 PCI 桥发向下游的总线事务;在 PCI 桥配置空间中还存在一个 Latency Timer 寄存器,该寄存器管理 PCI 桥发向上游的总线事务。

3.3 I/O Limit 和 I/O Base 寄存器

        在 PCI 桥下设备的IO资源基地址和大小。

3.4 Memory Limit 和 Memory Base 寄存器

        在 PCI 桥下设备的mem资源基地址和大小。

3.5 Prefetchable Memory Limit 和 Prefetchable Memory Base 寄存器

        在 PCI 桥管理的 PCI 子树中有许多 PCI 设备,如果这些 PCI 设备支持预读,则需要从PCI 桥的可预读空间中获取地址空间。PCI 桥的这两个寄存器存放这些 PCI 设备使用的,可预取存储器空间的基地址和大小。

        如果 PCI 桥不支持预读,则其下支持预读的 PCI 设备需要从 Memory Base 寄存器为基地址的存储器空间中获取地址空间。如果 PCI 桥支持预读,其下的 PCI 设备需要根据情况,决定使用可预读空间,还是不可预读空间。PCI 总线建议 PCI 设备支持预读,但是支持预读的PCI 设备并不多见。

3.6 I/O Base Upper 16 Bits and I/O Limit Upper 16寄存器

        如果 PCI 桥仅支持16位的 I/O 端口,这组寄存器只读,且其值为0。如果 PCI 桥支持32位 I/O 端口,这组寄存器可以提供 I/O 端口的高16位地址。

3.7 Bridge Control Register

        该寄存器用来管理 PCI 桥的 Secondary Bus,其主要位的描述如下。Secondary Bus Reset 位,第6位,可读写。当该位为1时,将使用下游总线提供的 RST#-信号复位与 PCI 桥的下游总线连接的 PCI 设备。通常情况下与 PCI 桥下游总线连接的PCI 设备,其复位信号需要与 PCI 桥提供的 RST#信号连接,而不能与 HOST 主桥提供的RST#信号连接。Primary Discard Timer 位,第8位,可读写。PCI 桥支持 Delayed 传送方式,当 PCI桥的 Primary 总线上的主设备使用 Delayed 方式进行数据传递时,PCI 桥使用 Retry 周期结束 Primary 总线的 Non-Posted 数据请求,并将这个 Non-Posted 数据请求转换为Delayed 数据请求,之后主设备需要择时重试相同的 Non-Posted 数据请求。当该位为1时,表示在 Primary Bus 上的主设备需要在2 ^10 个时钟周期之内重试这个数据请求,为0 ^15时,表示主设备需要在2 个时钟周期之内重试这个数据请求,否则 PCI 桥将丢弃 Delayed数据请求。

        Secondary Discard Timer 位,第9位,可读写。当该位为1时,表示在 Secondary Bus 上的主设备需要在2 10 个时钟周期之内重试这个数据请求,为0时,表示主设备需要在2^15个时钟周期之内重试这个数据请求,如果主设备在规定的时间内没有进行重试时,PCI桥将丢弃 Delayed 数据请求。具体可参考PCI-to-PCI Bridge Architecture Specification Revision 1.2。

GC1610_AX3000 PCIe Header 拓扑:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/689445.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

el-select如何不显示value,显示value对应的label值

文章目录 select 显示如下发生错误的原因 select 显示如下 el-select在编辑调用的时候一直显示的不是label值,而是本身的value值。尝试了很多种方法,都没有解决。 正常的形式 错误的形式 发生错误的原因 显示不正常,多数是由于得到的数据…

人工智能期末复习(背题家的落幕)

文章目录 一、前言二、选择题(10 X 2)1、补充2、第一梯队⭐⭐⭐3、第二梯队⭐⭐4、第三梯队⭐ 三、判断题(10 X 1)1、错误的2、正确的 四、程序填空题(10 X 3)1、tensorflow搭建模型2、keras模型编译3、Pyt…

AI智慧安监视频融合平台EasyCVR播放HLS流出现报错404是什么原因?

EasyCVR平台支持多协议与多类型设备接入,具体包括国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等,能对外分发RTMP、RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等。平台既具备传统安防视频监控的能力,也能接入AI智能分析的…

【强化学习】什么是“强化学习”

作者主页:爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

MySQL的存储过程

MySQL 一、存储过程的概念存储过程的优点 二、创建简单的存储过程三、存储过程的参数IN 输入参数OUT 输出参数INOUT 输入输出参数 四、删除存储过程五、存储过程的控制语句条件语句循环语句 一、存储过程的概念 存储过程是一组为了完成特定功能的SQL语句。 存储过程再使用过程…

安装rabbitmqctl问题

RabbitMQ Server 311.18 Setup bat start xited with code 1. 主要对应得erlang版本不对(注意 安装过程中一定要对应指定版本,尽量装低一版本,并且erlang选择中间版本) RabbitMQ Erlang Version Requirements — RabbitMQ

adb shell后,getevent退出方法

adb shell后,getevent退出方法 输入 exit 然后回车退出

使用 Debian、Docker 和 Nginx 部署 Web 应用

前言 本文将介绍基于 Debian 的系统上使用 Docker 和 Nginx 进行 Web 应用部署的过程。着重介绍了 Debian、Docker 和 Nginx 的安装和配置。 第 1 步:更新和升级 Debian 系统 通过 SSH 连接到服务器。更新软件包列表:sudo apt update升级已安装的软件…

pointNet训练预测自己的数据集Charles版本(二)

之前博客介绍了如何跑通charles版本的pointNet,这篇介绍下如何来训练和预测自己的数据集,介绍如何在自己的数据集上做点云语义分割,此篇的环境配置和博客中保持一致。点云分类较简单,方法差不多,这边就不特地说明了。 …

RFID智能物料仓库管理系统

文章目录 设计任务及要求一、需求分析1.1 硬件图1.1.1 GEC6818开发板模块介绍1.1.2 低频RFID模块 1.2 软件图 二、概要设计2.1 功能流程图2.1.1 模块层次关系2.1.2 防碰撞2.1.3 步骤流程图 三、详细设计3.1 摄像头模块代码3.2 串口初始化模块代码分析3.3 报警模块代码分析3.4 光…

java项目之房屋租赁系统ssm源码

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的房屋租赁系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 💕💕作者:风歌&#xff…

SDH接口能够用DAT3作为插入侦测引脚

SDH(Secure Digital Host)接口需要 9 个引脚来实现其功能,这些引脚包括: VDD:电源引脚,通常连接到3.3V的电源。 VSS:地引脚,通常连接到系统的地线。 DAT0:数据线0&…

【Linux】在simplescreenrecorder中录制的视频,打开的时候是黑屏,显示不了任何画面

一、问题背景 在simplescreenrecorder中录制的视频,打开的时候是黑屏,显示不了任何画面 当时我以为是软件本身设置有问题,于是乎就到处调。网上有些回答说可能是显卡驱动问题,这个驱动我可不敢随便重装啊,太花时间了…

PSP - AlphaFold2 根据 Species 进行 MSA Pairing 的源码解析

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131399818 AlphaFold2 Multimer 能够预测多肽链之间相互作用的方法,使用 MSA Pairing 的技术。MSA Pairing 是指通过比较 MS…

C# 实现全局鼠标钩子操作以及发送键盘事件

全局钩子定义 using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks;namespace WindowsFormsApp1 {public static class GlobalMousePositi…

【云原生 | 55】Docker三剑客之Docker Swarm简介和安装

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

chatgpt赋能python:Python如何获取激光雷达数据

Python如何获取激光雷达数据 激光雷达数据在机器学习和自动驾驶领域中扮演着重要的角色。Python作为一种功能强大而又易于学习的编程语言,在获取激光雷达数据方面也表现出极高的效率和灵活性。下面我们将介绍如何使用Python获取激光雷达数据。 什么是激光雷达数据…

vue-li问题记录

Starting development server... ERROR ValidationError: webpack Dev Server Invalid Options options should NOT have additional properties options should NOT have additional properties 大概是package.json或者是vue.config.js文件出现类问题,我把这两…

chatgpt赋能python:Python计算BMI-一篇完整的指南

Python 计算BMI - 一篇完整的指南 我们都知道,BMI是身体质量指数的简称,它是以身高和体重计算的一个数值,用来评估一个人的身体状况。在本文中,我们将介绍如何使用Python计算BMI,并提供一些关于BMI的背景知识。 什么…

[Selenium] 通过Java+Selenium查询某个博主的Top100文章质量分

系列文章目录 通过JavaSelenium查询文章质量分 通过JavaSelenium查询某个博主的Top40文章质量分 通过JavaSelenium查询某个博主的Top100文章质量分 文章目录 系列文章目录前言一、环境准备二、查询某个博主的Top100文章2.1、修改pom.xml配置2.2、配置Chrome驱动2.3、引入浏览器…