Become a MacRumors Supporter for $50/year with no ads, ability to filter front page stories, and private forums.

davepk

macrumors member
Original poster
Nov 20, 2006
45
0
Update 11/01/07
For the latest Leopard compatible version follow this link...
https://forums.macrumors.com/posts/4430138/



After following this thread > http://discussions.apple.com/thread.jspa?threadID=734247&tstart=0 < for awhile i became concerned that the hard drives (5 of them) in my MP where running too hot (well above 40C).

So i decided to download and try out the following utility > http://www.lobotomo.com/products/FanControl/index.html <.

Unfortunately, it didnt detect the CPU core temps correctly nor did it let you set the fan RPMs below 1000. Being unable to detect the cpu temps meant that it couldnt respond to high load/temp conditions and thus required you to run all the time at a rpm that was sufficient for a high load condition.

Fortunately, it came with source code and I was able to make some changes to it so that it worked better (not perfect) with my Mac Pro.

I've attached the modified source code for anyone who might be interested in building this util for themselves.

The changes i made are as follows...

Base speed minimum value is now 700rpm
Default Base speed is now 1000rpm
Lower Threshold minimum value is now 25C
Default Lower Threshold is now 25C
Upper Threshold minimum value is now 25C
Default Upper Threshold is now 50C
reported temp is the higher of the 2 heat sink temps.

When i attempted to use what appeared to be the SMC CPU temp keys the values reported where higher than expected and fluctuated in unexpected ways. That lead me to believe i either had the wrong keys or the value decoding was in error or some filtering was in order.

I then looked at the values reported by the SMC heat sink keys and they matched perfectly the values reported by "Temperature Monitor" so i decided to use them instead.

Installation...
Build the attached source code.
Download and install Fan Control 1.1 from Lobomoto from the link above.
replace the installed "Fan Control.prefPane" with the newly built version.
Stop FanControlDaemon from activity monitor if one is running.
replace the installed "FanControlDaemon" with the newly built version.
/Library/StartupItems/FanControlDaemon/FanControlDaemon start
goto systempreferences/FanControl and make changes to the setting as desired.

With this util running on my MP (2.0GHz, 6BG, 5 hard drives internal) 25C abient temps running Seti@Home http://setiathome.berkeley.edu/index.php with all 4 CPUs pegged at 100%.
I get the follwing temps reported by "Temperature Monitor"
CPU A Heatsink: 29C
CPU B Heatsink: 29C
CPU Core 1: 34C
CPU Core 2: 34C
CPU Core 3: 35C
CPU Core 4: 35C
Memory Modules varied between 44C - 48C
HD Smart varied between 32C - 38C

I hope this helps some of you...

But be carefull, There is more than enough rope here to hang yourself (kill your new computer).

Dave Kennedy
 

Attachments

  • Source Code.zip
    104.4 KB · Views: 971
Here is an update...
This new bit of code now controls the 3 main fans instead of just the front two.
The graph view is scaled to better show values of interest to MP users.
 

Attachments

  • Source Code.zip
    117.1 KB · Views: 878
Tested and works!

:)

Looks like the start of a great branch project! Now.... how about this...

Base settings for each of the 3 fans
Thermal Zones (CPU/Memory, PCIe & HDD)

:)
 
fair enough :D I haven't looked at this myself (just about to buy a mac pro) but what you'll want is Xcode, you can download it from Apple or your OSx install DVDs
 
Working out nicely so far, but what sensor is it monitoring for the temp? Seems like it's looking at the PCIe slots.. I think this needs to be changed to CPU-A, or maybe user selectable?

So far, just bringing the base speed up RPM, My non-massive-heatsinked memory went from 165F to 135F, without a major increase in sound.

It would be nice to set the base speed for each of the 4 fans separately.
I would love for the memory/cpu exhaust to be 300rpm higher, and the rest at the standard base.
 
Working out nicely so far, but what sensor is it monitoring for the temp? Seems like it's looking at the PCIe slots.. I think this needs to be changed to CPU-A, or maybe user selectable?

The original code looked for the smc key "TC0D". This key doesnt exist on a MP.

There are however a set of 4 keys TC0C - TC3C that seemed likely to be the cpu core temps. However, when i tried to use them the temps reported back didnt behave in a reasonable predictable manner. Thus i didnt use them.

I did notice the existance of two other keys that seemed to corrospond to the heatsink temps so i tried them instead. They corrospond 100% with the temps reported by the app "Temperature Monitor" as CPU A/B Heatsink temp.

Below are a list of the SMC keys available on the MP. If you think a different set of keys than those mentioned above are the real CPU temps you cangive them a try by filling in the keys in smc.h and rebuilding.

#KEY [ui32] 255 (bytes 00 00 00 ff)
+LKS [flag] (bytes 07)
ACID [ch8*] (bytes 00 00 00 00 00 00 00 00)
ALSC [{alc] (bytes 01 92 00 96 08 b0 00 02 00 01 00 64 0e d9 00 00)
AUPO [ui8 ] 0 (bytes 00)
BATP [flag] (bytes 00)
BISE [ui8 ] 0 (bytes 00)
BNum [ui8 ] 0 (bytes 00)
BRSC [ui16] 0 (bytes 00 00)
CLK! [ui8 ] 0 (bytes 00)
CLKC [{clc] (bytes 00 00 0e 10 00 00 0e 10 19 8c)
CLKH [{clh] (bytes 00 00 70 80 00 01 19 40)
CLKS [fp1f] (bytes 80 00)
CLKT [ui32] 122 (bytes 00 00 c4 7a)
CONT [ui32] 0 (bytes 10 00 10 00)
CRCB [ui32] 64 (bytes c5 12 fc 40)
CRCU [ui32] 191 (bytes 44 91 24 bf)
Dlpc [flag] (bytes 00)
EPCF [flag] (bytes 01)
EPCI [ui32] 0 (bytes 00 80 07 00)
EPCV [ui16] 1 (bytes 00 01)
EPMA [ch8*] (bytes 00 00 e0 80)
EPMI [ui8 ] 0 (bytes 00)
EPUF [flag] (bytes 01)
EPUI [ui32] 1 (bytes 00 80 00 01)
EPUV [ui16] 1 (bytes 00 01)
EVCT [ui16] 1 (bytes 01 01)
EVMD [ui32] 0 (bytes 00 00 00 00)
EVRD [ch8*] (bytes f6 06 03 00 00 00 9b 09 35 05 f8 00 02 00 82 92 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)
F0Ac [fpe2] 1008 (bytes 0f c3)
F0ID [{fds] (bytes 01 00 01 00 43 50 55 5f 4d 45 4d 20 00 00 00 00)
F0Mn [fpe2] 1010 (bytes 0f c8)
F0Mt [ui16] 131 (bytes 05 83)
F0Mx [fpe2] 2900 (bytes 2d 50)
F0Sf [fpe2] 1200 (bytes 12 c0)
F0Tg [fpe2] 1010 (bytes 0f c8)
F1Ac [fpe2] 1009 (bytes 0f c5)
F1ID [{fds] (bytes 01 01 04 00 49 4f 20 00 00 00 00 00 00 00 00 00)
F1Mn [fpe2] 1010 (bytes 0f c8)
F1Mt [ui16] 131 (bytes 05 83)
F1Mx [fpe2] 2900 (bytes 2d 50)
F1Sf [fpe2] 1200 (bytes 12 c0)
F1Tg [fpe2] 1010 (bytes 0f c8)
F2Ac [fpe2] 1109 (bytes 11 54)
F2ID [{fds] (bytes 01 00 0d 00 45 58 48 41 55 53 54 20 00 00 00 00)
F2Mn [fpe2] 1010 (bytes 0f c8)
F2Mt [ui16] 231 (bytes 05 e7)
F2Mx [fpe2] 2900 (bytes 2d 50)
F2Sf [fpe2] 1200 (bytes 12 c0)
F2Tg [fpe2] 1110 (bytes 11 58)
F3Ac [fpe2] 599 (bytes 09 5d)
F3ID [{fds] (bytes 01 02 10 00 50 53 20 20 20 00 00 00 00 00 00 00)
F3Mn [fpe2] 600 (bytes 09 60)
F3Mt [ui16] 128 (bytes 02 80)
F3Mx [fpe2] 2800 (bytes 2b c0)
F3Sf [fpe2] 1200 (bytes 12 c0)
F3Tg [fpe2] 600 (bytes 09 60)
FNum [ui8 ] 4 (bytes 04)
FPhz [i16 ] (bytes 00 00)
FS! [ui16] 0 (bytes 00 00)
HDBS [ui8 ] 0 (bytes 00)
HDST [ui16] 0 (bytes 00 00 00 00)
HDSW [ui32] 2 (bytes 00 02 00 02)
ICAC [fp88] (bytes 08 61)
ICAc [ui16] 64 (bytes 14 40)
ICBC [fp88] (bytes 09 2f)
ICBc [ui16] 0 (bytes 0f 00)
IM1s [ui16] 0 (bytes 28 00)
IM2s [ui16] 64 (bytes 28 40)
IMAS [fp88] (bytes 02 09)
IMBS [fp88] (bytes 02 06)
IN0C [fp88] (bytes 0d 34)
IN0c [ui16] 64 (bytes 79 40)
Ie1S [fp88] (bytes 01 6e)
Ie1s [ui16] 192 (bytes 1b c0)
Ie2S [fp88] (bytes 00 09)
Ie2s [ui16] 192 (bytes 00 c0)
Ie3S [fp88] (bytes 00 0d)
Ie3s [ui16] 0 (bytes 01 00)
Ie4S [fp88] (bytes 00 09)
Ie4s [ui16] 192 (bytes 00 c0)
IeAS [fp88] (bytes 01 04)
IeAs [ui16] 192 (bytes 13 c0)
IeBS [fp88] (bytes 00 0d)
IeBs [ui16] 192 (bytes 00 c0)
Ip0C [fp88] (bytes 0d 00)
Ip0c [ui16] 48 (bytes 03 30)
Jp0D [ui16] 0 (bytes 00 00)
Jp0S [ui16] 0 (bytes 00 00)
Jp0W [ui16] 0 (bytes 00 00)
JpFE [flag] (bytes 01)
LAcN [ui8 ] 0 (bytes 00)
LAtN [ui16] 0 (bytes 00 00)
LS! [ui8 ] 0 (bytes 00)
LSCF [{lsc] (bytes 02 ee 01 90 80 00 01 02 00 06)
LSDD [{lsd] (bytes 00 02 00 03 00 03 00 19)
LSDU [{lsd] (bytes 00 03 00 02 00 14 00 03)
LSFD [{lsf] (bytes 00 00 00 04 00 1e)
LSFU [{lsf] (bytes 17 70 00 07 00 3c)
LSLB [{pwm] (bytes ff ff)
LSLF [{pwm] (bytes 00 00)
LSLN [{pwm] (bytes 4e 20)
LSOF [flag] (bytes 00)
LSOO [flag] (bytes 00)
LSPV [{pwm] (bytes 4e 20)
LSRB [flag] (bytes 00)
LSSB [{lso] (bytes 00 00)
LSSE [flag] (bytes 01)
LSSS [{lso] (bytes 00 00)
LSSV [ui16] 255 (bytes ff ff)
LSUP [ui8 ] 0 (bytes 00)
MACA [ui32] 0 (bytes 00 00 00 00)
MACM [flag] (bytes 01)
MACR [ch8*] (bytes 63 68 38 2a 90 00 9b 09 35 05 f8 00 02 00 82 92 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00)
MDE [ui16] 204 (bytes 00 cc)
MDLC [ui16] 0 (bytes 00 00)
MDSS [ui8 ] 2 (bytes 02)
MOCF [ui16] 0 (bytes 00 00)
MSAL [si8 ] (bytes 00)
MSDW [flag] (bytes 00)
MSLD [ui8 ] 0 (bytes 00)
MSPS [{msp] (bytes 00)
MSSD [si8 ] (bytes 00)
MSSS [{mss] (bytes 00)
MSTM [ui8 ] 0 (bytes 00)
MSWR [ui8 ] 0 (bytes 00)
NATJ [ui8 ] 0 (bytes 00)
NATi [ui16] 0 (bytes 00 00)
NTOK [ui8 ] 0 (bytes 00)
NVPR [ui8 ] 0 (bytes 00)
NVPW [ui8 ] 0 (bytes 00)
ONMI [ui8 ] 0 (bytes 00)
OSK0 [ch8*] (bytes 6f 75 72 68 61 72 64 77 6f 72 6b 62 79 74 68 65 73 65 77 6f 72 64 73 67 75 61 72 64 65 64 70 6c)
OSK1 [ch8*] (bytes 65 61 73 65 64 6f 6e 74 73 74 65 61 6c 28 63 29 41 70 70 6c 65 43 6f 6d 70 75 74 65 72 49 6e 63)
PCAC [fp88] (bytes 0a 8f)
PCBC [fp88] (bytes 0b 6b)
PMAS [fp88] (bytes 18 04)
PMBS [fp88] (bytes 18 01)
PN0C [fp88] (bytes 13 99)
Pe1S [fp88] (bytes 11 05)
Pe2S [fp88] (bytes 00 6b)
Pe3S [fp88] (bytes 00 9a)
Pe4S [fp88] (bytes 00 6b)
PeAS [fp88] (bytes 0c 17)
PeBS [fp88] (bytes 00 9a)
PeTS [ui16] 30 (bytes 00 1e)
Pp0C [fpc4] (bytes 09 cf)
RBr [ch8*] (bytes 6d 34 33 00 00 00 00 00)
REV [{rev] (bytes 01 07 0f 00 00 08)
RMde [byte] (bytes 41)
RPS0 [{psh] (bytes 0c 02 04 02 08 ce 00 00)
RPlt [ch8*] (bytes 6d 34 33 00 00 00 00 00)
RSvn [ui32] 33 (bytes 00 00 27 21)
RVBF [{rev] (bytes 01 07 0f 00 00 06)
RVUF [{rev] (bytes 01 07 0f 00 00 06)
SAS! [ui32] 0 (bytes 00 00 00 00)
SBF [ui16] 0 (bytes 00 00)
SDRd [ui16] 0 (bytes 00 00)
SIS! [ui16] 0 (bytes 00 00)
SIT! [ui16] 0 (bytes 00 00)
SIU! [ui16] 0 (bytes 00 00)
SIV! [ui16] 0 (bytes 00 00)
SIW! [ui16] 0 (bytes 00 00)
SPC0 [ui8 ] (bytes 01)
SPC1 [ui8 ] (bytes 01)
SPC2 [ui8 ] (bytes 01)
SPH0 [ui16] 0 (bytes 00 00)
SPH1 [ui16] 0 (bytes 00 00)
SPHS [ui8 ] 0 (bytes 00)
SPHT [ui8 ] 0 (bytes 00)
SPS! [ui16] 0 (bytes 00 00)
TA0P [sp78] (bytes 19 00)
TC0C [sp78] (bytes 33 00)
TC0P [sp78] (bytes 21 20)
TC1C [sp78] (bytes 00 00)
TC2C [sp78] (bytes 33 00)
TC3C [sp78] (bytes 00 00)
TCAH [sp78] (bytes 1b 90)
TCBH [sp78] (bytes 1b c0)
TH0P [sp78] (bytes 1f 00)
TH1P [sp78] (bytes 1e 00)
TH2P [sp78] (bytes 1f 00)
TH3P [sp78] (bytes 1e 00)
TM0P [sp78] (bytes 1e 00)
TM0S [sp78] (bytes 81 00)
TM1P [sp78] (bytes 22 00)
TM1S [sp78] (bytes 81 00)
TM2P [sp78] (bytes 23 00)
TM2S [sp78] (bytes 33 00)
TM3S [sp78] (bytes 2f 80)
TM8P [sp78] (bytes 1e 00)
TM8S [sp78] (bytes 81 00)
TM9P [sp78] (bytes 22 00)
TM9S [sp78] (bytes 81 00)
TMAP [sp78] (bytes 25 00)
TMAS [sp78] (bytes 31 80)
TMBS [sp78] (bytes 2d 80)
TN0H [sp78] (bytes 2f 80)
TS0C [sp78] (bytes 1e 00)
Tp0C [sp78] (bytes 32 00)
Tp1C [sp78] (bytes 32 00)
Tv0S [sp78] (bytes 1b 65)
Tv1S [sp78] (bytes 1b 65)
VCAC [fp88] (bytes 01 3e)
VCAc [ui16] 128 (bytes 60 80)
VCBC [fp88] (bytes 01 3e)
VCBc [ui16] 0 (bytes 60 00)
VM0s [ui16] 176 (bytes 02 b0)
VM1s [ui16] 152 (bytes 01 98)
VM2s [ui16] 248 (bytes 02 f8)
VM3s [ui16] 52 (bytes 03 34)
VM4s [ui16] 244 (bytes 02 f4)
VM8s [ui16] 176 (bytes 02 b0)
VM9s [ui16] 156 (bytes 01 9c)
VMAS [fp88] (bytes 0b cd)
VMAs [ui16] 252 (bytes 02 fc)
VMBS [fp88] (bytes 0b dd)
VMBs [ui16] 52 (bytes 03 34)
VMCs [ui16] 248 (bytes 02 f8)
VN0C [fp88] (bytes 01 7c)
VS2c [ui16] 196 (bytes 00 c4)
VS3c [ui16] 191 (bytes 00 bf)
VS4c [ui16] 190 (bytes 00 be)
VS5c [ui16] 191 (bytes 00 bf)
VS6c [ui16] 199 (bytes 00 c7)
VS7c [ui16] 199 (bytes 00 c7)
VS8c [ui16] 190 (bytes 00 be)
VS9c [ui16] 196 (bytes 00 c4)
VSAc [ui16] 115 (bytes 00 73)
VSBc [ui16] 173 (bytes 00 ad)
VSCc [ui16] 236 (bytes 00 ec)
VSDc [ui16] 204 (bytes 00 cc)
VSEc [ui16] 204 (bytes 00 cc)
VSFc [ui16] 189 (bytes 00 bd)
VeES [fp88] (bytes 0b e8)
Vp0C [fp88] (bytes 0c 13)
Vp0c [ui16] 21 (bytes 0c 15)
zDBG [ui8 ] (bytes 00)
zSCI [ui8 ] (bytes 00)
{clc [ ] (bytes 00 01 db)
{clf [ ] (bytes 00 01 e0)
{clh [ ] (bytes 00 01 db)
{fds [ ] (bytes 00 01 db)
{lsc [ ] (bytes 00 01 dd)
{lsd [ ] (bytes 00 01 db)
{lsf [ ] (bytes 00 01 db)
{lsm [ ] (bytes 00 01 dd)
{lso [ ] (bytes 00 01 dd)
{lss [ ] (bytes 00 01 dd)
{msp [ ] (bytes 00 01 df)
{mss [ ] (bytes 00 01 df)
{psh [ ] (bytes 00 01 df)
{pwm [ ] (bytes 00 01 dc)
{rev [ ] (bytes 00 01 e0)
{sds [ ] (bytes 00 01 db)
 
It would be nice to set the base speed for each of the 4 fans separately.
I would love for the memory/cpu exhaust to be 300rpm higher, and the rest at the standard base.

In the file MFDaemon.m look for the following line...
SMCSetFanRpm(SMC_KEY_FAN2_RPM_MIN, targetRpm);

Change it to...
SMCSetFanRpm(SMC_KEY_FAN2_RPM_MIN, targetRpm + 300);

I'm not sure what will happen if targetRpm + 300 > 2900. That would force the fan above its maxRpm. Likely nothing bad, probably just wont go any faster than 2900.

You can add a 4th line to that set of three calls to SMCSetFanRpm replacing SMC_KEY_FAN2_RPM_MIN with SMC_KEY_FAN3_RPM_MIN. You would also need to add that definition to smc.h next to the other 3 key definitions.
 
This is great!

I was doing something similar using the smc program (the same one created out of this thread) from the shell since the temperatures where I live normally tends to be 29 degrees C and higher. Due to this, I've had premature drive and processor failures (Quicksilver Dual G4) in the past and didn't want the same sort of scenario with my Mac Pro.

At idle (default fan speeds), my 1GB TransIntl memory modules were 72-75 degrees C, the stock Apple 512MB modules 61-65 degrees C, CPU cores (Xeon 5150) were in the 45 degrees C range (heatsinks 40 degrees C), drive bays 37-39 degrees C. Once any kind of intensive operations took place, temperatures would go up fairly rapidly; memory temperatures in excess of 82C and CPU cores at over 74C (the fans never kicked into a higher speed since Apple seems to have them set at some higher thermal level).

I've been running my CPU/memory fans, hard drive/expansion bay fan at 950, power supply fan and exhaust at 1050 after experimenting with different speeds over the past few weeks (this is Hardware Monitor showing my min/max temperature sensor readings over the last 23 hour period). I never bothered to try triggering the fan speed based on the temperature sensor values since I liked how the higher speeds kept temperatures in a relatively narrow range at idle or under load (but I may try it with this mod and see how things go). Fan noise isn't louder by much at these speeds but temperatures are much lower; @ low usage, the 512MB Apple sticks read 50C, TransIntl 1GB sticks 55C, CPU cores 35C, hard drive bays @ 32C. Under heavy use (including saturating all 4 cores for long periods), the temperature variation isn't as great as before; Apple memory averaged around 55C, TransIntl memory around 65C, CPU cores around 49C, and drive bays 33C. I popped the side off and both the drive surfaces and memory heat spreader fins (which were uncomfortably hot with the base fan speeds) are now very cool.
 
I thought those temperatures were too high. I still haven't got the Mac Pro but from the pictures, I see there are a bunch of capacitors everywhere. Those things are way more sensitive to the heat than the CPU. Overheated CPU/memory will cause a crash while a cap will pop much sooner than it should. Apple worry about the noise too much, 800 rpm isn't too bad at all. Thanks for the good work and the code - I'll try it later this week hopefully!
 
I have made a few more changes to the code.

I noticed that the power supply temps were still quite high and that the powersupply fan didnt change in speed. So, I added control of the powersupply fan. This took some doing as it doesnt behave in the same manner as the other fans. It required that i set it to forced mode before it would respond to speed change requests.

The PowerSupply fan and the main exhaust fan now operate at the command speed plus 200 rpm. That should quiet the front of the machine while still providing substantial cooling ability.

This bias is easily adjusted by changing the values in MFDaemon.m timer
 

Attachments

  • Source Code.zip
    116 KB · Views: 589
OK, so I compiled the code via Xcode. The prefs pane seems to work, but the daemon doesn't launch, despite being in the same location as the unmodified one.

Any thoughts?
 
this command is what starts up the daemon...

/Library/StartupItems/FanControlDaemon/FanControlDaemon start

The "start" at the end is required...

If thats what you are doing then maybe you didnt set the owner group of the daemon after you copied it into place.

sudo chown root:wheel /Library/StartupItems/FanControlDaemon/FanControlDaemon

Actually tho i'm not sure if thats nescessary, i've never not done it.

After you have started the daemon check activity monitor to see if its running.

Hope that helps.

BTW that first command is whats executed automaticly during bootup.
 
If thats what you are doing then maybe you didnt set the owner group of the daemon after you copied it into place.

sudo chown root:wheel /Library/StartupItems/FanControlDaemon/FanControlDaemon

That was it. It now launches correctly at startup. Thanks!

This utility is very handy. I've got 4 hard drives in there, two of which are 10,000 RPM Raptors in a RAID 0 config. It was getting hot in there. Just increasing the fans to 900 RPM has dropped the temps by nearly 10°C.
 
Register on MacRumors! This sidebar will go away, and you'll see fewer ads.