Skip to content

Read-only fan & CPU-temp support for Snapdragon Zenbook A16 (UX3607OA, ARM64)#5448

Open
agentseo wants to merge 1 commit into
seerge:mainfrom
agentseo:feature/ux3607-arm-support
Open

Read-only fan & CPU-temp support for Snapdragon Zenbook A16 (UX3607OA, ARM64)#5448
agentseo wants to merge 1 commit into
seerge:mainfrom
agentseo:feature/ux3607-arm-support

Conversation

@agentseo
Copy link
Copy Markdown

What this adds

Read-only monitoring (fans + CPU temperature) for the ASUS Zenbook A16 UX3607OA — a Snapdragon X2 (ARM64) Copilot+ laptop. On stock g-helper this model shows no CPU temperature and only one mis-decoded fan. All changes are gated behind AppConfig.ContainsModel("UX3607"), so the x86 code path is completely untouched.

This is monitoring only — see "Why no fan control" below.

Changes

app/AsusACPI.csGetFan()

  1. Packed RPM decode. On this firmware CPU_Fan (0x00110013) returns a packed value: a status/mode field in the high word and the speed (hundreds of RPM) in the low word. Real fan readings never exceed 0xFFFF, so values above that are masked to the low word. Gated by magnitude, not model, so it's a no-op on normal hardware.
  2. Second fan tach. This model has a real second fan, but the stock Mid_Fan ID (0x00110031) returns 0 for it. The working tach lives at a non-standard ID 0x00110035. A model-gated field _midFanReadId routes the "Mid" slot to that ID on UX3607 only (Mid_Fan everywhere else).

app/HardwareControl.cs — CPU temperature

  1. WMI thermal-zone fallback. ACPI Temp_CPU (0x00120094) returns 0 on this model (ASUS didn't wire the ATK temp endpoint on this ARM SKU). When the existing temp read is <= 0, fall back to MSAcpi_ThermalZoneTemperature over WMI.
  2. Prefer TZ33 on UX3607. Of the OS-registered thermal zones, the QCOM* zones report static, baked-in values (~41 °C, frozen, never move under load). TZ33 is the only zone that tracks real SoC temperature. Verified by load test: ~34 °C idle → ~43 °C under GPU load → ~48–56 °C under CPU load, cross-checked against HWiNFO. Without this, max-of-zones would pin to the fake QCOM reading. Gated by _preferTZ33 (UX3607 only); other models keep max-of-zones behaviour.

Why no fan control

Fan control is impossible on this firmware: the DEVS fan-write endpoints present on x86 ASUS laptops (DevsCPUFan 0x00110022, DevsCPUFanCurve 0x00110024, FanHysteresis 0x00110034) are absent in this model's firmware (confirmed via the built-in ACPI scan). So this PR deliberately does not attempt any fan write — it only reads.

Scope & safety

  • Every change is behind a model check (ContainsModel("UX3607")) or a value-range check; no behaviour change on any existing device.
  • Read-only; no new ACPI writes.
  • The WMI temp read uses the elevated context g-helper already runs in (scheduled task), so no new privilege requirement in normal use.

Testing

Verified on the actual UX3607OA hardware:

  • Both fans read correct RPM and rise synchronously under load.
  • CPU temperature tracks real load (idle / GPU stress / CPU stress), cross-validated against HWiNFO64.

Notes for the maintainer

This is a niche ARM SKU and I understand if Snapdragon support is out of scope for the project. The change is intentionally small, self-contained and opt-in so it carries near-zero risk for existing users. Happy to adjust the model gate, naming, or split the commits if you'd prefer.

🤖 Generated with Claude Code

- AsusACPI.GetFan: decode packed CPU_Fan value (status in high word,
  RPM/100 in low word); route Mid slot to working tach 0x00110035 on UX3607
- HardwareControl: fall back to MSAcpi_ThermalZoneTemperature when ACPI
  Temp_CPU returns 0; prefer TZ33 (only live zone) on UX3607
- All changes gated behind ContainsModel("UX3607"); x86 path unchanged
- Read-only: firmware lacks DEVS fan-write endpoints, so no fan control

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant