Fixed temperatures for NCT6796D... and added ASUS TUF GAMING B550M-PLUS (WI-FI) (#339)

Thanks to @holgerpieta
This commit is contained in:
holgerpieta
2020-12-07 11:47:44 +01:00
committed by GitHub
parent 693986e733
commit 18232fd182
4 changed files with 258 additions and 48 deletions
@@ -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;
@@ -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")]
@@ -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,
@@ -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));