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

server/2025/1/12 12:28:13/

在嵌入式系统中,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.ppmy.cn/server/157763.html

相关文章

javascript-----转义单引号转义双引号

在 JavaScript 中&#xff0c;反斜杠&#xff08;\&#xff09;是一个转义字符&#xff0c;用于对特殊字符进行转义。在你提到的 \ 和 \" 中&#xff0c;它们的主要作用如下&#xff1a; \&#xff1a;用于转义单引号。在字符串中&#xff0c;如果你想包含一个单引号字符而…

力扣经典题目之2283. 判断一个数的数字计数是否等于数位的值

今天继续给大家分享一道力扣的做题心得今天这道题目是 题目链接&#xff1a; 2283. 判断一个数的数字计数是否等于数位的值 题目如下&#xff1a; 给你一个下标从 0 开始长度为 n 的字符串 num &#xff0c;它只包含数字。 如果对于 每个 0 < i < n 的下标 i &#…

单片机(MCU)-简单认识

简介&#xff1a; 内部集成了CPU&#xff0c;RAM&#xff0c;ROM&#xff0c;定时器&#xff0c;中断系统&#xff0c;通讯接口等一系列电脑的常用硬件功能。 单片机的任务是信息采集&#xff08;依靠传感器&#xff09;&#xff0c;处理&#xff08;依靠CPU&#xff09;&…

USRP X310 Windows 烧录镜像

说明 USRP-X 系列设备包含两个用于两个以太网通道的 SFP 端口。由于 SFP 端口支持 1 千兆 (SFP) 和 10 千兆 (SFP) 收发器&#xff0c;因此 UHD 附带了多个 FPGA 图像&#xff0c;以确定上述接口的行为。 注意&#xff1a;Aurora 图像需要从 FPGA 源代码手动构建。 FPGA 图像…

关于ReLU激活函数的解释以及其在神经网络中的应用

ReLU&#xff08;Rectified Linear Unit&#xff0c;修正线性单元&#xff09;是一种常用的激活函数&#xff0c;广泛应用于神经网络中&#xff0c;特别是深度学习中。它的定义非常简单且直观。ReLU的公式如下&#xff1a; f(x)max⁡(0,x)f(x) \max(0, x) 这意味着&#xff…

Cocos二维Slider

1、可拖动区域计算 根据UI的世界坐标了宽高信息计算出handle的坐标范围 this.posMin new Vec2(this.node.worldPosition.x - this.uiSelf.contentSize.width * 0.5, this.node.worldPosition.y - this.uiSelf.contentSize.height * 0.5); this.posMax new Vec2(this.node.w…

TrustRAG:增强RAG系统鲁棒性与可信度的创新框架

在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;LLMs&#xff09;凭借其强大的语言处理能力在诸多领域大放异彩。检索增强生成&#xff08;RAG&#xff09;系统&#xff08;面向企业RAG&#xff08;Retrieval Augmented Generation&#xff09;系统的多维检索框架…

HBuilderX打包ios保姆式教程

1、登录苹果开发者后台并登录已认证开发者账号ID Sign In - Apple 2、创建标识符&#xff08;App ID&#xff09;、证书&#xff0c;描述文件 3、首先创建标识符&#xff0c;用于新建App应用 3-1、App的话直接选择第一个App IDs&#xff0c;点击右上角继续 3-2、选择App&#x…