1.简介
PCIe Add-in卡借助PCIe插槽上的辅助信号,实现了很多系统级的功能,比如唤醒、复位、调试、热插拔等功能。具体的辅助信号有REFCLK-/REFCLK+、PERST#、WAKE#、SMBCLK、SMBDAT、JTAG、CLKREQ#及PRSNT1#和PRSNT2#等,具体的作用如下:
- REFCLK-/REFCLK+: 是一组低压差分信号,PCIe主板提供的REFCLK信号必须满足PCIe规范中的要求。
- PERST#: 信号用于复位PCIe设备,同时也指示了系统主电源的稳定时间。
- WAKE#: 信号用于给PCIe主机提供复位信号,由PCIe设备驱动,当PCIe主机接收到该信号后,需要向PCIe设备提供主电源和参考时钟,以激活PCIe链路。WAKE#信号也可以和OBFF机制配合使用,当PCIe主机需要调整设备的缓冲行为(如刷新或填充缓冲区)时,可以通过WAKE#信号通知PCIe设备。这样,设备能够在不需要发送或接收数据时进入更低功耗的状态,并在必要时迅速被唤醒以处理数据。
- CLKREQ#: 信号由PCIe设备驱动,用于向PCIe主机请求参考时钟,以便于PCIe接口发送和接收数据。 当PCIe设备处于L1 PM Substates状态时,CLKREQ#拉高,参考时钟被关闭,此时PCIe链路处于不活跃状态,PCIe主机或者PCIe设备拉低CLKREQ#后,PCIe设备将退出L1 PM Substates状态。
- SMBCLK#: 是SMBus接口的时钟信号。
- SMBDAT#: 是SMBus接口的数据信号。
- JTAG (TRST#, TCLK, TDI, TDO, and TMS) : 这些引脚用于支持IEEE Standard 1149.1规定的测试访问端口和边界扫描架构(JTAG)。对于PCIe设备来说是可选的。
- PRSNT1#和PRSNT2#: 是PCIe卡热插拔探测引脚。
下面主要分析一下REFCLK-/REFCLK+、PERST#、WAKE#信号。
2.REFCLK-/REFCLK+
如下图所示,为了减少抖动和适配未来的制造工艺,参考时钟使用低电压摆幅和差分信号。每个时钟的标称单端摆幅为0V - 0.7V,时钟频率为100MHz ± 300PPM。
参考时钟在系统主板上的每个连接器之间点对点布线,且在系统主板上布线距离不超过15英寸(38.1厘米)。在接收端,数据和时钟的传输延迟误差必须小于12纳秒。参考时钟最大失配和通道最大长度的组合将导致约9-10纳秒的延迟误差。从时钟源到连接器之间,参考时钟REFCLK-和REFCLK+两根信号线的长度误差必须小于0.005英寸(0.0127厘米),并且需要适当地远离其他非时钟信号线,以避免过度串扰。
3.PERST#
PERST#信号用于指示电源是否在其规定的电压容许范围内并且稳定。在电源稳定后,它还会初始化PCIe设备的状态机和其他逻辑。
3.1.ACPI电源状态
PERST#信号动作通常伴随着系统电源变化,因此需要先介绍一下电源状态。ACPI规范定义了一系列的电源状态,以协调操作系统和硬件之间的电源管理。这些状态分为几个不同的类别,包括全局状态(G状态)、系统状态(S状态)、设备状态(D状态)和处理器状态(C状态)。 以下是一些常见的ACPI电源状态的表格概览:
类别 | 状态 | 描述 |
---|---|---|
全局状态 | G0 (S0) | 工作状态,设备全功率运行 |
全局状态 | G1 | 睡眠状态,包含多个子状态:S1、S2、S3、S4 |
全局状态 | G2 / S5 | 关机状态,系统不工作但仍供电 |
全局状态 | G3 | 机械关机,无任何供电 |
系统状态 | S0 | 开机状态,系统完全运行 |
系统状态 | S1 | 睡眠状态:处理器停止执行,较快唤醒 |
系统状态 | S2 | 睡眠状态:处理器关闭,电源较少部分,唤醒较快 |
系统状态 | S3 | 睡眠状态:标准睡眠模式,保存到 RAM |
系统状态 | S4 | 睡眠状态:休眠模式,保存到磁盘 |
系统状态 | S5 | 关机状态,系统关闭,但电源仍然供给到某些部件 |
设备状态 | D0 | 设备完全启动(ON)状态 |
设备状态 | D1, D2 | 部分睡眠状态,供不同程度的电源,可能保持某些上下文 |
设备状态 | D3 | 完全关闭(OFF)状态,但仍然供有待机电源 |
处理器状态 | C0 | 处理器全速运行 |
处理器状态 | C1 | 轻度休眠,处理器停止指令执行,快速恢复 |
处理器状态 | C2 | 较深睡眠,电力优化关闭更多硬件部件,恢复较慢 |
处理器状态 | C3 | 更深睡眠,可能关闭所有处理器缓存,恢复时间更长 |
3.2.Initial Power Up (G3 to S0)
下图描述了PCIe板卡从上电到稳定工作时,辅助信号、电源及PCIe链路的时序图。具体的流程如下(有些时间CEM规范做了明确定义,有些则没有,明确定义的时间本文将会写出具体时间):
- 如果系统和PCIe板卡支持3.3Vaux辅助电源,则需要先给3.3Vaux上电,此时PERST#可以一直保持低或者高。
- 3.3Vaux辅助电源稳定后,PCIe主机拉低PERST#,使PCIe设备处于复位状态。
- 3.3Vaux辅助电源稳定后,延时1,SMbus开始工作。若没有3.3Vaux辅助电源,则从3.3/12V主电源稳定后开始计时。
- 3.3/12V主电源稳定后,延时2(TPVPERL)拉高PERST#,TPVPERL为100毫秒,主电源稳定后参考时钟开始输出,参考时钟稳定需要时间3(TPERST-CLK ),TPERST-CLK为100微秒。因此PERST#拉低的时间至少为TPVPERL + TPERST-CLK = 100.1毫秒。
- 参考时钟稳定后,至少需要时间4,PCIe Link才能正常工作。
- 参考时钟稳定后,至少需要时间5,JTAG才能正常工作。
刚开始上电的时候,Link Control register(配置空间寄存器)的Active State Power Management Control(ASPM Control)位域的硬件状态必须设置为0,后续该位域只能由系统的BIOS或者操作系统更改,其他软件不能更改。
3.3.Power Management States (S0 to S3/S4 to S0)
如果系统要进入S3或者S4状态,则需要在PCIe插槽改变电源状态之前,将PCIe设备设置到D3hot状态,且PCIe链路为L2状态。随后,PCIe插槽的主电源和参考时钟将会关闭,直到被唤醒。由于主电源被切断,PCIe设备的状态将由D3hot转变为D3cold。PCIe设备处于D3cold状态时,3.3Vaux辅助电源还会继续供电。一旦唤醒事件到来,电源管理系统将恢复主电源和参考时钟。最后等到主电源和参考时钟稳定后,拉高PERST#。具体的流程如下:
- 系统在准备进入S3/S4状态之前,需要先使PCIe Link处于不活跃状态,即PCIe Link处于L2状态。
- PCIe Link处于不活跃状态起经过时间1,拉低PERST#,使PCIe设备进入复位状态。
- 拉低PERST#起经过时间2,系统开始切断主电源和参考时钟,主电源和参考时钟处于不稳定状态。
- 拉低PERST#起经过时间3,JTAG需要停止工作,处于不活跃状态。
- 唤醒时间到来,系统开始给主电源上电,然后输出参考时钟,经过时间4,PCIe设备恢复到正常工作状态。
- 系统从S0状态到S3/S4状态,再到S0状态,PERST#拉低的最短时间为5(TPERST),TPERST为100微秒。
PCIe设备从D3cold状态恢复,Link Control register(配置空间寄存器)的Active State Power Management Control(ASPM Control)位域的硬件状态必须设置为0,后续该位域只能由系统的BIOS或者操作系统更改,其他软件不能更改。
3.4.Power Down
如下图所示,考虑到容许误差,为了判断电源是否有效,CEM规范定义了两个阈值范围。3.3V和3.3Vaux电源阈值范围为2.5V-3.00V,12V电源阈值范围为9.7V-11.04V。当系统规定了3.3V、3.3Vaux、12V电源的阈值,如果电源电压低于该值,则说明电源处于不稳定状态,需要系统做下电处理。
PCIe设备掉电时,各个信号的时序图如下图所示。具体的流程如下:
- 在PCIe插槽主电源掉电之前,先要使PCIe Link处于不活跃状态,PCIe设备处于D3hot状态。
- PCIe Link处于不活跃状态起经过时间段1,拉低PERST#,使PCIe设备进入复位状态。
- 拉低PERST起经过时间段2,PCIe插槽控制主电源开始掉电。
- 拉低PERST起经过时间段3,参考时钟停止输出,同时JTAG也停止工作,时间段3大于时间段2。
- 时间段4(TFAIL)表示意外断电的情况下,PERST#拉低需要的时间。TFAIL的最大时间为500纳秒。
4.WAKE#
TODO…
5.电压参数
6.时间参数
参考资料
- PCI Express® Card Electromechanical Specification Revision 4.0