在嵌入式系统中,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 设备能够稳定高效地工作。