From 18232fd182742cbbfd72e69f53baed5ca64c935c Mon Sep 17 00:00:00 2001 From: holgerpieta <38852807+holgerpieta@users.noreply.github.com> Date: Mon, 7 Dec 2020 11:47:44 +0100 Subject: [PATCH] Fixed temperatures for NCT6796D... and added ASUS TUF GAMING B550M-PLUS (WI-FI) (#339) Thanks to @holgerpieta --- .../Hardware/Motherboard/Identification.cs | 2 + .../Hardware/Motherboard/Lpc/Nct677X.cs | 248 ++++++++++++++---- .../Hardware/Motherboard/Model.cs | 1 + .../Hardware/Motherboard/SuperIOHardware.cs | 55 +++- 4 files changed, 258 insertions(+), 48 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs index 35ccadc..c575bd7 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs @@ -299,6 +299,8 @@ namespace LibreHardwareMonitor.Hardware.Motherboard return Model.X470_AORUS_GAMING_7_WIFI; case var _ when name.Equals("X570 AORUS MASTER", StringComparison.OrdinalIgnoreCase): return Model.X570_AORUS_MASTER; + case var _ when name.Equals("TUF GAMING B550M-PLUS (WI-FI)", StringComparison.OrdinalIgnoreCase): + return Model.TUF_GAMING_B550M_PLUS_WIFI; case var _ when name.Equals("Base Board Product Name", StringComparison.OrdinalIgnoreCase): case var _ when name.Equals("To be filled by O.E.M.", StringComparison.OrdinalIgnoreCase): return Model.Unknown; diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs index dfb21a7..6f73098 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs @@ -31,7 +31,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc private readonly ushort[] _temperatureHalfRegister; private readonly ushort[] _temperatureRegister; private readonly ushort[] _temperatureSourceRegister; - private readonly byte[] _temperaturesSource; + private readonly Enum[] _temperaturesSource; private readonly ushort _vBatMonitorControlRegister; private readonly ushort[] _voltageRegisters; private readonly ushort _voltageVBatRegister; @@ -95,7 +95,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc // min value RPM value with 16-bit fan counter _minFanRpm = (int)(1.35e6 / 0xFFFF); - _temperaturesSource = new[] { (byte)SourceNct6771F.PECI_0, (byte)SourceNct6771F.CPUTIN, (byte)SourceNct6771F.AUXTIN, (byte)SourceNct6771F.SYSTIN }; + _temperaturesSource = new Enum[] { SourceNct6771F.PECI_0, SourceNct6771F.CPUTIN, SourceNct6771F.AUXTIN, SourceNct6771F.SYSTIN }; } else { @@ -104,7 +104,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc // min value RPM value with 13-bit fan counter _minFanRpm = (int)(1.35e6 / 0x1FFF); - _temperaturesSource = new[] { (byte)SourceNct6776F.PECI_0, (byte)SourceNct6776F.CPUTIN, (byte)SourceNct6776F.AUXTIN, (byte)SourceNct6776F.SYSTIN }; + _temperaturesSource = new Enum[] { SourceNct6776F.PECI_0, SourceNct6776F.CPUTIN, SourceNct6776F.AUXTIN, SourceNct6776F.SYSTIN }; } _fanRpmRegister = new ushort[5]; @@ -171,23 +171,86 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc Voltages = new float?[15]; _voltageRegisters = new ushort[] { 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x48A, 0x48B, 0x48C, 0x48D, 0x48E }; _voltageVBatRegister = 0x488; - Temperatures = new float?[7]; - _temperaturesSource = new[] + switch (chip) { - (byte)SourceNct67Xxd.PECI_0, - (byte)SourceNct67Xxd.CPUTIN, - (byte)SourceNct67Xxd.SYSTIN, - (byte)SourceNct67Xxd.AUXTIN0, - (byte)SourceNct67Xxd.AUXTIN1, - (byte)SourceNct67Xxd.AUXTIN2, - (byte)SourceNct67Xxd.AUXTIN3 - }; + case Chip.NCT6796D: + case Chip.NCT6796DR: + case Chip.NCT6797D: + case Chip.NCT6798D: + { + Temperatures = new float?[24]; + _temperaturesSource = new Enum[] + { + SourceNct67Xxd.PECI_0, + SourceNct67Xxd.CPUTIN, + SourceNct67Xxd.SYSTIN, + SourceNct67Xxd.AUXTIN0, + SourceNct67Xxd.AUXTIN1, + SourceNct67Xxd.AUXTIN2, + SourceNct67Xxd.AUXTIN3, + SourceNct67Xxd.AUXTIN4, + SourceNct67Xxd.SMBUSMASTER0, + SourceNct67Xxd.SMBUSMASTER1, + SourceNct67Xxd.PECI_1, + SourceNct67Xxd.PCH_CHIP_CPU_MAX_TEMP, + SourceNct67Xxd.PCH_CHIP_TEMP, + SourceNct67Xxd.PCH_CPU_TEMP, + SourceNct67Xxd.PCH_MCH_TEMP, + SourceNct67Xxd.AGENT0_DIMM0, + SourceNct67Xxd.AGENT0_DIMM1, + SourceNct67Xxd.AGENT1_DIMM0, + SourceNct67Xxd.AGENT1_DIMM1, + SourceNct67Xxd.BYTE_TEMP0, + SourceNct67Xxd.BYTE_TEMP1, + SourceNct67Xxd.PECI_0_CAL, + SourceNct67Xxd.PECI_1_CAL, + SourceNct67Xxd.VIRTUAL_TEMP + }; - _temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x079, 0x07B, 0x150 }; - _temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x151 }; - _temperatureHalfBit = new[] { -1, 7, 7, 7, 7, 7, 7 }; - _temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x800, 0x900, 0x622 }; - _alternateTemperatureRegister = new ushort?[] { null, 0x491, 0x490, 0x492, 0x493, 0x494, 0x495 }; + _temperatureRegister = new ushort[] + { + 0x073, 0x075, 0x077, 0x079, 0x07B, 0x07D, 0x4A0, 0x027, 0x150, 0x670, 0x672, 0x674, 0x676, 0x678, 0x67A + }; + _temperatureHalfRegister = new ushort[] + { + 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x07E, 0x49E, 0, 0x151, 0, 0, 0, 0, 0, 0 + }; + _temperatureHalfBit = new[] + { + 7, 7, 7, 7, 7, 7, 6, -1, 7, -1, -1, -1, -1, -1, -1 + }; + _temperatureSourceRegister = new ushort[] + { + 0x100, 0x200, 0x300, 0x800, 0x900, 0xA00, 0xB00, 0x621, 0x622, 0xC26, 0xC27, 0xC28, 0xC29, 0xC2A, 0xC2B + }; + _alternateTemperatureRegister = new ushort?[] + { + null, 0x491, 0x490, 0x492, 0x493, 0x494, 0x495, null, null, null, null, 0x400, 0x401, 0x402, 0x404, null, null, null, null, null, null, null, null, null + }; + break; + } + default: + { + Temperatures = new float?[7]; + _temperaturesSource = new Enum[] + { + SourceNct67Xxd.PECI_0, + SourceNct67Xxd.CPUTIN, + SourceNct67Xxd.SYSTIN, + SourceNct67Xxd.AUXTIN0, + SourceNct67Xxd.AUXTIN1, + SourceNct67Xxd.AUXTIN2, + SourceNct67Xxd.AUXTIN3 + }; + + _temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x079, 0x07B, 0x150 }; + _temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x151 }; + _temperatureHalfBit = new[] { -1, 7, 7, 7, 7, 7, 7 }; + _temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x800, 0x900, 0x622 }; + _alternateTemperatureRegister = new ushort?[] { null, 0x491, 0x490, 0x492, 0x493, 0x494, 0x495 }; + break; + } + } break; } case Chip.NCT610XD: @@ -206,7 +269,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc _voltageRegisters = new ushort[] { 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x307, 0x308, 0x309 }; _voltageVBatRegister = 0x308; Temperatures = new float?[4]; - _temperaturesSource = new[] { (byte)SourceNct610X.PECI_0, (byte)SourceNct610X.SYSTIN, (byte)SourceNct610X.CPUTIN, (byte)SourceNct610X.AUXTIN }; + _temperaturesSource = new Enum[] { SourceNct610X.PECI_0, SourceNct610X.SYSTIN, SourceNct610X.CPUTIN, SourceNct610X.AUXTIN }; _temperatureRegister = new ushort[] { 0x027, 0x018, 0x019, 0x01A }; _temperatureHalfRegister = new ushort[] { 0, 0x01B, 0x11B, 0x21B }; @@ -402,52 +465,128 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc } } - int temperatureSourceMask = 0; - for (int i = _temperatureRegister.Length - 1; i >= 0; i--) + System.Diagnostics.Debug.WriteLine("Updating temperatures."); + long temperatureSourceMask = 0; + for (int i = 0; i < _temperatureRegister.Length ; i++) { - if (Chip != Chip.NCT6687D) + switch (Chip) { - int value = (sbyte)ReadByte(_temperatureRegister[i]) << 1; - if (_temperatureHalfBit[i] > 0) + case Chip.NCT6687D: { - value |= (ReadByte(_temperatureHalfRegister[i]) >> _temperatureHalfBit[i]) & 0x1; + int value = (sbyte)ReadByte(_temperatureRegister[i]); + int half = (ReadByte((ushort)(_temperatureRegister[i] + 1)) >> 7) & 0x1; + float temperature = value + (0.5f * half); + Temperatures[i] = temperature; + break; } - - byte source = ReadByte(_temperatureSourceRegister[i]); - temperatureSourceMask |= 1 << source; - - float? temperature = 0.5f * value; - if (temperature > 125 || temperature < -55) - temperature = null; - - for (int j = 0; j < Temperatures.Length; j++) + case Chip.NCT6796D: + case Chip.NCT6796DR: + case Chip.NCT6797D: + case Chip.NCT6798D: { - if (_temperaturesSource[j] == source) - Temperatures[j] = temperature; + if (_temperatureRegister[i] == 0) + { + System.Diagnostics.Debug.WriteLine("Temperature register {0} skipped, address 0.", i); + continue; + } + + int value = (sbyte)ReadByte(_temperatureRegister[i]) << 1; + System.Diagnostics.Debug.WriteLine("Temperature register {0} at 0x{1:X3} value (integer): {2}/2", i, _temperatureRegister[i], value); + if (_temperatureHalfBit[i] > 0) + { + value |= (ReadByte(_temperatureHalfRegister[i]) >> _temperatureHalfBit[i]) & 0x1; + System.Diagnostics.Debug.WriteLine("Temperature register {0} value updated from 0x{1:X3} (fractional): {2}/2", i, _temperatureHalfRegister[i], value); + } + + SourceNct67Xxd source; + if (_temperatureSourceRegister[i] > 0) + { + source = (SourceNct67Xxd)(ReadByte(_temperatureSourceRegister[i]) & 0x1F); + System.Diagnostics.Debug.WriteLine("Temperature register {0} source at 0x{1:X3}: {2:G} ({2:D})", i, _temperatureSourceRegister[i], source); + } + else + { + source = (SourceNct67Xxd)_temperaturesSource[i]; + System.Diagnostics.Debug.WriteLine("Temperature register {0} source register is 0, source set to: {1:G} ({1:D})", i, source); + } + + // Skip reading when already filled, because later values are without fractional + if ((temperatureSourceMask & (1L << (byte)source)) > 0) + { + System.Diagnostics.Debug.WriteLine("Temperature register {0} discarded, because source seen before.", i); + continue; + } + + float? temperature = 0.5f * value; + System.Diagnostics.Debug.WriteLine("Temperature register {0} final temperature: {1}.", i, temperature); + if (temperature > 125 || temperature < -55) + { + temperature = null; + System.Diagnostics.Debug.WriteLine("Temperature register {0} discarded: Out of range.", i); + } + else{ + temperatureSourceMask |= 1L << (byte)source; + System.Diagnostics.Debug.WriteLine("Temperature register {0} accepted.", i); + } + + for (int j = 0; j < Temperatures.Length; j++) + { + if ((SourceNct67Xxd)_temperaturesSource[j] == source) + { + Temperatures[j] = temperature; + System.Diagnostics.Debug.WriteLine("Temperature register {0}, value from source {1:G} ({1:D}), written at position {2}.", i, _temperaturesSource[j], j); + } + } + break; + } + default: + { + int value = (sbyte)ReadByte(_temperatureRegister[i]) << 1; + if (_temperatureHalfBit[i] > 0) + { + value |= (ReadByte(_temperatureHalfRegister[i]) >> _temperatureHalfBit[i]) & 0x1; + } + + SourceNct67Xxd source = (SourceNct67Xxd)ReadByte(_temperatureSourceRegister[i]); + temperatureSourceMask |= 1L << (byte)source; + + float? temperature = 0.5f * value; + if (temperature > 125 || temperature < -55) + temperature = null; + + for (int j = 0; j < Temperatures.Length; j++) + { + if ((SourceNct67Xxd)_temperaturesSource[j] == source) + Temperatures[j] = temperature; + } + break; } - } - else - { - int value = (sbyte)ReadByte(_temperatureRegister[i]); - int half = (ReadByte((ushort)(_temperatureRegister[i] + 1)) >> 7) & 0x1; - float temperature = value + (0.5f * half); - Temperatures[i] = temperature; } } for (int i = 0; i < _alternateTemperatureRegister.Length; i++) { if (!_alternateTemperatureRegister[i].HasValue) + { + System.Diagnostics.Debug.WriteLine("Alternate temperature register for temperature {0}, {1:G} ({1:D}), skipped, because address is null.", i, _temperaturesSource[i]); continue; + } - if ((temperatureSourceMask & (1 << _temperaturesSource[i])) > 0) + if ((temperatureSourceMask & (1L << (byte)(SourceNct67Xxd)_temperaturesSource[i])) > 0) + { + System.Diagnostics.Debug.WriteLine("Alternate temperature register for temperature {0}, {1:G} ({1:D}), at 0x{2:X3} skipped, because value already set.", i, _temperaturesSource[i], _alternateTemperatureRegister[i].Value); continue; + } float? temperature = (sbyte)ReadByte(_alternateTemperatureRegister[i].Value); + System.Diagnostics.Debug.WriteLine("Alternate temperature register for temperature {0}, {1:G} ({1:D}), at 0x{2:X3} final temperature: {3}.", i, _temperaturesSource[i], _alternateTemperatureRegister[i].Value, temperature); - if (temperature > 125 || temperature < -55) + if (temperature > 125 || temperature <= 0) + { temperature = null; + System.Diagnostics.Debug.WriteLine("Alternate Temperature register for temperature {0}, {1:G} ({1:D}), discarded: Out of range.", i, _temperaturesSource[i]); + } Temperatures[i] = temperature; } @@ -825,7 +964,24 @@ namespace LibreHardwareMonitor.Hardware.Motherboard.Lpc AUXTIN1 = 4, AUXTIN2 = 5, AUXTIN3 = 6, - PECI_0 = 16 + AUXTIN4 = 7, + SMBUSMASTER0 = 8, + SMBUSMASTER1 = 9, + PECI_0 = 16, + PECI_1 = 17, + PCH_CHIP_CPU_MAX_TEMP = 18, + PCH_CHIP_TEMP = 19, + PCH_CPU_TEMP = 20, + PCH_MCH_TEMP = 21, + AGENT0_DIMM0 = 22, + AGENT0_DIMM1 = 23, + AGENT1_DIMM0 = 24, + AGENT1_DIMM1 = 25, + BYTE_TEMP0 = 26, + BYTE_TEMP1 = 27, + PECI_0_CAL = 28, + PECI_1_CAL = 29, + VIRTUAL_TEMP = 31 } [SuppressMessage("ReSharper", "InconsistentNaming")] diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs index 3e9f720..5f7c3bf 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs @@ -54,6 +54,7 @@ namespace LibreHardwareMonitor.Hardware.Motherboard ROG_ZENITH_EXTREME, TUF_X470_PLUS_GAMING, Z170_A, + TUF_GAMING_B550M_PLUS_WIFI, // DFI LP_BI_P45_T2RS_Elite, diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs index 4db0186..354f6b4 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs @@ -2186,6 +2186,56 @@ namespace LibreHardwareMonitor.Hardware.Motherboard break; } + case Model.TUF_GAMING_B550M_PLUS_WIFI: //NCT6798D + { + v.Add(new Voltage("Vcore", 0)); + v.Add(new Voltage("Voltage #2", 1, true)); + v.Add(new Voltage("AVCC", 2, 34, 34)); + v.Add(new Voltage("+3.3V", 3, 34, 34)); + 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)); + v.Add(new Voltage("VBat", 8, 34, 34)); + v.Add(new Voltage("VTT", 9)); + v.Add(new Voltage("Voltage #11", 10, true)); + v.Add(new Voltage("Voltage #12", 11, true)); + v.Add(new Voltage("Voltage #13", 12, true)); + v.Add(new Voltage("Voltage #14", 13, true)); + v.Add(new Voltage("Voltage #15", 14, true)); + t.Add(new Temperature("PECI 0", 0)); + t.Add(new Temperature("CPU", 1)); + t.Add(new Temperature("System", 2)); + t.Add(new Temperature("AUX 0", 3)); + t.Add(new Temperature("AUX 1", 4)); + t.Add(new Temperature("AUX 2", 5)); + t.Add(new Temperature("AUX 3", 6)); + t.Add(new Temperature("AUX 4", 7)); + t.Add(new Temperature("SMBus 0", 8)); + t.Add(new Temperature("SMBus 1", 9)); + t.Add(new Temperature("PECI 1", 10)); + t.Add(new Temperature("PCH Chip CPU Max", 11)); + t.Add(new Temperature("PCH Chip", 12)); + t.Add(new Temperature("PCH CPU", 13)); + t.Add(new Temperature("PCH MCH", 14)); + t.Add(new Temperature("Agent 0 DIMM 0", 15)); + t.Add(new Temperature("Agent 0 DIMM 1", 16)); + t.Add(new Temperature("Agent 1 DIMM 0", 17)); + t.Add(new Temperature("Agent 1 DIMM 1", 18)); + t.Add(new Temperature("Device 0", 19)); + t.Add(new Temperature("Device 1", 20)); + t.Add(new Temperature("PECI 0 Calibrated", 21)); + t.Add(new Temperature("PECI 1 Calibrated", 22)); + t.Add(new Temperature("Virtual", 23)); + + 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; + } default: { v.Add(new Voltage("Vcore", 0)); @@ -2272,11 +2322,12 @@ namespace LibreHardwareMonitor.Hardware.Motherboard v.Add(new Voltage("NB/SoC", 12)); v.Add(new Voltage("DIMM", 13, 1, 1)); //v.Add(new Voltage("Voltage #15", 14, false)); - t.Add(new Temperature("CPU", 0)); - t.Add(new Temperature("CPU (PECI)", 1)); + //t.Add(new Temperature("CPU", 0)); + t.Add(new Temperature("CPU", 1)); t.Add(new Temperature("System", 2)); t.Add(new Temperature("VRM MOS", 3)); t.Add(new Temperature("PCH", 5)); + t.Add(new Temperature("SMBus 0", 8)); f.Add(new Fan("Pump Fan", 0)); f.Add(new Fan("CPU Fan", 1)); f.Add(new Fan("System Fan #1", 2));