diff --git a/.gitignore b/.gitignore index 680f7ae..57d5214 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ *.user *.suo /Bin -/Obj \ No newline at end of file +/Obj +.vs/ diff --git a/Hardware/CPU/AMD10CPU.cs b/Hardware/CPU/AMD10CPU.cs index fb0378a..7d919db 100644 --- a/Hardware/CPU/AMD10CPU.cs +++ b/Hardware/CPU/AMD10CPU.cs @@ -38,12 +38,16 @@ namespace OpenHardwareMonitor.Hardware.CPU { private const ushort FAMILY_15H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1603; private const ushort FAMILY_15H_MODEL_10_MISC_CONTROL_DEVICE_ID = 0x1403; private const ushort FAMILY_15H_MODEL_30_MISC_CONTROL_DEVICE_ID = 0x141D; + private const ushort FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID = 0x1573; private const ushort FAMILY_16H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1533; private const ushort FAMILY_16H_MODEL_30_MISC_CONTROL_DEVICE_ID = 0x1583; + private const ushort FAMILY_17H_MODEL_00_MISC_CONTROL_DEVICE_ID = 0x1577; private const uint REPORTED_TEMPERATURE_CONTROL_REGISTER = 0xA4; private const uint CLOCK_POWER_TIMING_CONTROL_0_REGISTER = 0xD4; + private const uint F15H_M60H_REPORTED_TEMP_CTRL_OFFSET = 0xD8200CA4; + private readonly uint miscellaneousControlAddress; private readonly ushort miscellaneousControlDeviceId; @@ -79,6 +83,8 @@ namespace OpenHardwareMonitor.Hardware.CPU { FAMILY_15H_MODEL_10_MISC_CONTROL_DEVICE_ID; break; case 0x30: miscellaneousControlDeviceId = FAMILY_15H_MODEL_30_MISC_CONTROL_DEVICE_ID; break; + case 0x60: miscellaneousControlDeviceId = + FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID; break; default: miscellaneousControlDeviceId = 0; break; } break; case 0x16: @@ -89,6 +95,8 @@ namespace OpenHardwareMonitor.Hardware.CPU { FAMILY_16H_MODEL_30_MISC_CONTROL_DEVICE_ID; break; default: miscellaneousControlDeviceId = 0; break; } break; + case 0x17: miscellaneousControlDeviceId = + FAMILY_17H_MODEL_00_MISC_CONTROL_DEVICE_ID; break; default: miscellaneousControlDeviceId = 0; break; } @@ -304,6 +312,15 @@ namespace OpenHardwareMonitor.Hardware.CPU { if (temperatureStream == null) { if (miscellaneousControlAddress != Ring0.InvalidPciAddress) { uint value; + if (miscellaneousControlAddress == FAMILY_15H_MODEL_60_MISC_CONTROL_DEVICE_ID) { + value = F15H_M60H_REPORTED_TEMP_CTRL_OFFSET; + Ring0.WritePciConfig(Ring0.GetPciAddress(0, 0, 0), 0xB8, value); + Ring0.ReadPciConfig(Ring0.GetPciAddress(0, 0, 0), 0xBC, out value); + coreTemperature.Value = ((value >> 21) & 0x7FF) * 0.125f + + coreTemperature.Parameters[0].Value; + ActivateSensor(coreTemperature); + return; + } if (Ring0.ReadPciConfig(miscellaneousControlAddress, REPORTED_TEMPERATURE_CONTROL_REGISTER, out value)) { if (family == 0x15 && (value & 0x30000) == 0x30000) { diff --git a/Hardware/CPU/CPUGroup.cs b/Hardware/CPU/CPUGroup.cs index 7429550..98829d2 100644 --- a/Hardware/CPU/CPUGroup.cs +++ b/Hardware/CPU/CPUGroup.cs @@ -102,6 +102,7 @@ namespace OpenHardwareMonitor.Hardware.CPU { case 0x14: case 0x15: case 0x16: + case 0x17: hardware.Add(new AMD10CPU(index, coreThreads, settings)); break; default: diff --git a/Hardware/CPU/IntelCPU.cs b/Hardware/CPU/IntelCPU.cs index cddafc4..8f3eb3b 100644 --- a/Hardware/CPU/IntelCPU.cs +++ b/Hardware/CPU/IntelCPU.cs @@ -28,7 +28,8 @@ namespace OpenHardwareMonitor.Hardware.CPU { Silvermont, Skylake, Airmont, - KabyLake + KabyLake, + ApolloLake } private readonly Sensor[] coreTemperatures; @@ -170,6 +171,7 @@ namespace OpenHardwareMonitor.Hardware.CPU { break; case 0x4E: case 0x5E: // Intel Core i5, i7 6xxxx LGA1151 (14nm) + case 0x55: // Intel Core X i7, i9 7xxx LGA2066 (14nm) microarchitecture = Microarchitecture.Skylake; tjMax = GetTjMaxFromMSR(); break; @@ -182,6 +184,10 @@ namespace OpenHardwareMonitor.Hardware.CPU { microarchitecture = Microarchitecture.KabyLake; tjMax = GetTjMaxFromMSR(); break; + case 0x5C: // Intel ApolloLake + microarchitecture = Microarchitecture.ApolloLake; + tjMax = GetTjMaxFromMSR(); + break; default: microarchitecture = Microarchitecture.Unknown; tjMax = Floats(100); @@ -230,6 +236,7 @@ namespace OpenHardwareMonitor.Hardware.CPU { case Microarchitecture.Silvermont: case Microarchitecture.Skylake: case Microarchitecture.Airmont: + case Microarchitecture.ApolloLake: case Microarchitecture.KabyLake: { uint eax, edx; if (Ring0.Rdmsr(MSR_PLATFORM_INFO, out eax, out edx)) { @@ -294,7 +301,8 @@ namespace OpenHardwareMonitor.Hardware.CPU { microarchitecture == Microarchitecture.Skylake || microarchitecture == Microarchitecture.Silvermont || microarchitecture == Microarchitecture.Airmont || - microarchitecture == Microarchitecture.KabyLake) + microarchitecture == Microarchitecture.KabyLake || + microarchitecture == Microarchitecture.ApolloLake) { powerSensors = new Sensor[energyStatusMSRs.Length]; lastEnergyTime = new DateTime[energyStatusMSRs.Length]; @@ -412,6 +420,7 @@ namespace OpenHardwareMonitor.Hardware.CPU { case Microarchitecture.Broadwell: case Microarchitecture.Silvermont: case Microarchitecture.Skylake: + case Microarchitecture.ApolloLake: case Microarchitecture.KabyLake: { uint multiplier = (eax >> 8) & 0xff; coreClocks[i].Value = (float)(multiplier * newBusClock); diff --git a/Hardware/LPC/Chip.cs b/Hardware/LPC/Chip.cs index 94e75f6..4fe8cfe 100644 --- a/Hardware/LPC/Chip.cs +++ b/Hardware/LPC/Chip.cs @@ -27,6 +27,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { IT8620E = 0x8620, IT8628E = 0x8628, + IT8686E = 0x8686, IT8705F = 0x8705, IT8712F = 0x8712, IT8716F = 0x8716, @@ -43,6 +44,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { NCT610X = 0xC452, NCT6779D = 0xC560, NCT6791D = 0xC803, + NCT6793D = 0xD121, + NCT6795D = 0xD352, + NCT6796D = 0xD423, W83627DHG = 0xA020, W83627DHGP = 0xB070, @@ -74,6 +78,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case Chip.IT8620E: return "ITE IT8620E"; case Chip.IT8628E: return "ITE IT8628E"; + case Chip.IT8686E: return "ITE IT8686E"; case Chip.IT8705F: return "ITE IT8705F"; case Chip.IT8712F: return "ITE IT8712F"; case Chip.IT8716F: return "ITE IT8716F"; @@ -91,6 +96,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { case Chip.NCT6776F: return "Nuvoton NCT6776F"; case Chip.NCT6779D: return "Nuvoton NCT6779D"; case Chip.NCT6791D: return "Nuvoton NCT6791D"; + case Chip.NCT6793D: return "Nuvoton NCT6793D"; + case Chip.NCT6795D: return "Nuvoton NCT6795D"; + case Chip.NCT6796D: return "Nuvoton NCT6796D"; case Chip.W83627DHG: return "Winbond W83627DHG"; case Chip.W83627DHGP: return "Winbond W83627DHG-P"; diff --git a/Hardware/LPC/IT87XX.cs b/Hardware/LPC/IT87XX.cs index 1ff5808..d7ccffc 100644 --- a/Hardware/LPC/IT87XX.cs +++ b/Hardware/LPC/IT87XX.cs @@ -138,15 +138,26 @@ namespace OpenHardwareMonitor.Hardware.LPC { if (!valid) return; - voltages = new float?[9]; - temperatures = new float?[3]; - fans = new float?[chip == Chip.IT8705F ? 3 : 5]; - controls = new float?[3]; + // IT8686E has more sensors + if(chip == Chip.IT8686E) + { + voltages = new float?[10]; + temperatures = new float?[5]; + fans = new float?[5]; + controls = new float?[3]; + } + else + { + voltages = new float?[9]; + temperatures = new float?[3]; + fans = new float?[chip == Chip.IT8705F ? 3 : 5]; + controls = new float?[3]; + } - // IT8620E, IT8628E, IT8721F, IT8728F and IT8772E use a 12mV resultion + // IT8620E, IT8628E, IT8721F, IT8728F, IT8772E and IT8686E use a 12mV resultion // ADC, all others 16mV if (chip == Chip.IT8620E || chip == Chip.IT8628E || chip == Chip.IT8721F - || chip == Chip.IT8728F || chip == Chip.IT8771E || chip == Chip.IT8772E) + || chip == Chip.IT8728F || chip == Chip.IT8771E || chip == Chip.IT8772E || chip == Chip.IT8686E) { voltageGain = 0.012f; } else { diff --git a/Hardware/LPC/LMSensors.cs b/Hardware/LPC/LMSensors.cs index 414fffa..677a809 100755 --- a/Hardware/LPC/LMSensors.cs +++ b/Hardware/LPC/LMSensors.cs @@ -73,6 +73,12 @@ namespace OpenHardwareMonitor.Hardware.LPC { lmChips.Add(new LMChip(Chip.NCT6779D, path)); break; case "nct6791": lmChips.Add(new LMChip(Chip.NCT6791D, path)); break; + case "nct6793": + lmChips.Add(new LMChip(Chip.NCT6793D, path)); break; + case "nct6795": + lmChips.Add(new LMChip(Chip.NCT6795D, path)); break; + case "nct6796": + lmChips.Add(new LMChip(Chip.NCT6796D, path)); break; case "w83627ehf": lmChips.Add(new LMChip(Chip.W83627EHF, path)); break; diff --git a/Hardware/LPC/LPCIO.cs b/Hardware/LPC/LPCIO.cs index 8fda66a..65b71b6 100644 --- a/Hardware/LPC/LPCIO.cs +++ b/Hardware/LPC/LPCIO.cs @@ -209,6 +209,27 @@ namespace OpenHardwareMonitor.Hardware.LPC { logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } break; + case 0xD4: + switch (revision) { + case 0x23: + chip = Chip.NCT6796D; + logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; + break; + } break; + case 0xD1: + switch (revision) { + case 0x21: + chip = Chip.NCT6793D; + logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; + break; + } break; + case 0xD3: + switch (revision) { + case 0x52: + chip = Chip.NCT6795D; + logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; + break; + } break; } if (chip == Chip.Unknown) { if (id != 0 && id != 0xff) { @@ -225,9 +246,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { ushort verify = port.ReadWord(BASE_ADDRESS_REGISTER); ushort vendorID = port.ReadWord(FINTEK_VENDOR_ID_REGISTER); - - // disable the hardware monitor i/o space lock on NCT6791D chips - if (address == verify && chip == Chip.NCT6791D) { + + // disable the hardware monitor i/o space lock on NCT679*D chips + if (address == verify && (chip == Chip.NCT6791D || chip == Chip.NCT6796D || chip == Chip.NCT6793D || chip == Chip.NCT6795D)) { port.NuvotonDisableIOSpaceLock(); } @@ -277,6 +298,9 @@ namespace OpenHardwareMonitor.Hardware.LPC { case Chip.NCT6776F: case Chip.NCT6779D: case Chip.NCT6791D: + case Chip.NCT6796D: + case Chip.NCT6793D: + case Chip.NCT6795D: superIOs.Add(new NCT677X(chip, revision, address, port)); break; case Chip.F71858: @@ -333,6 +357,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { switch (chipID) { case 0x8620: chip = Chip.IT8620E; break; case 0x8628: chip = Chip.IT8628E; break; + case 0x8686: chip = Chip.IT8686E; break; case 0x8705: chip = Chip.IT8705F; break; case 0x8712: chip = Chip.IT8712F; break; case 0x8716: chip = Chip.IT8716F; break; diff --git a/Hardware/LPC/NCT677X.cs b/Hardware/LPC/NCT677X.cs index 48d8d0e..3339681 100644 --- a/Hardware/LPC/NCT677X.cs +++ b/Hardware/LPC/NCT677X.cs @@ -271,7 +271,10 @@ namespace OpenHardwareMonitor.Hardware.LPC { break; case Chip.NCT6779D: + case Chip.NCT6795D: + case Chip.NCT6793D: case Chip.NCT6791D: + case Chip.NCT6796D: if (chip == Chip.NCT6779D) { fans = new float?[5]; controls = new float?[5]; @@ -414,7 +417,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { public float?[] Controls { get { return controls; } } private void DisableIOSpaceLock() { - if (chip != Chip.NCT6791D) + if (chip != Chip.NCT6791D && chip != Chip.NCT6796D && chip != Chip.NCT6793D && chip != Chip.NCT6795D) return; // the lock is disabled already if the vendor ID can be read diff --git a/Hardware/Mainboard/Identification.cs b/Hardware/Mainboard/Identification.cs index 6ed16c5..99177d2 100644 --- a/Hardware/Mainboard/Identification.cs +++ b/Hardware/Mainboard/Identification.cs @@ -93,6 +93,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { case "P6X58D-E": return Model.P6X58D_E; case "P8P67": + case "P8P67 REV 3.1": return Model.P8P67; case "P8P67 EVO": return Model.P8P67_EVO; @@ -180,6 +181,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { return Model.X38_DS5; case "X58A-UD3R": return Model.X58A_UD3R; + case "X79-UD3": + return Model.X79_UD3; case "Z68A-D3H-B3": return Model.Z68A_D3H_B3; case "Z68AP-D3": @@ -190,6 +193,8 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { return Model.Z68X_UD7_B3; case "FH67": return Model.FH67; + case "AX370-Gaming K7": + return Model.AX370_K7; case "Base Board Product Name": case "To be filled by O.E.M.": return Model.Unknown; diff --git a/Hardware/Mainboard/Model.cs b/Hardware/Mainboard/Model.cs index 4db709f..109efa0 100644 --- a/Hardware/Mainboard/Model.cs +++ b/Hardware/Mainboard/Model.cs @@ -75,10 +75,12 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { P8Z68_V_PRO, X38_DS5, X58A_UD3R, + X79_UD3, Z68A_D3H_B3, Z68AP_D3, Z68X_UD3H_B3, Z68X_UD7_B3, + AX370_K7, // Shuttle FH67, diff --git a/Hardware/Mainboard/SuperIOHardware.cs b/Hardware/Mainboard/SuperIOHardware.cs index 8d10b28..dc1736a 100644 --- a/Hardware/Mainboard/SuperIOHardware.cs +++ b/Hardware/Mainboard/SuperIOHardware.cs @@ -182,6 +182,7 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { case Chip.IT8718F: case Chip.IT8720F: case Chip.IT8726F: + case Chip.IT8686E: GetITEConfigurationsA(superIO, manufacturer, model, v, t, f, c, ref readFan, ref postUpdate, ref mutex); break; @@ -266,6 +267,9 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { break; case Chip.NCT6779D: case Chip.NCT6791D: + case Chip.NCT6796D: + case Chip.NCT6793D: + case Chip.NCT6795D: GetNuvotonConfigurationD(superIO, manufacturer, model, v, t, f, c); break; default: @@ -602,6 +606,26 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { f.Add(new Fan("Power Fan", 2)); f.Add(new Fan("System Fan #1", 3)); break; + case Model.AX370_K7: // IT8686E + // Note: v3.3, v12, v5, and AVCC3 might be slightly off. + v.Add(new Voltage("CPU VCore", 0)); + v.Add(new Voltage("+3.3V", 1, 0.65f, 1)); + v.Add(new Voltage("+12V", 2, 5, 1)); + v.Add(new Voltage("+5V", 3, 1.5f, 1)); + v.Add(new Voltage("VSOC", 4)); + v.Add(new Voltage("VDDP", 5)); + v.Add(new Voltage("VDRAM", 6)); + v.Add(new Voltage("3VSB", 7, 10, 10)); + v.Add(new Voltage("VBAT", 8, 10, 10)); + v.Add(new Voltage("AVCC3", 9, 7.53f, 1)); + t.Add(new Temperature("System", 0)); + t.Add(new Temperature("Chipset", 1)); + t.Add(new Temperature("CPU", 2)); + t.Add(new Temperature("PCIEX16", 3)); + t.Add(new Temperature("VRM MOS", 4)); + for (int i = 0; i < superIO.Fans.Length; i++) + f.Add(new Fan("Fan #" + (i + 1), i)); + break; default: v.Add(new Voltage("CPU VCore", 0)); v.Add(new Voltage("DRAM", 1, true)); @@ -831,6 +855,24 @@ namespace OpenHardwareMonitor.Hardware.Mainboard { f.Add(new Fan("System Fan #2", 3)); f.Add(new Fan("System Fan #3", 4)); break; + case Model.X79_UD3: // IT8728F + v.Add(new Voltage("VTT", 0)); + v.Add(new Voltage("DIMM CH A/B", 1)); + v.Add(new Voltage("+12V", 2, 10, 2)); + v.Add(new Voltage("+5V", 3, 15, 10)); + v.Add(new Voltage("VIN4", 4)); + v.Add(new Voltage("VCore", 5)); + v.Add(new Voltage("DIMM CH C/D", 6)); + v.Add(new Voltage("+3V Standby", 7, 1, 1)); + v.Add(new Voltage("VBat", 8, 1, 1)); + t.Add(new Temperature("System", 0)); + t.Add(new Temperature("CPU", 1)); + t.Add(new Temperature("Northbridge", 2)); + 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("System Fan #3", 3)); + break; default: v.Add(new Voltage("Voltage #1", 0, true)); v.Add(new Voltage("Voltage #2", 1, true)); diff --git a/Properties/AssemblyLibInfo.cs b/Properties/AssemblyLibInfo.cs index 376e4cf..aaec715 100644 --- a/Properties/AssemblyLibInfo.cs +++ b/Properties/AssemblyLibInfo.cs @@ -10,6 +10,7 @@ using System; using System.Reflection; +using System.Runtime.CompilerServices; using System.Runtime.InteropServices; [assembly: AssemblyTitle("Open Hardware Monitor Library")] @@ -24,3 +25,4 @@ using System.Runtime.InteropServices; [assembly: ComVisible(false)] [assembly: CLSCompliant(true)] +