Auto Video Card Fan Control For AMD Radeon 7770
When I got my new PC I wasn’t very happy with how loud the fan was on the video card. I picked up the XFX R7770. It was about $100 on Amazon. It’s an all right video card save a few small issues. One of the biggest issues is that the fan is so loud by default.
After searching and trying to figure it out I came across a tool that could set the fan speed (and over-clock the board). After figuring out the controls I was able to set the board to 20% fan. Perfect!
But there is a problem. It’s a hard number and not dynamic. I needed the fan to change depending on the temp of the card. The same tool that sets the fan can also report the temp. So I created a daemon for it.
#!/usr/bin/env ruby # encoding: utf-8 # # Required Gems # # gem install fallen clap # require 'fallen' require 'fallen/cli' def get_temp temp_str = `aticonfig --adapter=0 --od-gettemperature` temp_str.scan(/Sensor 0: Temperature - (\d+\.\d+) C/)[0][0].to_i end def get_speed speed_str = `aticonfig --pplib-cmd "get fanspeed 0"` speed_str.scan(/Fan Speed: (\d+)/)[0][0].to_i end def set_speed(speed) `aticonfig --pplib-cmd "set fanspeed 0 #{speed}"` end module Azazel extend Fallen extend Fallen::CLI def self.run @thresholds = [ 40, 60, 65, 70, 80, 85 ] @speeds = [ 10, 20, 25, 30, 45, 50 ] @speed = 100 # default speed pid_file "/var/run/quiet-fan.pid" stdout "/var/log/quiet-fan.log" puts "#{Time.now} Started." while running? temp = get_temp @thresholds.each_with_index do |threshold, index| @speed = @speeds[index] and break if temp < threshold end set_speed(@speed) if @speed != get_speed puts "#{Time.now} Temperature: #{temp}°C / Fan speed: #{@speed}%" sleep 10 end puts "#{Time.now} Ended." end def self.usage puts "Quiet-Fan Usage:\n" puts " quiet-fan.rb [ start | stop ]\n\n" puts "start: starts quiet-fan in the background" puts " stop: stops the background running quiet-fan" end end case Clap.run(ARGV, Azazel.cli).first when "start" Azazel.daemonize! Azazel.start! when "stop" Azazel.stop! else Azazel.usage end
I run this daemon from init.d and all is good. It can possible work for other cards and you can tweak it to fit even more.
It’s also possible that the card has something built-in but I haven’t found it yet. This works for me.