diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs index bbe51f5..ba908bc 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs @@ -709,6 +709,8 @@ internal class Identification return Model.X670_AORUS_ELITE_AX; case var _ when name.Equals("PROART B760-CREATOR D4", StringComparison.OrdinalIgnoreCase): return Model.PROART_B760_CREATOR_D4; + case var _ when name.Equals("TUF GAMING B450-PLUS II", StringComparison.OrdinalIgnoreCase): + return Model.TUF_GAMING_B450_PLUS_II; 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/IT87XX.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/IT87XX.cs index 03a16ac..8a79681 100755 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/IT87XX.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/IT87XX.cs @@ -25,7 +25,8 @@ internal class IT87XX : ISuperIO private readonly int _gpioCount; private readonly bool _has16BitFanCounter; private readonly bool _hasExtReg; - private readonly bool[] _initialFanOutputModeEnabled = new bool[3]; // Initial Fan Controller Main Control Register value. + private readonly bool _hasAlt6thFanReg; + private readonly bool[] _initialFanOutputModeEnabled = new bool[3]; // Initial Fan Controller Main Control Register value. private readonly byte[] _initialFanPwmControl = new byte[MaxFanHeaders]; // This will also store the 2nd control register value. private readonly byte[] _initialFanPwmControlExt = new byte[MaxFanHeaders]; private readonly bool[] _restoreDefaultFanPwmControlRequired = new bool[MaxFanHeaders]; @@ -104,6 +105,8 @@ internal class IT87XX : ISuperIO Chip.IT8638E or Chip.IT8696E; + _hasAlt6thFanReg = chip is Chip.IT8665E or Chip.IT8625E; + switch (chip) { case Chip.IT8613E: @@ -250,7 +253,16 @@ internal class IT87XX : ISuperIO } if (Fans.Length >= 6) - _fansDisabled[5] = (modes & (1 << 2)) == 0; + { + if (chip == Chip.IT8665E) + { + modes = ReadByte(FAN_TACHOMETER_16BIT_REGISTER_ALT, out valid); + if (valid) + _fansDisabled[5] = (modes & (1 << 3)) == 0; + } + else + _fansDisabled[5] = (modes & (1 << 2)) == 0; + } } // Set the number of GPIO sets @@ -468,11 +480,11 @@ internal class IT87XX : ISuperIO if (_fansDisabled[i]) continue; - int value = ReadByte(FAN_TACHOMETER_REG[i], out bool valid); + int value = ReadByte(_hasAlt6thFanReg ? FAN_TACHOMETER_REG_ALT[i] : FAN_TACHOMETER_REG[i], out bool valid); if (!valid) continue; - value |= ReadByte(FAN_TACHOMETER_EXT_REG[i], out valid) << 8; + value |= ReadByte(_hasAlt6thFanReg ? FAN_TACHOMETER_EXT_REG_ALT[i] : FAN_TACHOMETER_EXT_REG[i], out valid) << 8; if (!valid) continue; @@ -608,6 +620,7 @@ internal class IT87XX : ISuperIO private const byte DATA_REGISTER_OFFSET = 0x06; private const byte BANK_REGISTER = 0x06; // bit 5-6 define selected bank private const byte FAN_TACHOMETER_16BIT_REGISTER = 0x0C; + private const byte FAN_TACHOMETER_16BIT_REGISTER_ALT = 0x0B; private const byte FAN_TACHOMETER_DIVISOR_REGISTER = 0x0B; private readonly byte[] ITE_VENDOR_IDS = { 0x90, 0x7F }; @@ -622,6 +635,8 @@ internal class IT87XX : ISuperIO private readonly byte[] FAN_PWM_CTRL_EXT_REG = { 0x63, 0x6b, 0x73, 0x7b, 0xa3, 0xab }; private readonly byte[] FAN_TACHOMETER_EXT_REG = { 0x18, 0x19, 0x1a, 0x81, 0x83, 0x4d }; private readonly byte[] FAN_TACHOMETER_REG = { 0x0d, 0x0e, 0x0f, 0x80, 0x82, 0x4c }; + private readonly byte[] FAN_TACHOMETER_EXT_REG_ALT = { 0x18, 0x19, 0x1a, 0x81, 0x83, 0x94 }; + private readonly byte[] FAN_TACHOMETER_REG_ALT = { 0x0d, 0x0e, 0x0f, 0x80, 0x82, 0x93 }; // Address of the Fan Controller Main Control Register. // No need for the 2nd control register (bit 7 of 0x15 0x16 0x17), diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs old mode 100755 new mode 100644 index fa2a60f..69e0327 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs @@ -123,6 +123,7 @@ public enum Model ROG_STRIX_X870E_E_GAMING_WIFI, PROART_X870E_CREATOR_WIFI, PROART_B760_CREATOR_D4, + TUF_GAMING_B450_PLUS_II, //BIOSTAR B660GTN, diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs index fb6417b..d0e8e7a 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs @@ -1352,6 +1352,42 @@ internal sealed class SuperIOHardware : Hardware break; + case Model.TUF_GAMING_B450_PLUS_II: // IT8665E + v.Add(new Voltage("Vcore", 0)); + v.Add(new Voltage("Vccp2", 1)); + v.Add(new Voltage("+12V", 2, 5, 1)); + v.Add(new Voltage("+5V", 3, 1.5f, 1)); + 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, 10, 10)); + v.Add(new Voltage("VBat", 8, 10, 10)); + //v.Add(new Voltage("AVCC3", 15, 10, 10)); + + t.Add(new Temperature("CPU", 0)); + t.Add(new Temperature("Motherboard", 1)); + t.Add(new Temperature("Temperature #3", 2)); + t.Add(new Temperature("Temperature #4", 3)); + t.Add(new Temperature("Temperature #5", 4)); + t.Add(new Temperature("Temperature #6", 5)); + + f.Add(new Fan("CPU Fan", 0)); + f.Add(new Fan("Chassis Fan #1", 1)); + f.Add(new Fan("Chassis Fan #2", 2)); + f.Add(new Fan("Chassis Fan #3", 3)); + //f.Add(new Fan("Chassis Fan #4", 4)); //Useless. Not connected to anything. + f.Add(new Fan("AIO Pump", 5)); + + c.Add(new Control("CPU Fan Control", 0)); + c.Add(new Control("Chassis Fan #1 Control", 1)); + c.Add(new Control("Chassis Fan #2 Control", 2)); + c.Add(new Control("Chassis Fan #3 Control", 3)); + //c.Add(new Control("Chassis Fan #4 Control", 4)); //Useless. Not connected to anything. + c.Add(new Control("AIO Pump Control", 5)); + + break; + + default: v.Add(new Voltage("Vcore", 0)); v.Add(new Voltage("Voltage #2", 1, true));