zhouj's Studio.

CLR CMOS后接上电源主板自动上电分析

2025/09/30
loading

CLR_CMOS 后接上电源:主板不能自动上电的实现

级别:一般|类别:唤醒问题


摘要

客户提出明确需求:执行 CLR_CMOS 后,首次接上 AC 电源不得自动上电。排查发现根因在于 PCH 与 SIO 对 RTC 相关复位信号(RTCRST#/SRTCRST#)的响应范围不同,造成两侧寄存器状态 错位,从而触发“来电即自启”。本文说明成因,并给出改造思路:将 G3 网络唤醒的实现路径从 PCH 调整为 SIO,以保证在 CLR_CMOS 后不会误开机,同时保留 G3 网络唤醒能力。

客户需求

目录

  1. 问题起因
  2. 唤醒原因(根因分析)
  3. 解决方案(实现要点)
  4. 关键寄存器与配置对照
  5. 参考代码片段
  6. 结语

问题起因

(¬_¬) 客户反馈:“**CLR_CMOS ≠ 自动开机!”

(`Д´*)ノ ~┻━┻ “体验优先,严禁来电自启!

  • 需求目标执行 CLR_CMOS 后,首次接通 AC 不能自动上电
  • 现象对比
    • 跳帽 CLR_CMOS → 首次通电会自启
    • 取电池 CLR_CMOS → 首次通电不会自启

提示:两种 CLR_CMOS 的电气行为不同,导致 PCH 与 SIO 的寄存器复位范围不一致,从而出现“来电自启”。

图2主板CMOS电路图 图3RTCRST与SRTCRST 图4主板PCH上的信号 图5主板NCT5585D

唤醒原因(根因分析)

在分析唤醒路径前,先关注几个关键供电与复位信号:

  • VCCRTC(RTC 电池):维持 RTC/CMOS 供电。
  • RTCRST# / SRTCRST#:RTC/CMOS 相关复位信号。
  • PCH 侧寄存器(示例):R_PMC_PWRM_GEN_PMCON_A跳帽 CLR_CMOS 会重置)。
  • SIO(NCT5585D)侧寄存器(示例):LDN A, CR[E4h]需要 VRTC 掉电才复位,即取电池或电池耗尽)。

关键差异

  • 跳帽 CLR_CMOS

    • PCH:AFTERG3_EN(AG3E)等寄存器被复位(回到默认)。
    • SIO:由 VRTC 维持,不会复位(除非取下电池)。
  • 取电池 CLR_CMOS

    • PCH 与 SIO同时归零(SIO 因 VRTC 丢失而复位)。

为什么“来电自启”只发生在跳帽 CLR_CMOS?

以常见的 G3 网络唤醒配置为例:

图12代码 图14网卡电路图
  • 为支持 G3→S0 的网络唤醒,通常会:
    • PCH 端设置 AFTERG3_EN = 1(进入 S5);
    • SIOLDN A, CR[E4h]bit5 = 1,表示 Always turn on(当 S3# 为高时拉低 PSON# 上电)。
图7寄存器 图8SIO寄存器

当处于 G3 状态时,如果 发生跳帽 CLR_CMOS(RTCRST# 下降)

  • PCHAFTERG3_EN 等寄存器被复位(PCH 视角回到 S0/默认)。
  • SIO未复位,其 CR[E4h].bit5 = 1 仍保持 Always on
  • 错位结果PCH → S0SIO → On(保持上电条件)。
  • 用户一接通 AC:SIO 仍按“Always on”逻辑触发 PSON#,于是 来电即自启

取电池 CLR_CMOS 会让 SIO 也复位,因此 不会出现来电自启。


解决方案(实现要点)

思路:将 G3 网络唤醒 的“决策点”从 PCH 转移到 SIO,使两侧在 CLR_CMOS 后不会进入“错位状态”。

图16SIO唤醒pin 图17SIO寄存器

目标

  1. 保留 G3 网络唤醒能力;
  2. 消除 跳帽 CLR_CMOS 后的“来电自启”;
  3. 统一 复位/清除路径,避免 PCH/SIO 状态不一致。

要点

  • 由 SIO 管控 G3 唤醒事件(如使用 GP31 事件线),统一在 SIO 路径产生/清除;
  • PEI 阶段主动 清除 SIO 事件位,防止电池电压波动或上一次状态残留;
  • 仅在需要时开启 SIO 的事件使能;
  • AC Power Loss 行为与 唤醒策略分离:AC 断电恢复策略保持 off(禁止来电自启),网络唤醒由 SIO 事件触发。

关键寄存器与配置对照

侧别 位置/寄存器 用途 CLR_CMOS 复位方式 风险点
PCH R_PMC_PWRM_GEN_PMCON_A / AFTERG3_EN G3 后行为 跳帽可复位 跳帽后回默认,可能与 SIO 不一致
SIO (NCT5585D) LDN A, CR[E4h](bit5=1 表示 Always on) 上电策略/来电自启 VRTC 掉电(取电池)才复位 跳帽不复位,形成错位
SIO (事件) LDN11/12FE/E1/E0 GP31 事件使能/清除 由 BIOS 主动清除 避免事件残留导致误触发

建议:AC Power Loss = Off;网络唤醒仅由 SIO 事件控制,且在 PEI 必要时机进行 清位


参考代码片段

下述片段展示:在 AC Power Loss=off 条件下,通过开关 SIO GP31 事件来管控 G3 网络唤醒;并在 PEI 阶段主动清除可能残留的事件位。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// AC Power Loss = off 条件下的配置
SetPchAfterG3(1); // PCH 侧维持必要的 G3 后设置(但不再用 PCH 直接做 G3 唤醒)

if (gSetupData.G3Wakeup) {
// Enable GP31 Event (SIO 事件由此产生)
SioRegAndThenOr(0xFE, 0x00, 0x20);
} else {
// Disable GP31 Event
SioRegAndThenOr(0xFE, 0x00, 0x00);
}



//PEI阶段清除GP31Event
VOID ClearGp31Event()
{
IoWrite8(SIO_CONFIG_INDEX, 0x87);
IoWrite8(SIO_CONFIG_INDEX, 0x87);
IoWrite8(SIO_CONFIG_INDEX, 0x07);
IoWrite8(SIO_CONFIG_DATA, 0x11); //Select LDN11
IoWrite8(SIO_CONFIG_INDEX, 0xE1);
IoWrite8(SIO_CONFIG_DATA, 0x20); //Clear GP31 Event
IoWrite8(SIO_CONFIG_INDEX, 0x07);
IoWrite8(SIO_CONFIG_DATA, 0x12); //Select LDN12
IoWrite8(SIO_CONFIG_INDEX, 0xE0);
IoWrite8(SIO_CONFIG_DATA, IoRead8(SIO_CONFIG_DATA) & 0xEF); //Clear LD12 0xE0[Bit4]
IoWrite8(SIO_CONFIG_INDEX, 0x07);
IoWrite8(SIO_CONFIG_DATA, 0x0A); //Select LDNA
IoWrite8(SIO_CONFIG_INDEX, 0xFE);
IoWrite8(SIO_CONFIG_DATA, IoRead8(SIO_CONFIG_DATA) | 0x20); //Enable GP31 Event
}

结语

  • “跳帽 CLR_CMOS 会自启、取电池 CLR_CMOS 不会自启” 的本质,是 PCH/SIO 在不同复位方式下的状态错位

  • 通过 将 G3 网络唤醒收拢到 SIO 路径、并在 PEI 阶段 清除事件残留,可既满足 “CLR_CMOS 后不自启” 的体验要求,又保留 G3 网络唤醒 功能;

  • 集成落地时,请根据 项目硬件图/寄存器手册 校对 LDN/位定义,并与 电源时序 联调验证。

CATALOG
  1. 1. CLR_CMOS 后接上电源:主板不能自动上电的实现
    1. 1.1. 摘要
    2. 1.2. 目录
    3. 1.3. 问题起因
    4. 1.4. 唤醒原因(根因分析)
      1. 1.4.1. 关键差异
      2. 1.4.2. 为什么“来电自启”只发生在跳帽 CLR_CMOS?
    5. 1.5. 解决方案(实现要点)
      1. 1.5.1. 目标
      2. 1.5.2. 要点
    6. 1.6. 关键寄存器与配置对照
    7. 1.7. 参考代码片段
    8. 1.8. 结语