ARM64 Linux PCIe 枚举与硬件 GPIO 时序图分析

news2025/1/12 2:08:44

在嵌入式系统中,PCIe(Peripheral Component Interconnect Express) 总线作为高速数据传输接口被广泛应用于各种设备的连接。随着 ARM64 架构的普及,越来越多的嵌入式系统、开发板和服务器开始采用 ARM64 架构来支持 PCIe 总线。在 Linux 操作系统中,PCIe 设备的枚举和 GPIO 信号的管理是 PCIe 系统正常运行的关键。

本文将深入探讨 ARM64 Linux PCIe 枚举的时序图,并分析 硬件 GPIO 时序图 在该过程中如何发挥作用。

ARM64 Linux PCIe 枚举时序图概览

PCIe 设备的枚举过程是系统启动时的关键环节之一。它涉及从系统上电到设备准备就绪的多个步骤。枚举过程中,Linux 内核通过扫描 PCIe 总线、识别连接的设备、加载驱动程序等步骤,确保设备可以正常工作。

以下是 ARM64 Linux PCIe 枚举过程的时序图 概览:

        +-----------------------------------+
        |            系统上电              |
        +-----------------------------------+
                    |
                    v
        +--------------------------+      +------------------------+
        | PCIe 控制器初始化        |----->| 启动枚举过程            |
        +--------------------------+      +------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        | 设备 PERST# 管脚初始化     | <----> | 启动设备复位            |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        |    PERST# 拉低(复位)      |      | 设备复位完成            |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        |   PCIe 链路初始化         |      | 检查链路状态            |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        |   枚举设备并配置           |      | 设备 BAR 配置           |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        | 检查 WAKE# 是否工作(唤醒)  |----->| 设备进入 L0 状态      |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        | 配置 CLKREQ# 管脚          |      | 时钟请求与链路管理     |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        | 检查 INTx/MSI 中断         |      | 设备驱动加载           |
        +---------------------------+      +--------------------------+
                    |                              |
                    v                              v
        +---------------------------+      +--------------------------+
        | 设备 READY 状态           |----->| 完成设备枚举过程       |
        +---------------------------+      +--------------------------+

时序图详解

  • 系统上电
    • 系统启动并上电,初始化 ARM64 平台的 PCIe 控制器及相关硬件资源,如时钟、复位信号等。
  • PCIe 控制器初始化
    • ARM64 平台通过硬件驱动程序初始化 PCIe 控制器,配置 PCIe 根端口、桥接器等硬件资源,准备进行设备枚举。
  • 设备 PERST# 管脚初始化
    • PERST#(复位管脚)会拉低,硬件将 PCIe 设备复位,确保设备从完全关闭或低功耗状态下启动。该信号由系统主板或 SoC 控制。
  • 设备复位完成
    • 设备在硬件复位后准备好进行配置,接下来会检查链路状态并继续配置 PCIe 设备。
  • PCIe 链路初始化
    • PCIe 链路初始化过程包括链路训练、ASPM(主动状态功率管理)设置、链路带宽配置等,确保 PCIe 链路稳定并准备数据传输。
  • 设备枚举与配置
    • 在 PCIe 链路初始化后,Linux 内核开始枚举 PCIe 总线上的所有设备,并为每个设备配置相应的 BAR(基地址寄存器),这是设备内存映射的核心。
  • 设备 BAR 配置
    • 配置每个设备的 BAR,以便主机能够访问设备的内存、I/O 区域,设备驱动程序会利用这些信息进行配置。
  • WAKE# 管脚检测
    • 如果设备支持 WAKE# 管脚,系统将检查该管脚的状态,以判断设备是否处于低功耗模式。如果设备处于低功耗状态,主机可以通过此信号唤醒设备。
  • 设备进入 L0 状态
    • 唤醒过程完成后,设备进入 L0 工作状态,准备好进行数据传输和操作。
  • 配置 CLKREQ# 管脚
    • CLKREQ# 管脚用于控制时钟信号的启用。设备可以请求主机停止或恢复时钟,以节省功耗。通过控制此信号,设备可以进入 L1 或 L2 等低功耗模式。
  • 检查 INTx/MSI 中断
    • 设备通过 INTx 或 MSI 中断线通知主机发生了某个事件。系统会监控这些中断信号,以确保及时响应。
  • 设备驱动程序加载与配置
    • 设备驱动程序加载后会配置相关硬件资源,如 DMA、I/O 地址空间等,并使设备进入正常工作状态。
  • 设备 READY 状态
    • 在所有配置完成后,设备进入 READY 状态,表示设备已经初始化完毕,能够响应主机的操作。

硬件 GPIO 时序图分析

ARM64 平台上的 GPIO 信号(如 PERST#、WAKE#、CLKREQ# 和中断管脚)在 PCIe 设备的枚举过程中扮演着重要角色。每个 GPIO 管脚控制着不同的硬件功能,确保设备可以正常启动、进入低功耗模式并响应主机的中断请求。
关键 GPIO 管脚解释:
  • PERST#(复位管脚)
    • 复位管脚用于将 PCIe 设备从完全关闭或低功耗状态下复位。复位过程会拉低 PERST# 信号,使设备进入初始化状态。
  • WAKE#(唤醒管脚)
    • 唤醒管脚用于在设备进入低功耗模式时由主机发起唤醒请求。设备可以通过此信号从低功耗模式中恢复到工作状态。
  • CLKREQ#(时钟请求管脚)
    • 时钟请求管脚用于控制 PCIe 链路的时钟状态。在设备处于低功耗模式时,主机可以通过 CLKREQ# 请求停止时钟信号,以节省功耗。
  • INTx/MSI(中断管脚)
    • 设备通过 INTx 或 MSI 中断管脚通知主机发生的事件。中断信号是设备和主机之间通信的重要方式。

总结

ARM64 Linux PCIe 枚举过程是一个复杂的硬件和软件协同工作的过程。GPIO 管脚(如 PERST#WAKE#CLKREQ#INTx/MSI)在该过程中扮演着至关重要的角色,确保设备能够正常复位、唤醒、进入低功耗模式并通过中断通知主机事件。理解和掌握这些 GPIO 信号的控制时序,对于 ARM64 平台上的 PCIe 系统开发和优化至关重要。
在实践中,开发者需要根据平台的具体硬件设计和 Linux 驱动支持,正确配置和管理这些 GPIO 信号,以确保 PCIe 设备能够稳定高效地工作。

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

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

相关文章

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 &#xff1f;一文详解allure的使用 。_allure测试报告-CSDN博客 例子&#xff1a; import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

【FPGA】时序约束与分析

设计约束 设计约束所处环节&#xff1a; 约束输入 分析实现结果 设计优化 设计约束分类&#xff1a; 物理约束&#xff1a;I/O接口约束&#xff08;例如引脚分配、电平标准设定等物理属性的约束&#xff09;、布局约束、布线约束以及配置约束 时序约束&#xff1a;设计FP…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起&#xff0c;正向定位到当前行的首个字符 b2 从光标位置起&#xff0c;反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

win32汇编环境,窗口程序中对按钮控件常用操作的示例

;运行效果 ;win32汇编环境&#xff0c;窗口程序中对按钮控件常用操作的示例 ;常用的操作&#xff0c;例如创建按钮控件&#xff0c;使其无效&#xff0c;改变文本&#xff0c;得到文本等。 ;将代码复制进radasm软件里&#xff0c;直接就可以编译运行。重点部分加备注。 ;>&g…

继承(7)

大家好&#xff0c;今天我们继续来学习一下继承的知识&#xff0c;这方面需要大家勤动脑才能理解&#xff0c;那么我们来看。 1.9 protected关键字 在类和对象章节中&#xff0c;为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统&#xff0c;通过车身四周安装的超广角像机&#xff0c;经算法合成全景鸟瞰图&#xff0c;通过鸟瞰图&#xff0c;司机非常清楚的看清楚车辆四周情况&#xff0c;大大降低盲区引发的交通事故。 产…

NVIDIA发布GeForce RTX 50 系列,售价549美元起

2025 CES消费电子展&#xff08;1月7日至10日&#xff0c;美国拉斯维加斯&#xff09;正式开幕。北京时间1月7日 (星期二)上午10:30&#xff0c;NVIDIA举办主题演讲&#xff0c;CEO黄仁勋担任主讲。正式发布了全新的RTX 50系列显卡&#xff01;一月下旬上市。同时公布了各版本的…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

基于EasyExcel实现通用版一对一、一对多、多层嵌套结构数据导出并支持自动合并单元格

接口功能 通用 支持一对一数据结构导出 支持一对多数据结构导出 支持多层嵌套数据结构导出 支持单元格自动合并 原文来自&#xff1a;https://blog.csdn.net/qq_40980205/article/details/136564176 新增及修复 基于我自己的使用场景&#xff0c;新增并能修复一下功能&#x…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据&#xff1a;描述事物的符号记录 数据库&#xff08;DB&#xff09;&#xff1a;长期存储在计算机内的、…

网络安全建设方案,信息安全风险评估报告,信息安全检测文档(Word原件完整版)

一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细…

数据分析工作流

数据分析工作流 1.流程 数据产生阶段 业务系统生成数据&#xff1a;在各种业务场景下&#xff0c;如用户在电商平台上进行购物&#xff08;产生订单信息、浏览记录等&#xff09;、在金融系统中进行交易&#xff08;产生交易流水、账户余额变动等&#xff09;或者在企业内部的…

【Go】:图片上添加水印的全面指南——从基础到高级特性

前言 在数字内容日益重要的今天&#xff0c;保护版权和标识来源变得关键。为图片添加水印有助于声明所有权、提升品牌认知度&#xff0c;并防止未经授权的使用。本文将介绍如何用Go语言实现图片水印&#xff0c;包括静态图片和带旋转、倾斜效果的文字水印&#xff0c;帮助您有…

PyQt5 UI混合开发,控件的提升

PromoteLabelTest.py 提升的类 import sys from PyQt5.QtWidgets import QApplication, QWidget,QVBoxLayout,QTextEdit,QPushButton,QHBoxLayout,QFileDialog,QLabelclass PromoteLabel(QLabel):def __init__(self,parent None):super().__init__(parent)self.setText("…

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…

ROS核心概念解析:从Node到Master,再到roslaunch的全面指南

Node 在ROS中&#xff0c;最小的进程单元就是节点&#xff08;node&#xff09;。一个软件包里可以有多个可执行文件&#xff0c;可执行文件在运行之后就成了一个进程(process)&#xff0c;这个进程在ROS中就叫做节点。 从程序角度来说&#xff0c;node就是一个可执行文件&…

深入Android架构(从线程到AIDL)_22 IPC的Proxy-Stub设计模式04

目录 5、 谁来写Proxy及Stub类呢? 如何考虑人的分工 IA接口知识取得的难题 在编程上&#xff0c;有什么技术可以实现这个方法&#xff1f; 范例 5、 谁来写Proxy及Stub类呢? -- 强龙提供AIDL工具&#xff0c;给地头蛇产出Proxy和Stub类 如何考虑人的分工 由框架开发者…

风水算命系统架构与功能分析

系统架构 服务端&#xff1a;Java&#xff08;最低JDK1.8&#xff0c;支持JDK11以及JDK17&#xff09;数据库&#xff1a;MySQL数据库&#xff08;标配5.7版本&#xff0c;支持MySQL8&#xff09;ORM框架&#xff1a;Mybatis&#xff08;集成通用tk-mapper&#xff0c;支持myb…

551 灌溉

常规解法&#xff1a; #include<bits/stdc.h> using namespace std; int n,m,k,t; const int N105; bool a[N][N],b[N][N]; int cnt; //设置滚动数组来存贮当前和下一状态的条件 //处理传播扩散问题非常有效int main() {cin>>n>>m>>t;for(int i1;i&l…

HDFS编程 - 使用HDFS Java API进行文件操作

文章目录 前言一、创建hdfs-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、常用 HDFS Java API1. 简介2. 获取文件系统实例3. 创建目录4. 创建文件4.1 创建文件并写入数据4.2 创建新空白文件 5. 查看文件内容6. 查看目录下的文件或目录信息6.1 查看指定目录下的文…