Fixed Issue 63.

This commit is contained in:
Michael Möller
2010-06-03 22:40:18 +00:00
parent 1fc256f0b6
commit 5d5307e5b5
11 changed files with 721 additions and 466 deletions
+37 -61
View File
@@ -37,18 +37,18 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
using OpenHardwareMonitor.Utilities;
namespace OpenHardwareMonitor.Hardware.LPC {
public class F718XX : LPCHardware, IHardware {
public class F718XX : ISuperIO {
private ushort address;
private Chip chip;
private Sensor[] temperatures;
private Sensor[] fans;
private Sensor[] voltages;
private float[] voltageGains;
private float?[] voltages;
private float?[] temperatures;
private float?[] fans;
// Hardware Monitor
private const byte ADDRESS_REGISTER_OFFSET = 0x05;
@@ -66,40 +66,21 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return WinRing0.ReadIoPortByte((ushort)(address + DATA_REGISTER_OFFSET));
}
public F718XX(Chip chip, ushort address) : base(chip) {
public F718XX(Chip chip, ushort address) {
this.address = address;
this.chip = chip;
temperatures = new Sensor[3];
for (int i = 0; i < temperatures.Length; i++)
temperatures[i] = new Sensor("Temperature #" + (i + 1), i, null,
SensorType.Temperature, this, new ParameterDescription[] {
new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
});
fans = new Sensor[chip == Chip.F71882 ? 4 : 3];
for (int i = 0; i < fans.Length; i++)
fans[i] = new Sensor("Fan #" + (i + 1), i, SensorType.Fan, this);
switch (chip) {
case Chip.F71858:
voltageGains = new float[] { 1, 1, 1 };
voltages = new Sensor[3];
voltages[0] = new Sensor("VCC3V", 0, SensorType.Voltage, this);
voltages[1] = new Sensor("VSB3V", 1, SensorType.Voltage, this);
voltages[2] = new Sensor("Battery", 2, SensorType.Voltage, this);
break;
default:
voltageGains = new float[] { 1, 0.5f, 1, 1, 1, 1, 1, 1, 1 };
voltages = new Sensor[4];
voltages[0] = new Sensor("VCC3V", 0, SensorType.Voltage, this);
voltages[1] = new Sensor("CPU VCore", 1, SensorType.Voltage, this);
voltages[2] = new Sensor("VSB3V", 7, SensorType.Voltage, this);
voltages[3] = new Sensor("Battery", 8, SensorType.Voltage, this);
break;
}
voltages = new float?[chip == Chip.F71858 ? 3 : 9];
temperatures = new float?[3];
fans = new float?[chip == Chip.F71882 || chip == Chip.F71858? 4 : 3];
}
public override string GetReport() {
public Chip Chip { get { return chip; } }
public float?[] Voltages { get { return voltages; } }
public float?[] Temperatures { get { return temperatures; } }
public float?[] Fans { get { return fans; } }
public string GetReport() {
StringBuilder r = new StringBuilder();
r.AppendLine("LPC " + this.GetType().Name);
@@ -123,23 +104,21 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return r.ToString();
}
public override void Update() {
public void Update() {
foreach (Sensor sensor in voltages) {
int value = ReadByte((byte)(VOLTAGE_BASE_REG + sensor.Index));
sensor.Value = voltageGains[sensor.Index] * 0.001f * (value << 4);
if (sensor.Value > 0)
ActivateSensor(sensor);
for (int i = 0; i < voltages.Length; i++) {
int value = ReadByte((byte)(VOLTAGE_BASE_REG + i));
voltages[i] = 0.001f * (value << 4);
}
foreach (Sensor sensor in temperatures) {
for (int i = 0; i < temperatures.Length; i++) {
switch (chip) {
case Chip.F71858: {
int tableMode = 0x3 & ReadByte((byte)(TEMPERATURE_CONFIG_REG));
int high =
ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * sensor.Index));
ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * i));
int low =
ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * sensor.Index + 1));
ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * i + 1));
if (high != 0xbb && high != 0xcc) {
int bits = 0;
switch (tableMode) {
@@ -151,33 +130,30 @@ namespace OpenHardwareMonitor.Hardware.LPC {
bits |= high << 7;
bits |= (low & 0xe0) >> 1;
short value = (short)(bits & 0xfff0);
sensor.Value = value / 128.0f;
ActivateSensor(sensor);
temperatures[i] = value / 128.0f;
} else {
sensor.Value = null;
temperatures[i] = null;
}
} break;
default: {
sbyte value = (sbyte)ReadByte((byte)(
TEMPERATURE_BASE_REG + 2 * (sensor.Index + 1)));
sensor.Value = value + sensor.Parameters[0].Value;
TEMPERATURE_BASE_REG + 2 * (i + 1)));
if (value < sbyte.MaxValue && value > 0)
ActivateSensor(sensor);
temperatures[i] = value;
else
temperatures[i] = null;
} break;
}
}
foreach (Sensor sensor in fans) {
int value = ReadByte(FAN_TACHOMETER_REG[sensor.Index]) << 8;
value |= ReadByte((byte)(FAN_TACHOMETER_REG[sensor.Index] + 1));
for (int i = 0; i < fans.Length; i++) {
int value = ReadByte(FAN_TACHOMETER_REG[i]) << 8;
value |= ReadByte((byte)(FAN_TACHOMETER_REG[i] + 1));
if (value > 0) {
sensor.Value = (value < 0x0fff) ? 1.5e6f / value : 0;
if (sensor.Value > 0)
ActivateSensor(sensor);
} else {
sensor.Value = null;
}
if (value > 0)
fans[i] = (value < 0x0fff) ? 1.5e6f / value : 0;
else
fans[i] = null;
}
}
}
+54
View File
@@ -0,0 +1,54 @@
/*
Version: MPL 1.1/GPL 2.0/LGPL 2.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the License.
The Original Code is the Open Hardware Monitor code.
The Initial Developer of the Original Code is
Michael Möller <m.moeller@gmx.ch>.
Portions created by the Initial Developer are Copyright (C) 2009-2010
the Initial Developer. All Rights Reserved.
Contributor(s):
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
*/
using System;
using System.Collections.Generic;
using OpenHardwareMonitor.Utilities;
namespace OpenHardwareMonitor.Hardware.LPC {
public interface ISuperIO {
Chip Chip { get; }
float?[] Voltages { get; }
float?[] Temperatures { get; }
float?[] Fans { get; }
string GetReport();
void Update();
}
}
+33 -182
View File
@@ -41,17 +41,17 @@ using System.Drawing;
using System.Text;
namespace OpenHardwareMonitor.Hardware.LPC {
public class IT87XX : LPCHardware, IHardware {
private bool available = false;
public class IT87XX : ISuperIO {
private ushort address;
private Chip chip;
private readonly ushort addressReg;
private readonly ushort dataReg;
private List<Sensor> voltages = new List<Sensor>(9);
private List<Sensor> temperatures = new List<Sensor>(3);
private Sensor[] fans;
private float?[] voltages = new float?[0];
private float?[] temperatures = new float?[0];
private float?[] fans = new float?[0];
// Consts
private const byte ITE_VENDOR_ID = 0x90;
@@ -78,10 +78,10 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return value;
}
public IT87XX(Chip chip, ushort address, Mainboard.Manufacturer
mainboardManufacturer, Mainboard.Model mainboardModel) : base (chip) {
public IT87XX(Chip chip, ushort address) {
this.address = address;
this.chip = chip;
this.addressReg = (ushort)(address + ADDRESS_REGISTER_OFFSET);
this.dataReg = (ushort)(address + DATA_REGISTER_OFFSET);
@@ -97,140 +97,22 @@ namespace OpenHardwareMonitor.Hardware.LPC {
if (!valid)
return;
string[] temperatureLabels;
List<Voltage> voltageConfigs = new List<Voltage>();
switch (mainboardManufacturer) {
case Mainboard.Manufacturer.DFI:
switch (mainboardModel) {
case Mainboard.Model.LP_BI_P45_T2RS_Elite:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("FSB VTT", 1));
voltageConfigs.Add(new Voltage("+3.3V", 2));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0));
voltageConfigs.Add(new Voltage("NB Core", 5));
voltageConfigs.Add(new Voltage("VDIMM", 6));
voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("VBat", 8));
temperatureLabels = new string[] {
"CPU", "System", "Chipset" };
break;
case Mainboard.Model.LP_DK_P55_T3eH9:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("VTT", 1));
voltageConfigs.Add(new Voltage("+3.3V", 2));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0));
voltageConfigs.Add(new Voltage("CPU PLL", 5));
voltageConfigs.Add(new Voltage("DRAM", 6));
voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("VBat", 8));
temperatureLabels = new string[] {
"Chipset", "CPU PWM", "CPU" };
break;
default:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("VTT", 1, true));
voltageConfigs.Add(new Voltage("+3.3V", 2, true));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0, true));
voltageConfigs.Add(new Voltage("Voltage #6", 5, true));
voltageConfigs.Add(new Voltage("DRAM", 6, true));
voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
voltageConfigs.Add(new Voltage("VBat", 8));
temperatureLabels = new string[] {
"Temperature #1", "Temperature #2", "Temperature #3" };
break;
}
break;
case Mainboard.Manufacturer.Gigabyte:
switch (mainboardModel) {
case Mainboard.Model.EP45_DS3R:
case Mainboard.Model.P35_DS3:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("DRAM", 1));
voltageConfigs.Add(new Voltage("+3.3V", 2));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
voltageConfigs.Add(new Voltage("VBat", 8));
break;
case Mainboard.Model.GA_MA785GMT_UD2H:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("DRAM", 1));
voltageConfigs.Add(new Voltage("+3.3V", 2));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
voltageConfigs.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
voltageConfigs.Add(new Voltage("VBat", 8));
break;
default:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("DRAM", 1, true));
voltageConfigs.Add(new Voltage("+3.3V", 2, true));
voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
voltageConfigs.Add(new Voltage("Voltage #5", 4, true));
voltageConfigs.Add(new Voltage("Voltage #6", 5, true));
voltageConfigs.Add(new Voltage("Voltage #7", 6, true));
voltageConfigs.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
voltageConfigs.Add(new Voltage("VBat", 8));
break;
}
temperatureLabels = new string[] { "System", "CPU" };
break;
default:
voltageConfigs.Add(new Voltage("CPU VCore", 0));
voltageConfigs.Add(new Voltage("Voltage #2", 1, true));
voltageConfigs.Add(new Voltage("Voltage #3", 2, true));
voltageConfigs.Add(new Voltage("Voltage #4", 3, true));
voltageConfigs.Add(new Voltage("Voltage #5", 4, true));
voltageConfigs.Add(new Voltage("Voltage #6", 5, true));
voltageConfigs.Add(new Voltage("Voltage #7", 6, true));
voltageConfigs.Add(new Voltage("Voltage #8", 7, true));
voltageConfigs.Add(new Voltage("VBat", 8));
temperatureLabels = new string[] {
"Temperature #1", "Temperature #2", "Temperature #3" };
break;
}
string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
foreach (Voltage voltage in voltageConfigs)
voltages.Add(new Sensor(voltage.Name, voltage.Index, voltage.Hidden,
null, SensorType.Voltage, this, new ParameterDescription[] {
new ParameterDescription("Ri [kΩ]", "Input resistance.\n" +
formula, voltage.Ri),
new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" +
formula, voltage.Rf),
new ParameterDescription("Vf [V]", "Reference voltage.\n" +
formula, voltage.Vf)
}));
for (int i = 0; i < temperatureLabels.Length; i++)
if (temperatureLabels[i] != null) {
temperatures.Add(new Sensor(temperatureLabels[i], i, null,
SensorType.Temperature, this, new ParameterDescription[] {
new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
}));
}
fans = new Sensor[5];
for (int i = 0; i < fans.Length; i++)
fans[i] = new Sensor("Fan #" + (i + 1), i, SensorType.Fan, this);
available = true;
voltages = new float?[9];
temperatures = new float?[3];
fans = new float?[5];
}
public bool IsAvailable {
get { return available; }
}
public Chip Chip { get { return chip; } }
public float?[] Voltages { get { return voltages; } }
public float?[] Temperatures { get { return temperatures; } }
public float?[] Fans { get { return fans; } }
public override string GetReport() {
public string GetReport() {
StringBuilder r = new StringBuilder();
r.AppendLine("LPC " + this.GetType().Name);
r.AppendLine();
r.Append("Chip ID: 0x"); r.AppendLine(chip.ToString("X"));
r.Append("Chip Name: "); r.AppendLine(name);
r.Append("Base Address: 0x"); r.AppendLine(address.ToString("X4"));
r.AppendLine();
r.AppendLine("Environment Controller Registers");
@@ -256,79 +138,48 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return r.ToString();
}
public override void Update() {
public void Update() {
foreach (Sensor sensor in voltages) {
for (int i = 0; i < voltages.Length; i++) {
bool valid;
float value = 0.001f * ((int)ReadByte(
(byte)(VOLTAGE_BASE_REG + sensor.Index), out valid) << 4);
(byte)(VOLTAGE_BASE_REG + i), out valid) << 4);
if (!valid)
continue;
sensor.Value = value + (value - sensor.Parameters[2].Value) *
sensor.Parameters[0].Value / sensor.Parameters[1].Value;
if (value > 0)
ActivateSensor(sensor);
voltages[i] = value;
else
voltages[i] = null;
}
foreach (Sensor sensor in temperatures) {
for (int i = 0; i < temperatures.Length; i++) {
bool valid;
sbyte value = (sbyte)ReadByte(
(byte)(TEMPERATURE_BASE_REG + sensor.Index), out valid);
(byte)(TEMPERATURE_BASE_REG + i), out valid);
if (!valid)
continue;
sensor.Value = value + sensor.Parameters[0].Value;
if (value < sbyte.MaxValue && value > 0)
ActivateSensor(sensor);
temperatures[i] = value;
else
temperatures[i] = null;
}
foreach (Sensor sensor in fans) {
for (int i = 0; i < fans.Length; i++) {
bool valid;
int value = ReadByte(FAN_TACHOMETER_REG[sensor.Index], out valid);
int value = ReadByte(FAN_TACHOMETER_REG[i], out valid);
if (!valid)
continue;
value |= ReadByte(FAN_TACHOMETER_EXT_REG[sensor.Index], out valid) << 8;
value |= ReadByte(FAN_TACHOMETER_EXT_REG[i], out valid) << 8;
if (!valid)
continue;
if (value > 0x3f) {
sensor.Value = (value < 0xffff) ? 1.35e6f / ((value) * 2) : 0;
if (sensor.Value > 0)
ActivateSensor(sensor);
fans[i] = (value < 0xffff) ? 1.35e6f / ((value) * 2) : 0;
} else {
sensor.Value = null;
fans[i] = null;
}
}
}
private class Voltage {
public readonly string Name;
public readonly int Index;
public readonly float Ri;
public readonly float Rf;
public readonly float Vf;
public readonly bool Hidden;
public Voltage(string name, int index) :
this(name, index, 0, 1, 0, false) { }
public Voltage(string name, int index, bool hidden) :
this(name, index, 0, 1, 0, hidden) { }
public Voltage(string name, int index, float ri, float rf, float vf) :
this(name, index, ri, rf, vf, false) { }
public Voltage(string name, int index, float ri, float rf, float vf,
bool hidden)
{
this.Name = name;
this.Index = index;
this.Ri = ri;
this.Rf = rf;
this.Vf = vf;
this.Hidden = hidden;
}
}
}
}
}
-88
View File
@@ -1,88 +0,0 @@
/*
Version: MPL 1.1/GPL 2.0/LGPL 2.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the License.
The Original Code is the Open Hardware Monitor code.
The Initial Developer of the Original Code is
Michael Möller <m.moeller@gmx.ch>.
Portions created by the Initial Developer are Copyright (C) 2009-2010
the Initial Developer. All Rights Reserved.
Contributor(s):
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
namespace OpenHardwareMonitor.Hardware.LPC {
public abstract class LPCHardware : Hardware {
private Image icon;
protected readonly string name;
protected readonly Chip chip;
public LPCHardware(Chip chip) {
this.chip = chip;
this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
switch (chip) {
case Chip.F71858: name = "Fintek F71858"; break;
case Chip.F71862: name = "Fintek F71862"; break;
case Chip.F71869: name = "Fintek F71869"; break;
case Chip.F71882: name = "Fintek F71882"; break;
case Chip.F71889ED: name = "Fintek F71889ED"; break;
case Chip.F71889F: name = "Fintek F71889F"; break;
case Chip.IT8712F: this.name = "ITE IT8712F"; break;
case Chip.IT8716F: this.name = "ITE IT8716F"; break;
case Chip.IT8718F: this.name = "ITE IT8718F"; break;
case Chip.IT8720F: this.name = "ITE IT8720F"; break;
case Chip.IT8726F: this.name = "ITE IT8726F"; break;
case Chip.W83627DHG: this.name = "Winbond W83627DHG"; break;
case Chip.W83627DHGP: this.name = "Winbond W83627DHG-P"; break;
case Chip.W83627EHF: this.name = "Winbond W83627EHF"; break;
case Chip.W83627HF: this.name = "Winbond W83627HF"; break;
case Chip.W83627THF: this.name = "Winbond W83627THF"; break;
case Chip.W83667HG: this.name = "Winbond W83667HG"; break;
case Chip.W83667HGB: this.name = "Winbond W83667HG-B"; break;
case Chip.W83687THF: this.name = "Winbond W83687THF"; break;
}
}
public override Identifier Identifier {
get { return new Identifier("lpc", chip.ToString().ToLower()); }
}
public override Image Icon {
get { return icon; }
}
public override string Name {
get { return name; }
}
}
}
+8 -15
View File
@@ -43,7 +43,7 @@ using System.Threading;
namespace OpenHardwareMonitor.Hardware.LPC {
public class LPCIO {
private List<IHardware> hardware = new List<IHardware>();
private List<ISuperIO> superIOs = new List<ISuperIO>();
private StringBuilder report = new StringBuilder();
private Chip chip = Chip.Unknown;
@@ -87,7 +87,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
WinRing0.WriteIoPortByte(registerPort, 0x55);
}
internal void IT87Exit() {
private void IT87Exit() {
WinRing0.WriteIoPortByte(registerPort, CONFIGURATION_CONTROL_REGISTER);
WinRing0.WriteIoPortByte(valuePort, 0x02);
}
@@ -119,9 +119,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
WinRing0.WriteIoPortByte(registerPort, 0xAA);
}
public LPCIO(Mainboard.Manufacturer mainboardManufacturer,
Mainboard.Model mainboardModel)
{
public LPCIO() {
if (!WinRing0.IsAvailable)
return;
@@ -289,9 +287,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
case Chip.W83667HG:
case Chip.W83667HGB:
case Chip.W83687THF:
W836XX w836XX = new W836XX(chip, revision, address);
if (w836XX.IsAvailable)
hardware.Add(w836XX);
superIOs.Add(new W836XX(chip, revision, address));
break;
case Chip.F71858:
case Chip.F71862:
@@ -309,7 +305,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
report.AppendLine();
return;
}
hardware.Add(new F718XX(chip, address));
superIOs.Add(new F718XX(chip, address));
break;
default: break;
}
@@ -353,10 +349,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return;
}
IT87XX it87 = new IT87XX(chip, address, mainboardManufacturer,
mainboardModel);
if (it87.IsAvailable)
hardware.Add(it87);
superIOs.Add(new IT87XX(chip, address));
return;
}
@@ -383,9 +376,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
}
}
public IHardware[] Hardware {
public ISuperIO[] SuperIO {
get {
return hardware.ToArray();
return superIOs.ToArray();
}
}
+93 -112
View File
@@ -37,23 +37,24 @@
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Text;
namespace OpenHardwareMonitor.Hardware.LPC {
public class W836XX : LPCHardware, IHardware {
public class W836XX : ISuperIO {
private ushort address;
private byte revision;
private bool available;
private Chip chip;
private Sensor[] temperatures;
private Sensor[] fans;
private Sensor[] voltages;
private float?[] voltages = new float?[0];
private float?[] temperatures = new float?[0];
private float?[] fans = new float?[0];
private float[] voltageGains;
private string[] fanNames;
private bool[] peciTemperature = new bool[0];
private byte[] voltageRegister = new byte[0];
private byte[] voltageBank = new byte[0];
private float voltageGain = 0.008f;
// Consts
private const ushort WINBOND_VENDOR_ID = 0x5CA3;
@@ -64,13 +65,11 @@ namespace OpenHardwareMonitor.Hardware.LPC {
private const byte DATA_REGISTER_OFFSET = 0x06;
// Hardware Monitor Registers
private const byte VOLTAGE_BASE_REG = 0x20;
private const byte VOLTAGE_VBAT_REG = 0x51;
private const byte BANK_SELECT_REGISTER = 0x4E;
private const byte VENDOR_ID_REGISTER = 0x4F;
private const byte TEMPERATURE_SOURCE_SELECT_REG = 0x49;
private string[] TEMPERATURE_NAME =
new string[] {"CPU", "Auxiliary", "System"};
private byte[] TEMPERATURE_REG = new byte[] { 0x50, 0x50, 0x27 };
private byte[] TEMPERATURE_BANK = new byte[] { 1, 2, 0 };
@@ -90,7 +89,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
(ushort)(address + ADDRESS_REGISTER_OFFSET), register);
return WinRing0.ReadIoPortByte(
(ushort)(address + DATA_REGISTER_OFFSET));
}
}
private void WriteByte(byte bank, byte register, byte value) {
WinRing0.WriteIoPortByte(
@@ -103,90 +102,73 @@ namespace OpenHardwareMonitor.Hardware.LPC {
(ushort)(address + DATA_REGISTER_OFFSET), value);
}
public W836XX(Chip chip, byte revision, ushort address)
: base(chip)
{
public W836XX(Chip chip, byte revision, ushort address) {
this.address = address;
this.revision = revision;
this.chip = chip;
available = IsWinbondVendor();
ParameterDescription[] parameter = new ParameterDescription[] {
new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
};
List<Sensor> list = new List<Sensor>();
if (!IsWinbondVendor())
return;
temperatures = new float?[3];
peciTemperature = new bool[3];
switch (chip) {
case Chip.W83667HG:
case Chip.W83667HGB:
// do not add temperature sensor registers that read PECI
// note temperature sensor registers that read PECI
byte flag = ReadByte(0, TEMPERATURE_SOURCE_SELECT_REG);
if ((flag & 0x04) == 0)
list.Add(new Sensor(TEMPERATURE_NAME[0], 0, null,
SensorType.Temperature, this, parameter));
if ((flag & 0x40) == 0)
list.Add(new Sensor(TEMPERATURE_NAME[1], 1, null,
SensorType.Temperature, this, parameter));
list.Add(new Sensor(TEMPERATURE_NAME[2], 2, null,
SensorType.Temperature, this, parameter));
peciTemperature[0] = (flag & 0x04) != 0;
peciTemperature[1] = (flag & 0x40) != 0;
peciTemperature[2] = false;
break;
case Chip.W83627DHG:
case Chip.W83627DHGP:
// do not add temperature sensor registers that read PECI
byte sel = ReadByte(0, TEMPERATURE_SOURCE_SELECT_REG);
if ((sel & 0x07) == 0)
list.Add(new Sensor(TEMPERATURE_NAME[0], 0, null,
SensorType.Temperature, this, parameter));
if ((sel & 0x70) == 0)
list.Add(new Sensor(TEMPERATURE_NAME[1], 1, null,
SensorType.Temperature, this, parameter));
list.Add(new Sensor(TEMPERATURE_NAME[2], 2, null,
SensorType.Temperature, this, parameter));
peciTemperature[0] = (sel & 0x07) != 0;
peciTemperature[1] = (sel & 0x70) != 0;
peciTemperature[2] = false;
break;
default:
// no PECI support, add all sensors
for (int i = 0; i < TEMPERATURE_NAME.Length; i++)
list.Add(new Sensor(TEMPERATURE_NAME[i], i, null,
SensorType.Temperature, this, parameter));
// no PECI support
peciTemperature[0] = false;
peciTemperature[1] = false;
peciTemperature[2] = false;
break;
}
temperatures = list.ToArray();
switch (chip) {
case Chip.W83627DHG:
case Chip.W83627DHGP:
case Chip.W83627EHF:
voltages = new float?[10];
voltageRegister = new byte[] {
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x50, 0x51, 0x52 };
voltageBank = new byte[] { 0, 0, 0, 0, 0, 0, 0, 5, 5, 5 };
voltageGain = 0.008f;
fans = new float?[5];
break;
case Chip.W83627DHG:
case Chip.W83627DHGP:
case Chip.W83667HG:
case Chip.W83667HGB:
fanNames = new string[] { "System", "CPU", "Auxiliary",
"CPU #2", "Auxiliary #2" };
voltageGains = new float[] { 1, 1, 1, 2, 1, 1, 1, 2 };
voltages = new Sensor[3];
voltages[0] = new Sensor("CPU VCore", 0, SensorType.Voltage, this);
voltages[1] = new Sensor("+3.3V", 3, SensorType.Voltage, this);
voltages[2] = new Sensor("Battery", 7, SensorType.Voltage, this);
case Chip.W83667HGB:
voltages = new float?[9];
voltageRegister = new byte[] {
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x50, 0x51 };
voltageBank = new byte[] { 0, 0, 0, 0, 0, 0, 0, 5, 5 };
voltageGain = 0.008f;
fans = new float?[5];
break;
case Chip.W83627HF:
case Chip.W83627THF:
case Chip.W83687THF:
fanNames = new string[] { "System", "CPU", "Auxiliary" };
voltageGains = new float[] { 2, 1, 2, 1, 1, 1, 1, 2 };
voltages = new Sensor[3];
voltages[0] = new Sensor("CPU VCore", 0, SensorType.Voltage, this);
voltages[1] = new Sensor("+3.3V", 2, SensorType.Voltage, this);
voltages[2] = new Sensor("Battery", 7, SensorType.Voltage, this);
break;
default: fanNames = new string[0];
voltages = new float?[7];
voltageRegister = new byte[] {
0x20, 0x21, 0x22, 0x23, 0x24, 0x50, 0x51 };
voltageBank = new byte[] { 0, 0, 0, 0, 0, 5, 5 };
voltageGain = 0.016f;
fans = new float?[3];
break;
}
fans = new Sensor[fanNames.Length];
for (int i = 0; i < fanNames.Length; i++)
fans[i] = new Sensor(fanNames[i], i, SensorType.Fan, this);
}
public bool IsAvailable {
get { return available; }
}
}
private bool IsWinbondVendor() {
ushort vendorId =
@@ -206,52 +188,57 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return value > 0 ? target | mask : target & ~mask;
}
public override void Update() {
public Chip Chip { get { return chip; } }
public float?[] Voltages { get { return voltages; } }
public float?[] Temperatures { get { return temperatures; } }
public float?[] Fans { get { return fans; } }
foreach (Sensor sensor in voltages) {
if (sensor.Index < 7) {
public void Update() {
for (int i = 0; i < voltages.Length; i++) {
if (voltageRegister[i] != VOLTAGE_VBAT_REG) {
// two special VCore measurement modes for W83627THF
float fvalue;
if ((chip == Chip.W83627HF || chip == Chip.W83627THF ||
chip == Chip.W83687THF) && sensor.Index == 0)
chip == Chip.W83687THF) && i == 0)
{
byte vrmConfiguration = ReadByte(0, 0x18);
int value = ReadByte(0, VOLTAGE_BASE_REG);
int value = ReadByte(voltageBank[i], voltageRegister[i]);
if ((vrmConfiguration & 0x01) == 0)
sensor.Value = 0.016f * value; // VRM8 formula
fvalue = 0.016f * value; // VRM8 formula
else
sensor.Value = 0.00488f * value + 0.69f; // VRM9 formula
fvalue = 0.00488f * value + 0.69f; // VRM9 formula
} else {
int value = ReadByte(0, (byte)(VOLTAGE_BASE_REG + sensor.Index));
sensor.Value = 0.008f * voltageGains[sensor.Index] * value;
int value = ReadByte(voltageBank[i], voltageRegister[i]);
fvalue = voltageGain * value;
}
if (sensor.Value > 0)
ActivateSensor(sensor);
if (fvalue > 0)
voltages[i] = fvalue;
else
voltages[i] = null;
} else {
// Battery voltage
bool valid = (ReadByte(0, 0x5D) & 0x01) > 0;
if (valid) {
sensor.Value =
0.008f * voltageGains[sensor.Index] * ReadByte(5, 0x51);
ActivateSensor(sensor);
voltages[i] = voltageGain * ReadByte(5, VOLTAGE_VBAT_REG);
} else {
sensor.Value = null;
voltages[i] = null;
}
}
}
foreach (Sensor sensor in temperatures) {
int value = ((sbyte)ReadByte(TEMPERATURE_BANK[sensor.Index],
TEMPERATURE_REG[sensor.Index])) << 1;
if (TEMPERATURE_BANK[sensor.Index] > 0)
value |= ReadByte(TEMPERATURE_BANK[sensor.Index],
(byte)(TEMPERATURE_REG[sensor.Index] + 1)) >> 7;
for (int i = 0; i < temperatures.Length; i++) {
int value = ((sbyte)ReadByte(TEMPERATURE_BANK[i],
TEMPERATURE_REG[i])) << 1;
if (TEMPERATURE_BANK[i] > 0)
value |= ReadByte(TEMPERATURE_BANK[i],
(byte)(TEMPERATURE_REG[i] + 1)) >> 7;
float temperature = value / 2.0f;
if (temperature <= 125 && temperature >= -55) {
sensor.Value = temperature + sensor.Parameters[0].Value;
ActivateSensor(sensor);
if (temperature <= 125 && temperature >= -55 && !peciTemperature[i]) {
temperatures[i] = temperature;
} else {
sensor.Value = null;
temperatures[i] = null;
}
}
@@ -259,21 +246,18 @@ namespace OpenHardwareMonitor.Hardware.LPC {
for (int i = 0; i < FAN_BIT_REG.Length; i++)
bits = (bits << 8) | ReadByte(0, FAN_BIT_REG[i]);
ulong newBits = bits;
foreach (Sensor sensor in fans) {
int count = ReadByte(FAN_TACHO_BANK[sensor.Index],
FAN_TACHO_REG[sensor.Index]);
for (int i = 0; i < fans.Length; i++) {
int count = ReadByte(FAN_TACHO_BANK[i], FAN_TACHO_REG[i]);
// assemble fan divisor
int divisorBits = (int)(
(((bits >> FAN_DIV_BIT2[sensor.Index]) & 1) << 2) |
(((bits >> FAN_DIV_BIT1[sensor.Index]) & 1) << 1) |
((bits >> FAN_DIV_BIT0[sensor.Index]) & 1));
(((bits >> FAN_DIV_BIT2[i]) & 1) << 2) |
(((bits >> FAN_DIV_BIT1[i]) & 1) << 1) |
((bits >> FAN_DIV_BIT0[i]) & 1));
int divisor = 1 << divisorBits;
float value = (count < 0xff) ? 1.35e6f / (count * divisor) : 0;
sensor.Value = value;
if (value > 0)
ActivateSensor(sensor);
fans[i] = value;
// update fan divisor
if (count > 192 && divisorBits < 7)
@@ -281,12 +265,9 @@ namespace OpenHardwareMonitor.Hardware.LPC {
if (count < 96 && divisorBits > 0)
divisorBits--;
newBits = SetBit(newBits, FAN_DIV_BIT2[sensor.Index],
(divisorBits >> 2) & 1);
newBits = SetBit(newBits, FAN_DIV_BIT1[sensor.Index],
(divisorBits >> 1) & 1);
newBits = SetBit(newBits, FAN_DIV_BIT0[sensor.Index],
divisorBits & 1);
newBits = SetBit(newBits, FAN_DIV_BIT2[i], (divisorBits >> 2) & 1);
newBits = SetBit(newBits, FAN_DIV_BIT1[i], (divisorBits >> 1) & 1);
newBits = SetBit(newBits, FAN_DIV_BIT0[i], divisorBits & 1);
}
// write new fan divisors
@@ -300,7 +281,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
}
}
public override string GetReport() {
public string GetReport() {
StringBuilder r = new StringBuilder();
r.AppendLine("LPC " + this.GetType().Name);
@@ -337,5 +318,5 @@ namespace OpenHardwareMonitor.Hardware.LPC {
return r.ToString();
}
}
}
}
+13 -7
View File
@@ -47,7 +47,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
private string name;
private Image icon;
private LPCIO lpcGroup;
private LPCIO lpcio;
private IHardware[] superIOHardware;
public Mainboard() {
this.smbios = new SMBIOS();
@@ -68,9 +69,14 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
}
this.icon = Utilities.EmbeddedResources.GetImage("mainboard.png");
this.lpcGroup = new LPCIO(
smbios.Board != null ? smbios.Board.Manufacturer : Manufacturer.Unknown,
smbios.Board != null ? smbios.Board.Model : Model.Unknown);
this.lpcio = new LPCIO();
ISuperIO[] superIO = lpcio.SuperIO;
superIOHardware = new IHardware[superIO.Length];
for (int i = 0; i < superIO.Length; i++)
superIOHardware[i] = new SuperIOHardware(superIO[i],
smbios.Board != null ? smbios.Board.Manufacturer :
Manufacturer.Unknown, smbios.Board != null ? smbios.Board.Model :
Model.Unknown);
}
public string Name {
@@ -92,7 +98,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
r.AppendLine();
r.Append(smbios.GetReport());
r.Append(lpcGroup.GetReport());
r.Append(lpcio.GetReport());
return r.ToString();
}
@@ -102,7 +108,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
public void Close() { }
public IHardware[] SubHardware {
get { return lpcGroup.Hardware; }
get { return superIOHardware; }
}
public ISensor[] Sensors {
@@ -119,7 +125,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
}
public void Traverse(IVisitor visitor) {
foreach (IHardware hardware in lpcGroup.Hardware)
foreach (IHardware hardware in superIOHardware)
hardware.Accept(visitor);
}
}
+6
View File
@@ -5,14 +5,20 @@ using System.Text;
namespace OpenHardwareMonitor.Hardware.Mainboard {
public enum Model {
// ASUS
P5W_DH_Deluxe,
// DFI
LP_BI_P45_T2RS_Elite,
LP_DK_P55_T3eH9,
// Gigabyte
_965P_S3,
EP45_DS3R,
EP45_UD3R,
GA_MA785GMT_UD2H,
P35_DS3,
X38_DS5,
// Unknown
Unknown
+8
View File
@@ -224,16 +224,24 @@ namespace OpenHardwareMonitor.Hardware.Mainboard {
}
switch (productName) {
case "P5W DH Deluxe":
model = Model.P5W_DH_Deluxe; break;
case "LP BI P45-T2RS Elite":
model = Model.LP_BI_P45_T2RS_Elite; break;
case "LP DK P55-T3eH9":
model = Model.LP_DK_P55_T3eH9; break;
case "965P-S3":
model = Model._965P_S3; break;
case "EP45-DS3R":
model = Model.EP45_DS3R; break;
case "EP45-UD3R":
model = Model.EP45_UD3R; break;
case "GA-MA785GMT-UD2H":
model = Model.GA_MA785GMT_UD2H; break;
case "P35-DS3":
model = Model.P35_DS3; break;
case "X38-DS5":
model = Model.X38_DS5; break;
default:
model = Model.Unknown; break;
}
+465
View File
@@ -0,0 +1,465 @@
/*
Version: MPL 1.1/GPL 2.0/LGPL 2.1
The contents of this file are subject to the Mozilla Public License Version
1.1 (the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.mozilla.org/MPL/
Software distributed under the License is distributed on an "AS IS" basis,
WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
for the specific language governing rights and limitations under the License.
The Original Code is the Open Hardware Monitor code.
The Initial Developer of the Original Code is
Michael Möller <m.moeller@gmx.ch>.
Portions created by the Initial Developer are Copyright (C) 2009-2010
the Initial Developer. All Rights Reserved.
Contributor(s):
Alternatively, the contents of this file may be used under the terms of
either the GNU General Public License Version 2 or later (the "GPL"), or
the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
in which case the provisions of the GPL or the LGPL are applicable instead
of those above. If you wish to allow use of your version of this file only
under the terms of either the GPL or the LGPL, and not to allow others to
use your version of this file under the terms of the MPL, indicate your
decision by deleting the provisions above and replace them with the notice
and other provisions required by the GPL or the LGPL. If you do not delete
the provisions above, a recipient may use your version of this file under
the terms of any one of the MPL, the GPL or the LGPL.
*/
using System;
using System.Collections.Generic;
using System.Drawing;
using OpenHardwareMonitor.Hardware.LPC;
namespace OpenHardwareMonitor.Hardware.Mainboard {
public class SuperIOHardware : Hardware {
private ISuperIO superIO;
private Image icon;
protected readonly string name;
private List<Sensor> voltages = new List<Sensor>();
private List<Sensor> temperatures = new List<Sensor>();
private List<Sensor> fans = new List<Sensor>();
public SuperIOHardware(ISuperIO superIO, Manufacturer manufacturer,
Model model)
{
this.superIO = superIO;
this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
switch (superIO.Chip) {
case Chip.F71858: name = "Fintek F71858"; break;
case Chip.F71862: name = "Fintek F71862"; break;
case Chip.F71869: name = "Fintek F71869"; break;
case Chip.F71882: name = "Fintek F71882"; break;
case Chip.F71889ED: name = "Fintek F71889ED"; break;
case Chip.F71889F: name = "Fintek F71889F"; break;
case Chip.IT8712F: this.name = "ITE IT8712F"; break;
case Chip.IT8716F: this.name = "ITE IT8716F"; break;
case Chip.IT8718F: this.name = "ITE IT8718F"; break;
case Chip.IT8720F: this.name = "ITE IT8720F"; break;
case Chip.IT8726F: this.name = "ITE IT8726F"; break;
case Chip.W83627DHG: this.name = "Winbond W83627DHG"; break;
case Chip.W83627DHGP: this.name = "Winbond W83627DHG-P"; break;
case Chip.W83627EHF: this.name = "Winbond W83627EHF"; break;
case Chip.W83627HF: this.name = "Winbond W83627HF"; break;
case Chip.W83627THF: this.name = "Winbond W83627THF"; break;
case Chip.W83667HG: this.name = "Winbond W83667HG"; break;
case Chip.W83667HGB: this.name = "Winbond W83667HG-B"; break;
case Chip.W83687THF: this.name = "Winbond W83687THF"; break;
}
List<Voltage> v = new List<Voltage>();
List<Temperature> t = new List<Temperature>();
List<Fan> f = new List<Fan>();
switch (superIO.Chip) {
case Chip.IT8712F:
case Chip.IT8716F:
case Chip.IT8718F:
case Chip.IT8720F:
case Chip.IT8726F:
switch (manufacturer) {
case Manufacturer.DFI:
switch (model) {
case Model.LP_BI_P45_T2RS_Elite:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("FSB VTT", 1));
v.Add(new Voltage("+3.3V", 2));
v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
v.Add(new Voltage("+12V", 4, 30, 10, 0));
v.Add(new Voltage("NB Core", 5));
v.Add(new Voltage("VDIMM", 6));
v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
v.Add(new Voltage("VBat", 8));
t.Add(new Temperature("CPU", 0));
t.Add(new Temperature("System", 1));
t.Add(new Temperature("Chipset", 2));
f.Add(new Fan("Fan #1", 0));
f.Add(new Fan("Fan #2", 1));
f.Add(new Fan("Fan #3", 2));
break;
case Model.LP_DK_P55_T3eH9:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("VTT", 1));
v.Add(new Voltage("+3.3V", 2));
v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
v.Add(new Voltage("+12V", 4, 30, 10, 0));
v.Add(new Voltage("CPU PLL", 5));
v.Add(new Voltage("DRAM", 6));
v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
v.Add(new Voltage("VBat", 8));
t.Add(new Temperature("Chipset", 0));
t.Add(new Temperature("CPU PWM", 1));
t.Add(new Temperature("CPU", 2));
f.Add(new Fan("Fan #1", 0));
f.Add(new Fan("Fan #2", 1));
f.Add(new Fan("Fan #3", 2));
break;
default:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("VTT", 1, true));
v.Add(new Voltage("+3.3V", 2, true));
v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("DRAM", 6, true));
v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
v.Add(new Voltage("VBat", 8));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
}
break;
case Manufacturer.Gigabyte:
switch (model) {
case Model._965P_S3:
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, 0));
v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
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));
break;
case Model.EP45_DS3R:
case Model.EP45_UD3R:
case Model.X38_DS5:
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, 0));
v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
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 #2", 1));
f.Add(new Fan("Power Fan", 2));
f.Add(new Fan("System Fan #1", 3));
break;
case Model.P35_DS3:
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, 0));
v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
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", 3));
break;
case Model.GA_MA785GMT_UD2H:
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, 0));
v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
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));
f.Add(new Fan("NB Fan", 2));
break;
default:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("DRAM", 1, true));
v.Add(new Voltage("+3.3V", 2, true));
v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("Voltage #7", 6, true));
v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
v.Add(new Voltage("VBat", 8));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
}
break;
default:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("Voltage #2", 1, true));
v.Add(new Voltage("Voltage #3", 2, true));
v.Add(new Voltage("Voltage #4", 3, true));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("Voltage #7", 6, true));
v.Add(new Voltage("Voltage #8", 7, true));
v.Add(new Voltage("VBat", 8));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
}
break;
case Chip.F71858:
v.Add(new Voltage("VCC3V", 0));
v.Add(new Voltage("VSB3V", 1));
v.Add(new Voltage("Battery", 2));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
case Chip.F71862:
case Chip.F71869:
case Chip.F71882:
case Chip.F71889ED:
case Chip.F71889F:
v.Add(new Voltage("VCC3V", 0));
v.Add(new Voltage("CPU VCore", 1));
v.Add(new Voltage("Voltage #3", 2, true));
v.Add(new Voltage("Voltage #4", 3, true));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("Voltage #7", 6, true));
v.Add(new Voltage("VSB3V", 7));
v.Add(new Voltage("Battery", 8));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
case Chip.W83627EHF:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("Voltage #2", 1, true));
v.Add(new Voltage("AVCC", 2, 34, 34, 0));
v.Add(new Voltage("3VCC", 3, 34, 34, 0));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("Voltage #7", 6, true));
v.Add(new Voltage("3VSB", 7, 34, 34, 0));
v.Add(new Voltage("VBAT", 8, 34, 34, 0));
v.Add(new Voltage("Voltage #10", 9, true));
t.Add(new Temperature("CPU", 0));
t.Add(new Temperature("Auxiliary", 1));
t.Add(new Temperature("System", 2));
f.Add(new Fan("System", 0));
f.Add(new Fan("CPU", 1));
f.Add(new Fan("Auxiliary", 2));
f.Add(new Fan("CPU #2", 3));
f.Add(new Fan("Auxiliary #2", 4));
break;
case Chip.W83627DHG:
case Chip.W83627DHGP:
case Chip.W83667HG:
case Chip.W83667HGB:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("Voltage #2", 1, true));
v.Add(new Voltage("AVCC", 2, 34, 34, 0));
v.Add(new Voltage("3VCC", 3, 34, 34, 0));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("Voltage #6", 5, true));
v.Add(new Voltage("Voltage #7", 6, true));
v.Add(new Voltage("3VSB", 7, 34, 34, 0));
v.Add(new Voltage("VBAT", 8, 34, 34, 0));
t.Add(new Temperature("CPU", 0));
t.Add(new Temperature("Auxiliary", 1));
t.Add(new Temperature("System", 2));
f.Add(new Fan("System", 0));
f.Add(new Fan("CPU", 1));
f.Add(new Fan("Auxiliary", 2));
f.Add(new Fan("CPU #2", 3));
f.Add(new Fan("Auxiliary #2", 4));
break;
case Chip.W83627HF:
case Chip.W83627THF:
case Chip.W83687THF:
v.Add(new Voltage("CPU VCore", 0));
v.Add(new Voltage("Voltage #2", 1, true));
v.Add(new Voltage("Voltage #3", 2, true));
v.Add(new Voltage("AVCC", 3, 34, 51, 0));
v.Add(new Voltage("Voltage #5", 4, true));
v.Add(new Voltage("5VSB", 5, 34, 51, 0));
v.Add(new Voltage("VBAT", 6));
t.Add(new Temperature("CPU", 0));
t.Add(new Temperature("Auxiliary", 1));
t.Add(new Temperature("System", 2));
f.Add(new Fan("System", 0));
f.Add(new Fan("CPU", 1));
f.Add(new Fan("Auxiliary", 2));
break;
default:
for (int i = 0; i < superIO.Voltages.Length; i++)
v.Add(new Voltage("Voltage #" + (i + 1), i, true));
for (int i = 0; i < superIO.Temperatures.Length; i++)
t.Add(new Temperature("Temperature #" + (i + 1), i));
for (int i = 0; i < superIO.Fans.Length; i++)
f.Add(new Fan("Fan #" + (i + 1), i));
break;
}
string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
foreach (Voltage voltage in v)
if (voltage.Index < superIO.Voltages.Length) {
Sensor sensor = new Sensor(voltage.Name, voltage.Index,
voltage.Hidden, null, SensorType.Voltage, this,
new ParameterDescription[] {
new ParameterDescription("Ri [kΩ]", "Input resistance.\n" +
formula, voltage.Ri),
new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" +
formula, voltage.Rf),
new ParameterDescription("Vf [V]", "Reference voltage.\n" +
formula, voltage.Vf)
});
voltages.Add(sensor);
}
foreach (Temperature temperature in t)
if (temperature.Index < superIO.Temperatures.Length) {
Sensor sensor = new Sensor(temperature.Name, temperature.Index, null,
SensorType.Temperature, this, new ParameterDescription[] {
new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
});
temperatures.Add(sensor);
}
foreach (Fan fan in f)
if (fan.Index < superIO.Fans.Length) {
Sensor sensor = new Sensor(fan.Name, fan.Index, null, SensorType.Fan,
this, null);
fans.Add(sensor);
}
}
public override Identifier Identifier {
get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
}
public override Image Icon {
get { return icon; }
}
public override string Name {
get { return name; }
}
public override string GetReport() {
return superIO.GetReport();
}
public override void Update() {
superIO.Update();
foreach (Sensor sensor in voltages) {
float? value = superIO.Voltages[sensor.Index];
if (value.HasValue) {
sensor.Value = value + (value - sensor.Parameters[2].Value) *
sensor.Parameters[0].Value / sensor.Parameters[1].Value;
ActivateSensor(sensor);
}
}
foreach (Sensor sensor in temperatures) {
float? value = superIO.Temperatures[sensor.Index];
if (value.HasValue) {
sensor.Value = value + sensor.Parameters[0].Value;
ActivateSensor(sensor);
}
}
foreach (Sensor sensor in fans) {
float? value = superIO.Fans[sensor.Index];
if (value.HasValue) {
sensor.Value = value;
if (value.Value > 0)
ActivateSensor(sensor);
}
}
}
private class Voltage {
public readonly string Name;
public readonly int Index;
public readonly float Ri;
public readonly float Rf;
public readonly float Vf;
public readonly bool Hidden;
public Voltage(string name, int index) :
this(name, index, 0, 1, 0, false) { }
public Voltage(string name, int index, bool hidden) :
this(name, index, 0, 1, 0, hidden) { }
public Voltage(string name, int index, float ri, float rf, float vf) :
this(name, index, ri, rf, vf, false) { }
public Voltage(string name, int index, float ri, float rf, float vf,
bool hidden) {
this.Name = name;
this.Index = index;
this.Ri = ri;
this.Rf = rf;
this.Vf = vf;
this.Hidden = hidden;
}
}
private class Temperature {
public readonly string Name;
public readonly int Index;
public Temperature(string name, int index) {
this.Name = name;
this.Index = index;
}
}
private class Fan {
public readonly string Name;
public readonly int Index;
public Fan(string name, int index) {
this.Name = name;
this.Index = index;
}
}
}
}
+4 -1
View File
@@ -52,10 +52,12 @@
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="System.Data" />
<Reference Include="System.Drawing" />
<Reference Include="System.Management" />
<Reference Include="System.Web" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="GUI\CrashReportForm.cs">
@@ -94,7 +96,8 @@
<Compile Include="Hardware\IParameter.cs" />
<Compile Include="Hardware\LPC\Chip.cs" />
<Compile Include="Hardware\LPC\F718XX.cs" />
<Compile Include="Hardware\LPC\LPCHardware.cs" />
<Compile Include="Hardware\LPC\ISuperIO.cs" />
<Compile Include="Hardware\Mainboard\SuperIOHardware.cs" />
<Compile Include="Hardware\Mainboard\Mainboard.cs" />
<Compile Include="Hardware\Mainboard\MainboardGroup.cs" />
<Compile Include="Hardware\Mainboard\Model.cs" />