From 41d24dc8d8bb4c5fb4aaa74a405a77397103c638 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Sun, 21 Oct 2012 14:24:03 +0000 Subject: [PATCH] Added support for fan control on ITE 87XX chips and a mainboard specific configuration for the Gigabyte GA 970A UD3 (both based on a patch from Eric Hokanson). --- Hardware/LPC/IT87XX.cs | 60 +++++++++++++++++++++++++-- Hardware/Mainboard/Identification.cs | 2 + Hardware/Mainboard/Model.cs | 1 + Hardware/Mainboard/SuperIOHardware.cs | 17 ++++++++ Properties/AssemblyVersion.cs | 4 +- 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/Hardware/LPC/IT87XX.cs b/Hardware/LPC/IT87XX.cs index 59c9283..ad0990c 100644 --- a/Hardware/LPC/IT87XX.cs +++ b/Hardware/LPC/IT87XX.cs @@ -10,6 +10,7 @@ using System.Globalization; using System.Text; +using System; namespace OpenHardwareMonitor.Hardware.LPC { internal class IT87XX : ISuperIO { @@ -45,10 +46,14 @@ namespace OpenHardwareMonitor.Hardware.LPC { private const byte VENDOR_ID_REGISTER = 0x58; private const byte FAN_TACHOMETER_DIVISOR_REGISTER = 0x0B; private readonly byte[] FAN_TACHOMETER_REG = - new byte[] { 0x0d, 0x0e, 0x0f, 0x80, 0x82 }; + { 0x0d, 0x0e, 0x0f, 0x80, 0x82 }; private readonly byte[] FAN_TACHOMETER_EXT_REG = - new byte[] { 0x18, 0x19, 0x1a, 0x81, 0x83 }; + { 0x18, 0x19, 0x1a, 0x81, 0x83 }; private const byte VOLTAGE_BASE_REG = 0x20; + private readonly byte[] FAN_PWM_CTRL_REG = { 0x15, 0x16, 0x17 }; + + private bool[] restoreDefaultFanPwmControlRequired = new bool[3]; + private byte[] initialFanPwmControl = new byte[3]; private byte ReadByte(byte register, out bool valid) { Ring0.WriteIoPort(addressReg, register); @@ -77,7 +82,40 @@ namespace OpenHardwareMonitor.Hardware.LPC { Ring0.WriteIoPort((ushort)(gpioAddress + index), value); } - public void SetControl(int index, byte? value) { } + private void SaveDefaultFanPwmControl(int index) { + bool valid; + if (!restoreDefaultFanPwmControlRequired[index]) { + initialFanPwmControl[index] = + ReadByte(FAN_PWM_CTRL_REG[index], out valid); + restoreDefaultFanPwmControlRequired[index] = true; + } + } + + private void RestoreDefaultFanPwmControl(int index) { + if (restoreDefaultFanPwmControlRequired[index]) { + WriteByte(FAN_PWM_CTRL_REG[index], initialFanPwmControl[index]); + restoreDefaultFanPwmControlRequired[index] = false; + } + } + + public void SetControl(int index, byte? value) { + if (index < 0 || index >= controls.Length) + throw new ArgumentOutOfRangeException("index"); + + if (!Ring0.WaitIsaBusMutex(10)) + return; + + if (value.HasValue) { + SaveDefaultFanPwmControl(index); + + // set output value + WriteByte(FAN_PWM_CTRL_REG[index], (byte)(value.Value >> 1)); + } else { + RestoreDefaultFanPwmControl(index); + } + + Ring0.ReleaseIsaBusMutex(); + } public IT87XX(Chip chip, ushort address, ushort gpioAddress, byte version) { @@ -103,6 +141,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { voltages = new float?[9]; temperatures = new float?[3]; fans = new float?[chip == Chip.IT8705F ? 3 : 5]; + controls = new float?[3]; // IT8721F, IT8728F and IT8772E use a 12mV resultion ADC, all others 16mV if (chip == Chip.IT8721F || chip == Chip.IT8728F || chip == Chip.IT8771E @@ -270,6 +309,21 @@ namespace OpenHardwareMonitor.Hardware.LPC { } } + for (int i = 0; i < controls.Length; i++) { + bool valid; + byte value = ReadByte(FAN_PWM_CTRL_REG[i], out valid); + if (!valid) + continue; + + if ((value & 0x80) > 0) { + // automatic operation (value can't be read) + controls[i] = null; + } else { + // software operation + controls[i] = (float)Math.Round((value & 0x7F) * 100.0f / 0x7F); + } + } + Ring0.ReleaseIsaBusMutex(); } } diff --git a/Hardware/Mainboard/Identification.cs b/Hardware/Mainboard/Identification.cs index bc86a58..6ed16c5 100644 --- a/Hardware/Mainboard/Identification.cs +++ b/Hardware/Mainboard/Identification.cs @@ -132,6 +132,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { return Model.G41MT_S2; case "G41MT-S2P": return Model.G41MT_S2P; + case "GA-970A-UD3": + return Model.GA_970A_UD3; case "GA-MA770T-UD3": return Model.GA_MA770T_UD3; case "GA-MA770T-UD3P": diff --git a/Hardware/Mainboard/Model.cs b/Hardware/Mainboard/Model.cs index cd59faf..4db709f 100644 --- a/Hardware/Mainboard/Model.cs +++ b/Hardware/Mainboard/Model.cs @@ -51,6 +51,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { G41M_Combo, G41MT_S2, G41MT_S2P, + GA_970A_UD3, GA_MA770T_UD3, GA_MA770T_UD3P, GA_MA785GM_US2H, diff --git a/Hardware/Mainboard/SuperIOHardware.cs b/Hardware/Mainboard/SuperIOHardware.cs index 35ca8f6..de6e804 100644 --- a/Hardware/Mainboard/SuperIOHardware.cs +++ b/Hardware/Mainboard/SuperIOHardware.cs @@ -352,6 +352,23 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { f.Add(new Fan("CPU Fan", 0)); f.Add(new Fan("System Fan", 1)); break; + case Model.GA_970A_UD3: // IT8720F + v.Add(new Voltage("CPU VCore", 0)); + v.Add(new Voltage("DRAM", 1)); + v.Add(new Voltage("+3.3V", 2)); + v.Add(new Voltage("+5V", 3, 6.8f, 10)); + v.Add(new Voltage("+12V", 4, 24.3f, 8.2f)); + v.Add(new Voltage("VBat", 8)); + t.Add(new Temperature("System", 0)); + t.Add(new Temperature("CPU", 1)); + f.Add(new Fan("CPU Fan", 0)); + f.Add(new Fan("System Fan #1", 1)); + f.Add(new Fan("System Fan #2", 2)); + f.Add(new Fan("Power Fan", 4)); + c.Add(new Ctrl("PWM 1", 0)); + c.Add(new Ctrl("PWM 2", 1)); + c.Add(new Ctrl("PWM 3", 2)); + break; case Model.GA_MA770T_UD3: // IT8720F case Model.GA_MA770T_UD3P: // IT8720F case Model.GA_MA790X_UD3P: // IT8720F diff --git a/Properties/AssemblyVersion.cs b/Properties/AssemblyVersion.cs index 75737a6..df373b4 100644 --- a/Properties/AssemblyVersion.cs +++ b/Properties/AssemblyVersion.cs @@ -10,5 +10,5 @@ using System.Reflection; -[assembly: AssemblyVersion("0.5.1.4")] -[assembly: AssemblyInformationalVersion("0.5.1.4 Alpha")] \ No newline at end of file +[assembly: AssemblyVersion("0.5.1.5")] +[assembly: AssemblyInformationalVersion("0.5.1.5 Alpha")] \ No newline at end of file