Skip to content

Latest commit

 

History

History
309 lines (231 loc) · 12.4 KB

File metadata and controls

309 lines (231 loc) · 12.4 KB

Acer Aspire fan control — unlocking the hidden Nitro turbo fan mode

TL;DR: The Acer Aspire A515-57 — a non-gaming laptop — ships with the Nitro/Predator gaming fan control fully functional in its firmware. Acer just doesn't expose it in any UI. You can turn the CPU fan to turbo, or pin it to 100%, with two WMI calls and no third-party software.

Verified working on Acer Aspire A515-57, i5-12450H, BIOS V1.33, Windows 11.

license platform language dependencies status


Why this repo exists

Search the web for fan control on an Aspire and you get dead ends. The consistent claim is that fan control is a Nitro/Predator feature.

That claim is wrong, at least for this model.

Why this is hard to find

We went looking before we went measuring. What the obvious searches return:

  • "Acer Aspire A515-57 fan control" → eBay listings for replacement fans, and cooling pads. The hardware, not the software.
  • "NBFC config for Aspire 5" → a string of community threads asking for a config file, going back years, none of them answered. The NBFC issue tracker has requests for various A515 models that were never resolved. There is still no NBFC config for this laptop, and this repo did not need one.
  • "AcerGamingFunction WMI Aspire" → results about Nitro and Predator laptops, plus the reasonable-sounding conclusion that the gaming WMI methods are only on gaming models. That conclusion is what stops people.
  • Acer's own support pages and AcerSense → three performance modes behind Fn+F, with no mention that a turbo fan mode exists underneath.

So the search results actively point away from the answer. They do not say "undocumented"; they say "not available on your machine", which is worse, because it sounds like a settled question.

Two things had to come together:

1. The protocol was never secret — it was just filed somewhere else. The bit layout is sitting in plain #defines inside the Linux kernel driver drivers/platform/x86/acer-wmi.c, reverse-engineered by the Linux community for gaming models. Nobody debugging a throttling Windows laptop thinks to read kernel source for a driver they are not running. That is the whole trick: the answer was in a different discipline's filing cabinet.

2. The part that was genuinely undocumented had to be measured. Nothing anywhere said whether a non-gaming Aspire's firmware would answer those calls. We found out by calling them and reading the result back. It does.

Then the protocol still had to be beaten into working — see the four gotchas below, each of which produced an error message that pointed at the wrong cause.


Does your machine support this?

Before anything else, run this in an elevated PowerShell. It writes nothing.

Get-CimInstance -Namespace root\wmi -ClassName AcerGamingFunction

If you get an instance back (ACPI\PNP0C14\APGe_0 or similar), your firmware exposes the interface and it is worth continuing. If you get Access denied, you are not elevated — the Acer WMI provider refuses even reads. If you get nothing at all, this repo will not help you.

Reports from other models are welcome in the issues, positive or negative.

Only the A515-57 has been tested. Related machines that share the same chassis and fan assembly — the A515-57G, A515-56, A515-54, A515-43, A517-53G, and other Aspire 5 variants — are plausible candidates and completely unverified. If the command above returns an instance on yours, please open an issue saying which model and whether the setters took effect. That is how this list grows.

Quick start

Everything needs an elevated PowerShell — the Acer WMI provider denies even reads without elevation.

One-off, from a terminal

powershell -NoProfile -ExecutionPolicy Bypass -File .\cooler.ps1 status
powershell -NoProfile -ExecutionPolicy Bypass -File .\cooler.ps1 turbo
powershell -NoProfile -ExecutionPolicy Bypass -File .\cooler.ps1 max
powershell -NoProfile -ExecutionPolicy Bypass -File .\cooler.ps1 auto

Tray icon + global hotkey (recommended)

Tray menu showing the three fan modes, with firmware turbo selected Tooltip reading Cooler TURBO (firmware) next to the orange tray icon

The icon colour is the mode, and hovering tells you which one without opening anything. Above: firmware turbo (orange), selected and confirmed against the hardware.

powershell -NoProfile -ExecutionPolicy Bypass -File .\cooler-tray.ps1 -Instalar

Installs a scheduled task that starts a tray icon at logon, already elevated, so you never see a UAC prompt.

Left click toggle on ↔ auto
Ctrl+Alt+F same, from any application
Right click pick mode explicitly
🟢 green on — CPU pinned 100%, GPU channel turbo
🟠 orange firmware turbo mode
⚪ grey automatic (Acer's stock curve)
🔴 red hardware is not in the requested state

The icon does not cache a flag in a file. It polls GetGamingFanBehavior once per second and compares against what you asked for. If the mode drifted, it silently re-applies. If re-applying still doesn't take, it turns red and shows the actual modes in the tooltip. The green light is therefore a claim about the hardware, not about the script's intent.

Be clear about what that one-second loop is doing, though. On our machine the mode can revert on its own after a couple of seconds (see Known issue), so the loop is racing whatever is undoing it. Between a revert and the next re-apply the fan is not in the mode you asked for, for up to a second at a time. That is a duty cycle, not a solid state, and the icon cannot show it at that resolution.

In Automatico the tray writes nothing at all — it only reads. Automatic is the absence of a command, so imposing it every cycle would stomp on anything set from outside, including Acer's own Fn+F hotkey. An earlier version did exactly that, and it silently invalidated several of our own measurements.

-Desinstalar removes the scheduled task.


The protocol

WMI class AcerGamingFunction in namespace root\wmi (instance ACPI\PNP0C14\APGe_0, GUID 7A4DDFE7-5B5D-40B4-8595-4408E0CC7F56).

SetGamingFanBehavior(uint64)

bits meaning
0–15 fan bitmap — CPU = bit 0 (0x1), GPU = bit 3 (0x8)
16–17 CPU fan mode
22–23 GPU fan mode

Modes: 1 = AUTO, 2 = TURBO, 3 = CUSTOM.

GetGamingFanBehavior(uint32) -> uint64

Input is the fan bitmap you're asking about.

bits meaning
0–7 status — 0 means OK
8–9 current CPU fan mode
14–15 current GPU fan mode

SetGamingFanSpeed(uint64)

bits meaning
0–7 fan id
8–15 speed, 0–100

Ready-made values

intent value
CPU + GPU turbo 0x820009
CPU + GPU auto 0x410009
CPU custom 0x30001
CPU fan (id 1) at 100% 0x6401

Four things that cost us a debugging round each

These are the reason this repo is worth more than the bit table above.

1. The setters only work as instance methods. Calling SetGamingFanBehavior statically returns Invalid method parameter(s), which reads like a bad payload and sends you off tuning bits for nothing.

# WRONG — fails with "Invalid method parameter(s)"
Invoke-CimMethod -Namespace root\wmi -ClassName AcerGamingFunction `
                 -MethodName SetGamingFanBehavior -Arguments @{gmInput=[uint64]0x20001}

# RIGHT
$i = Get-CimInstance -Namespace root\wmi -ClassName AcerGamingFunction
Invoke-CimMethod -InputObject $i -MethodName SetGamingFanBehavior `
                 -Arguments @{gmInput=[uint64]0x20001}

The getters tolerate the static form. The setters do not.

2. The getter needs a fan bitmap as input. Passing gmInput = 0 returns status 2 — an error — which is easy to misread as "the machine has no fan control".

3. The CPU fan is id 1, not 0. SetGamingFanSpeed with fan id 0 returns gmOutput = 1 (failure). Id 1 returns 0.

4. Order matters when combining CUSTOM with the GPU channel. 0x30001 has a CPU-only bitmap, so it changes the CPU and leaves the GPU channel untouched. To get maximum airflow you must set both to turbo first, then demote only the CPU to custom:

Set 0x820009   # both channels -> TURBO
Set 0x30001    # CPU -> CUSTOM; GPU stays in the inherited TURBO
SetSpeed 0x6401 # CPU fan -> 100%

Skipping the first line leaves the GPU channel on the stock curve, and the result is audibly weaker. We found this by ear, then confirmed it by reading both mode fields instead of just the CPU one.


Also worth doing: Windows cooling policy

Independent of any of the above, Windows has a System cooling policy setting that is hidden from the power options UI by default. On Passive it drops the CPU clock before speeding the fan up; on Active it does the opposite.

$SUB='54533251-82be-4824-96c1-47b60b740d00'; $COOL='94d3a615-a899-4ac5-ae2b-e4d8f634367f'
powercfg -attributes $SUB $COOL -ATTRIB_HIDE          # unhide it
powercfg /setacvalueindex SCHEME_CURRENT $SUB $COOL 1 # 1 = Active, 0 = Passive
powercfg /setdcvalueindex SCHEME_CURRENT $SUB $COOL 1
powercfg /setactive SCHEME_CURRENT

Both installers in this repo apply this for you.


Known issue — modes do not always stick

On the development machine, a mode set through WMI is sometimes reverted after roughly two seconds. The write returns success, a read-back immediately after confirms the new mode, and then it silently falls back.

We have not found the cause. Candidates we have not yet ruled out:

  • an Acer background service reasserting its own policy (AcerQAAgentSvis, the Quick Access component behind the Fn+F fan hotkey, and ASMSvc are both running by default);
  • a timeout inside the embedded controller itself for non-AUTO modes;
  • something else entirely.

The tray re-applies once per second, which masks the symptom but does not fix it — and note the arithmetic: if the mode really drops after ~2 s, a 1 s loop only ever restores it after it has already fallen. You get most of the airflow, most of the time, not a mode that holds. Treat this as an open question, not a solved problem. If you own one of these machines and can characterise it, a PR or an issue with a timeline would be genuinely useful.

A note on how we got here: several of our earlier measurements were invalid because the tray icon was running during them and actively re-imposing its own state on the hardware we were trying to measure. If you experiment with this, shut the tray down first.

Caveats, honestly

  • Only verified on the A515-57. The AcerGamingFunction class exists on many Acer machines but the firmware behind it varies. Run cooler.ps1 status first: if it reads back the modes you set, your machine backs the interface. If the setters return non-zero, yours doesn't — stop there.
  • max (CUSTOM 100%) is a pinned duty cycle. If the embedded controller resets, it can fall back to the stock curve without telling you. That is exactly why the tray icon verifies against the hardware instead of trusting its own state. Prefer turbo for unattended use; it is a declared mode the firmware manages.
  • MSAcpi_ThermalZoneTemperature (TZ00) is a chassis zone, reading around 28 °C. It is not the CPU die and is useless for validating any of this. Use HWiNFO or status instead.
  • We never needed NBFC, and there is still no NBFC config for this model.
  • This turns your fan up. It does not raise power limits or overclock anything — it removes a thermal ceiling so the CPU can hold its own turbo longer. Noise is the trade.
  • Use at your own risk. Running a fan at 100% continuously wears the bearing faster than the stock curve does.

License

MIT — see LICENSE.