diff --git a/Hardware/LPC/Chip.cs b/Hardware/LPC/Chip.cs index 94e75f6..64c681b 100644 --- a/Hardware/LPC/Chip.cs +++ b/Hardware/LPC/Chip.cs @@ -19,6 +19,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { F71862 = 0x0601, F71869 = 0x0814, F71869A = 0x1007, + F71878AD = 0x1106, F71882 = 0x0541, F71889AD = 0x1005, F71889ED = 0x0909, @@ -65,6 +66,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case Chip.F71858: return "Fintek F71858"; case Chip.F71862: return "Fintek F71862"; case Chip.F71869: return "Fintek F71869"; + case Chip.F71878AD: return "Fintek F71878AD"; case Chip.F71869A: return "Fintek F71869A"; case Chip.F71882: return "Fintek F71882"; case Chip.F71889AD: return "Fintek F71889AD"; diff --git a/Hardware/LPC/F718XX.cs b/Hardware/LPC/F718XX.cs index b36806b..e737c6e 100644 --- a/Hardware/LPC/F718XX.cs +++ b/Hardware/LPC/F718XX.cs @@ -26,18 +26,27 @@ namespace OpenHardwareMonitor.Hardware.LPC { private const byte ADDRESS_REGISTER_OFFSET = 0x05; private const byte DATA_REGISTER_OFFSET = 0x06; + private const byte PWM_VALUES_OFFSET = 0x2D; + // Hardware Monitor Registers private const byte VOLTAGE_BASE_REG = 0x20; private const byte TEMPERATURE_CONFIG_REG = 0x69; private const byte TEMPERATURE_BASE_REG = 0x70; private readonly byte[] FAN_TACHOMETER_REG = new byte[] { 0xA0, 0xB0, 0xC0, 0xD0 }; + private readonly byte[] FAN_PWM_REG = + new byte[] { 0xA3, 0xB3, 0xC3, 0xD3 }; private byte ReadByte(byte register) { Ring0.WriteIoPort( (ushort)(address + ADDRESS_REGISTER_OFFSET), register); return Ring0.ReadIoPort((ushort)(address + DATA_REGISTER_OFFSET)); } + private void WriteByte(byte register, byte value) { + Ring0.WriteIoPort( + (ushort)(address + ADDRESS_REGISTER_OFFSET), register); + Ring0.WriteIoPort((ushort)(address + DATA_REGISTER_OFFSET), value); + } public byte? ReadGPIO(int index) { return null; @@ -45,7 +54,10 @@ namespace OpenHardwareMonitor.Hardware.LPC { public void WriteGPIO(int index, byte value) { } - public void SetControl(int index, byte? value) { } + public void SetControl(int index, byte? value) { + if(index < controls.Length) + WriteByte(FAN_PWM_REG[index], value ?? 128); + } public F718XX(Chip chip, ushort address) { this.address = address; @@ -54,7 +66,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { voltages = new float?[chip == Chip.F71858 ? 3 : 9]; temperatures = new float?[chip == Chip.F71808E ? 2 : 3]; fans = new float?[chip == Chip.F71882 || chip == Chip.F71858 ? 4 : 3]; - controls = new float?[0]; + controls = new float?[chip == Chip.F71878AD ? 3 : 0]; } public Chip Chip { get { return chip; } } @@ -145,7 +157,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { } break; } } - + for (int i = 0; i < fans.Length; i++) { int value = ReadByte(FAN_TACHOMETER_REG[i]) << 8; value |= ReadByte((byte)(FAN_TACHOMETER_REG[i] + 1)); @@ -155,6 +167,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { else fans[i] = null; } + for (int i = 0; i < controls.Length; i++) { + controls[i] = (100*ReadByte((byte)(PWM_VALUES_OFFSET + i)))/256.0f; + } Ring0.ReleaseIsaBusMutex(); } diff --git a/Hardware/LPC/LMSensors.cs b/Hardware/LPC/LMSensors.cs index 414fffa..34cf8a3 100755 --- a/Hardware/LPC/LMSensors.cs +++ b/Hardware/LPC/LMSensors.cs @@ -46,7 +46,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { case "f71882fg": lmChips.Add(new LMChip(Chip.F71882, path)); break; case "f71889a": - lmChips.Add(new LMChip(Chip.F71889AD, path)); break; + lmChips.Add(new LMChip(Chip.F71889AD, path)); break; + case "f71878ad": + lmChips.Add(new LMChip(Chip.F71878AD, path)); break; case "f71889ed": lmChips.Add(new LMChip(Chip.F71889ED, path)); break; case "f71889fg": diff --git a/Hardware/LPC/LPCIO.cs b/Hardware/LPC/LPCIO.cs index 8fda66a..3692aa7 100644 --- a/Hardware/LPC/LPCIO.cs +++ b/Hardware/LPC/LPCIO.cs @@ -115,6 +115,13 @@ namespace OpenHardwareMonitor.Hardware.LPC { logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } break; + case 0x11: + switch (revision) { + case 0x06: + chip = Chip.F71878AD; + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; + break; + } break; case 0x52: switch (revision) { case 0x17: @@ -282,6 +289,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case Chip.F71858: case Chip.F71862: case Chip.F71869: + case Chip.F71878AD: case Chip.F71869A: case Chip.F71882: case Chip.F71889AD: diff --git a/Hardware/Mainboard/SuperIOHardware.cs b/Hardware/Mainboard/SuperIOHardware.cs index 8d10b28..01d1db0 100644 --- a/Hardware/Mainboard/SuperIOHardware.cs +++ b/Hardware/Mainboard/SuperIOHardware.cs @@ -212,7 +212,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { case Chip.F71889ED: case Chip.F71889F: case Chip.F71808E: - GetFintekConfiguration(superIO, manufacturer, model, v, t, f); + GetFintekConfiguration(superIO, manufacturer, model, v, t, f, c); break; case Chip.W83627EHF: @@ -906,7 +906,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { private static void GetFintekConfiguration(ISuperIO superIO, Manufacturer manufacturer, Model model, - IList v, IList t, IList f) + IList v, IList t, IList f, IList c) { switch (manufacturer) { case Manufacturer.EVGA: @@ -960,6 +960,9 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { 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)); + for (int i = 0; i < superIO.Controls.Length; i++) + c.Add(new Ctrl("Fan Control #" + (i + 1), i)); + break; } }