# EC 与 ACPI 热区温度控制说明

## 一、架构概览

```
┌─────────────────────────────────────────────────────────────────┐
│  Windows / WMI                                                   │
│  MSAcpi_ThermalZoneTemperature (你的机器上 WMI 返回"不支持")      │
└────────────────────────────┬────────────────────────────────────┘
                             │ 调用 _TMP
┌────────────────────────────▼────────────────────────────────────┐
│  ACPI 表 (DSDT/SSDT) —— 由 Coreboot 固件生成                     │
│  定义 Thermal Zone、_TMP 方法、_CRT 临界值等                      │
└────────────────────────────┬────────────────────────────────────┘
                             │ EC Operation Region 读温度
┌────────────────────────────▼────────────────────────────────────┐
│  Chrome EC 固件 (Nuvoton NPCx)                                   │
│  读取热敏电阻/热二极管 → 返回温度                                 │
│  ectool temps 0 可读 "Core"（主板热敏电阻，非 CPU 包温）              │
└─────────────────────────────────────────────────────────────────┘
```

---

## 二、各组件职责

| 组件 | 职责 | 当前状态 |
|------|------|----------|
| **Coreboot** | 生成 ACPI 表，定义热区及 _TMP | Chromebook ACPI 可能未为 Windows 暴露完整 thermal zone |
| **EC 固件** | 读传感器、控制风扇、响应主机查询 | 正常，ectool 可读 Core 温度 |
| **Windows ACPI 驱动** | 执行 _TMP，暴露 WMI | WMI 热区查询失败（"不支持"） |
| **Event 86 触发** | ACPI 热区超过 _CRT → 关机 | 热区由 ACPI 定义，但读取路径可能不完整 |

---

## 三、EC 能做什么（当前）

- **读温度**：`ectool temps 0` → Core 传感器（主板热敏电阻，非 CPU 包温）
- **读风扇转速**：`ectool pwmgetfanrpm all`
- **读/设 PWM 占空比**：`ectool pwmgetduty 0`、`ectool pwmsetduty`
- **自动风扇控制**：`ectool autofanctrl on/off`（Windows 下需手动启用）

---

## 四、如何获取 CPU 温度（Chromebox / Windows）

EC 的 Core 传感器是主板热敏电阻，非 CPU 包温。要在 Windows 下读取 CPU 温度，可用以下方式：

### 4.1 LibreHardwareMonitor（推荐，支持脚本）

LibreHardwareMonitor 通过 MSR/驱动读取 Intel CPU 包温，运行后向 WMI 暴露 `root\LibreHardwareMonitor`。

**步骤：**

1. 下载：<https://github.com/LibreHardwareMonitor/LibreHardwareMonitor/releases>  
   或 `winget install LibreHardwareMonitor.LibreHardwareMonitor`
2. 以**管理员**运行 LibreHardwareMonitor.exe（部分传感器需管理员）
3. 保持程序运行（可最小化到托盘）
4. 用 PowerShell 查询 CPU 温度（Intel）：

```powershell
# 查询 CPU 温度传感器（需 LibreHardwareMonitor 正在运行）
Get-CimInstance -Namespace "root\LibreHardwareMonitor" -ClassName Sensor | 
  Where-Object { $_.SensorType -eq 'Temperature' -and $_.Parent -like '/intelcpu/*' } | 
  Select-Object Name, Parent, Value
```

- Intel CPU 的 Parent 一般为 `/intelcpu/0`
- 若无数据，可先 `Get-CimInstance -Namespace "root\LibreHardwareMonitor" -ClassName Sensor` 查看所有传感器及 Parent，再筛选

### 4.2 第三方工具（不用脚本）

| 工具 | 说明 |
|------|------|
| **Core Temp** | 轻量，显示 CPU 包温及各核温度 |
| **HWiNFO** | 全硬件监控，可导出 CSV |
| **Open Hardware Monitor** | LibreHardwareMonitor 的前身，功能类似 |

### 4.3 EC 能否直接读 CPU 温度？

EC 只能读硬件已接好的传感器：热敏电阻、热二极管、或 PECI 等。  
若主板未把 CPU 包温接到 EC，EC 固件无法新增该能力；若有 PECI 等接口但未启用，需改 EC 固件。

Chromebox 的 EC 通常只负责主板热敏电阻（如 Core），CPU 包温一般由 CPU 内部寄存器（MSR）提供，需 LibreHardwareMonitor、Core Temp 等工具通过驱动/MSR 读取。

---

## 五、未来如何用 EC 更好控制温度

### 5.1 固件层面（需改 Coreboot）

要让 Windows WMI 能读到 ACPI 热区温度，需要在 **Coreboot** 中：

1. 在 DSDT/SSDT 里定义 Thermal Zone
2. 实现 _TMP 方法，通过 EC Operation Region 向 Chrome EC 读取温度
3. 确保 ACPI 热区与 Windows WMI 兼容

这是较底层的改动，需重新编译、刷写 Coreboot，风险较高。

---

### 5.2 用户态层面（不改固件）

在现有 EC 能力下，可以做：

| 手段 | 说明 |
|------|------|
| **定期 ectool 监控** | 用 `MonitorThermalZones.ps1` 或 `ectool监控温度风扇.ps1` 持续观察 Core 温度 |
| **开启自动风扇** | 在 Windows 启动后执行 `ectool autofanctrl on`，让 EC 根据内置策略自动调速 |
| **手动 PWM 调扇** | 高负载时用 `ectool pwmsetduty 0 <value>` 提高转速（0–65535 对应 0–100%） |
| **任务计划自动化** | 创建计划任务，登录/开机后自动执行 `autofanctrl on` 和/或监控脚本 |

---

### 5.3 若可改 EC 固件（高级）

若有机会修改 Chrome EC 固件（如 MrChromebox 等方案支持部分机型）：

1. **调整温控策略**：修改 fan_off / fan_max 对应温度阈值
2. **增加传感器暴露**：若有未用 ADC，可接入更多热敏电阻并暴露给主机
3. **更激进的转速曲线**：提前提高转速，降低进入过热关机的概率

---

### 5.4 综合建议（不改固件）

1. **开机后启用自动风扇**  
   - 手动：`ectool autofanctrl on`  
   - 或写一个登录脚本 / 计划任务自动执行

2. **高负载时监控温度**  
   - 运行 `ectool监控温度风扇.ps1` 或 `MonitorThermalZones.ps1`  
   - Core 超过 85°C 时考虑降负载或手动提高风扇

3. **避免 Event 86 过热关机**  
   - ectool Core（主板热敏电阻）可作散热趋势参考  
   - 建议用 LibreHardwareMonitor 等工具监控 CPU 包温，若经常 >90°C 需改善散热

---

## 六、相关脚本

| 脚本 | 用途 |
|------|------|
| `MonitorThermalZones.ps1` | 监控 ACPI 热区 + ectool，WMI 不可用时仍显示 EC Core 温度 |
| `ectool监控温度风扇.ps1` | 持续显示 ectool temps、风扇 RPM、PWM 占空比 |
| `查看系统温度.ps1` | 单次 WMI 热区温度快照 |
| `GetCpuTemp.ps1` | 通过 LibreHardwareMonitor WMI 读取 CPU 包温（需 LibreHardwareMonitor 运行中） |
| `chromeos_collect_sensors.sh` | Chrome OS 下收集 EC/热区/hwmon/dmesg 传感器信息 |
| `linux_collect_sensors.sh` | Linux 下收集热区/hwmon/lm-sensors/ectool/dmesg 传感器信息 |

---

## 七、参考资料

- ACPI Thermal Zone: ACPI Spec 11.3 Thermal Zones
- Chrome EC: Chromium OS EC 文档
- ectool: `ectool命令中文说明.txt`、`ectool在Windows下使用说明.txt`
