Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FanCamp

Open-source fan control for Intel Macs running Windows (Boot Camp).

Reads temperatures and fan speeds, and lets you force fan RPM or follow a temperature curve, by talking directly to the Apple SMC — the controller every Mac fan utility uses.

Boot Camp's stock fan curve is conservative, so these machines get hot and throttle under sustained load. FanCamp lets you ramp the fans earlier.

Status

Experimental (v0.1), but working end to end: reading, forcing, curves and restoring automatic control are all verified on real hardware.

Tested on a MacBookPro16,1 (16-inch, 2019, T2) running Windows 11 Pro. Both the T2 (MMIO) and pre-T2 (port) interfaces are implemented; only the T2 path has been exercised on hardware, so reports from other models are very welcome — run fancamp diag and open an issue.

Apple Silicon Macs cannot run Windows natively and are out of scope.

Install

git clone https://github.com/john7rho/fancamp
cd fancamp
dotnet publish src/FanCamp -c Release -o publish
./publish/fancamp.exe install-driver   # one-time, asks for admin via UAC
./publish/fancamp.exe status

Needs the .NET 8 runtime (or add --self-contained -p:PublishSingleFile=true to the publish command to get a standalone exe).

install-driver installs the signed InpOut kernel driver (vendored in drivers/, MIT licensed) and sets it to load at boot. After that one-time step, fancamp runs without admin.

Usage

fancamp status                  show fans and temperature sensors
fancamp set <fan#|all> <rpm>    force a fan to a fixed RPM (clamped to its min/max)
fancamp auto [fan#|all]         return fan(s) to automatic control
fancamp curve                   follow a temperature curve until Ctrl+C, then restore auto
fancamp curve --sensor TC0P --min-temp 50 --max-temp 80 --interval 5
fancamp keys                    dump every SMC key with type and value
fancamp read TC0P               read one key
fancamp diag                    show how fancamp found and connected to your SMC

fancamp autostart install [curve options]   run that curve at every login
fancamp autostart remove                    stop running at login
fancamp autostart status                    show the setup and tail the log

Real output from the test machine:

> fancamp status
Fans (2):
  #  Name          Actual   Min    Max    Target  Mode
  0  -             2585     1836   5297   2581    auto
  1  -             2394     1700   4905   2390    auto

Sensors:
  CPU PECI         (TCXC)    68.3 °C
  CPU proximity    (TC0P)    64.1 °C
  CPU package      (TC0F)    70.9 °C
  GPU proximity    (TG0P)    65.2 °C
  Battery          (TB0T)    35.3 °C
  Palm rest        (Ts0P)    33.0 °C

Fan names read as - on T2 Macs because Apple dropped the FiID descriptor key there.

A quieter, cooler machine under load is usually just:

fancamp curve --min-temp 55 --max-temp 85

Running it at every login

fancamp autostart install --min-temp 60 --max-temp 90 --interval 5

That writes a per-user Run entry — no admin, no scheduled task, and it shows up in Task Manager's Startup tab where you can see and disable it like anything else. The curve then runs in the background with its console hidden, logging to %LOCALAPPDATA%\fancamp\curve.log.

fancamp autostart status   # is it set up, is it running, last few log lines
fancamp autostart remove   # stop starting at login

Only one curve runs at a time: a second one exits rather than fighting the first, and set/auto warn you when a background curve is about to override them.

Pick the ramp to suit the machine. A range that starts near idle temperature keeps fans audible all the time; starting a little above idle stays quiet when you are doing nothing and still ramps hard under load.

How it works

The SMC is the ACPI device APP0001. Its values live in a store of four-character keys: F0Ac is fan 0's actual RPM, TC0P is the CPU proximity temperature. Forcing a fan means writing its target (F0Tg) and flipping its mode key (F0Md).

There are two ways to reach it. Pre-T2 Macs use I/O ports at 0x300; T2 Macs (2018 and later) use a memory-mapped window and the ports read back 0xFF. FanCamp discovers the addresses from the device's ACPI resources, prefers MMIO, and falls back to ports.

Windows user-mode code can do neither port I/O nor physical memory mapping, so FanCamp uses the signed InpOut helper driver — the usual approach for open-source hardware tools on Windows.

Full details, including the register map and the quirks found along the way, are in docs/PROTOCOL.md. This is a clean-room implementation from public documentation (the Linux applesmc driver, the t2linux patches, smcFanControl); no proprietary software was decompiled.

Safety

  • Fan targets are always clamped to the fan's own reported [min, max], so FanCamp cannot drive a fan below Apple's floor. Asking for 500 RPM gets you the minimum.
  • Mode changes are verified: FanCamp reads the mode back and rewrites it if the SMC did not take it, so "restored to automatic" means it actually happened.
  • curve restores automatic control on Ctrl+C, console close, logoff and shutdown — including when it is running hidden in the background.
  • If FanCamp is killed forcefully (taskkill /F, a crash), the fans stay at their last forced speed and Apple's thermal management stays disabled until you run fancamp auto. fancamp status always shows which mode each fan is in.
  • Security: once installed, the InpOut driver can be opened by any local process — that is what lets FanCamp run without admin, and it is the shared weakness of every port-I/O helper of this generation. Remove it with sc.exe delete inpoutx64 if that tradeoff bothers you; a PawnIO backend is on the roadmap.
  • This is experimental software that pokes at your Mac's embedded controller. It uses the same mechanism as long-established tools, but there is no warranty — see LICENSE.

Roadmap

  • Tray app with a live readout, so the background curve is visible at a glance
  • PawnIO backend to replace InpOut
  • Verify the port path on a pre-T2 Mac
  • CI and signed releases

Contributing

Issues and pull requests welcome, especially fancamp diag output from Mac models not listed above. Sensor labels live in FanController.KnownSensors.

License

MIT — see LICENSE. The vendored drivers/inpoutx64.dll is MIT licensed by its authors (drivers/inpout-license.txt).

Not affiliated with Apple. "Macs Fan Control" is a separate proprietary product by CrystalIDEA; FanCamp shares no code with it.

About

Open-source fan control for Intel Macs running Windows (Boot Camp) - reads temps, controls fans via the Apple SMC

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages