diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs index 4b76e17..f04e573 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs @@ -667,12 +667,20 @@ internal class Identification return Model.X11SWN_E; case var _ when name.Equals("PRO B840-P WIFI (MS-7E57)", StringComparison.OrdinalIgnoreCase): return Model.B840P_PRO_WIFI; + case var _ when name.Equals("B840M GAMING PLUS WIFI6E (MS-7E77)", StringComparison.OrdinalIgnoreCase): + return Model.B840M_GAMING_PLUS_WIFI6E; case var _ when name.Equals("PRO B850-P WIFI (MS-7E56)", StringComparison.OrdinalIgnoreCase): return Model.B850P_PRO_WIFI; case var _ when name.Equals("PRO B850-S WIFI6E (MS-7E80)", StringComparison.OrdinalIgnoreCase): return Model.B850S_PRO_WIFI6E; + case var _ when name.Equals("PRO B850M-A WIFI (MS-7E66)", StringComparison.OrdinalIgnoreCase): + return Model.B850MA_PRO_WIFI; + case var _ when name.Equals("PRO B850M-P WIFI (MS-7E71)", StringComparison.OrdinalIgnoreCase): + return Model.B850MP_PRO_WIFI; case var _ when name.Equals("B850 GAMING PLUS WIFI (MS-7E56)", StringComparison.OrdinalIgnoreCase): return Model.B850_GAMING_PLUS_WIFI; + case var _ when name.Equals("B850 GAMING PLUS WIFI6E (MS-7E80)", StringComparison.OrdinalIgnoreCase): + return Model.B850_GAMING_PLUS_WIFI6E; case var _ when name.Equals("B850M GAMING PLUS WIFI6E (MS-7E81)", StringComparison.OrdinalIgnoreCase): return Model.B850M_GAMING_PLUS_WIFI6E; case var _ when name.Equals("MAG B850M MORTAR WIFI (MS-7E61)", StringComparison.OrdinalIgnoreCase): @@ -681,8 +689,14 @@ internal class Identification return Model.B850_TOMAHAWK_MAX_WIFI; case var _ when name.Equals("MPG B850 EDGE TI WIFI (MS-7E62)", StringComparison.OrdinalIgnoreCase): return Model.B850_EDGE_TI_WIFI; + case var _ when name.Equals("MPG B850I EDGE TI WIFI (MS-7E79)", StringComparison.OrdinalIgnoreCase): + return Model.B850I_EDGE_TI_WIFI; + case var _ when name.Equals("B850MPOWER (MS-7E83)", StringComparison.OrdinalIgnoreCase): + return Model.B850MPOWER; case var _ when name.Equals("X870 GAMING PLUS WIFI (MS-7E47)", StringComparison.OrdinalIgnoreCase): return Model.X870_GAMING_PLUS_WIFI; + case var _ when name.Equals("X870E GAMING PLUS WIFI (MS-7E70)", StringComparison.OrdinalIgnoreCase): + return Model.X870E_GAMING_PLUS_WIFI; case var _ when name.Equals("MAG X870 TOMAHAWK WIFI (MS-7E51)", StringComparison.OrdinalIgnoreCase): return Model.X870_TOMAHAWK_WIFI; case var _ when name.Equals("MAG X870E TOMAHAWK WIFI (MS-7E59)", StringComparison.OrdinalIgnoreCase): @@ -691,6 +705,8 @@ internal class Identification return Model.X870E_GODLIKE; case var _ when name.Equals("PRO X870-P WIFI (MS-7E47)", StringComparison.OrdinalIgnoreCase): return Model.X870P_PRO_WIFI; + case var _ when name.Equals("PRO X870E-P WIFI (MS-7E70)", StringComparison.OrdinalIgnoreCase): + return Model.X870EP_PRO_WIFI; case var _ when name.Equals("MPG X870E CARBON WIFI (MS-7E49)", StringComparison.OrdinalIgnoreCase): return Model.X870E_CARBON_WIFI; case var _ when name.Equals("MPG X870E EDGE TI WIFI (MS-7E59)", StringComparison.OrdinalIgnoreCase): @@ -705,6 +721,8 @@ internal class Identification return Model.Z890_CARBON_WIFI; case var _ when name.Equals("MPG Z890 EDGE TI WIFI (MS-7E19)", StringComparison.OrdinalIgnoreCase): return Model.Z890_EDGE_TI_WIFI; + case var _ when name.Equals("MPG Z890I EDGE TI WIFI (MS-7E33)", StringComparison.OrdinalIgnoreCase): + return Model.Z890I_EDGE_TI_WIFI; case var _ when name.Equals("PRO Z890-P WIFI (MS-7E34)", StringComparison.OrdinalIgnoreCase): return Model.Z890P_PRO_WIFI; case var _ when name.Equals("PRO Z890-A WIFI (MS-7E32)", StringComparison.OrdinalIgnoreCase): diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs index 76feb90..0265d68 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs @@ -413,27 +413,37 @@ internal class LpcIO switch (motherboard.Model) { case Model.B840P_PRO_WIFI: + case Model.B840M_GAMING_PLUS_WIFI6E: case Model.B850_GAMING_PLUS_WIFI: + case Model.B850_GAMING_PLUS_WIFI6E: + case Model.B850M_GAMING_PLUS_WIFI6E: case Model.B850P_PRO_WIFI: + case Model.B850MA_PRO_WIFI: + case Model.B850MP_PRO_WIFI: case Model.B850M_MORTAR_WIFI: case Model.B850_TOMAHAWK_MAX_WIFI: case Model.B850_EDGE_TI_WIFI: + case Model.B850I_EDGE_TI_WIFI: + case Model.B850MPOWER: + case Model.B850S_PRO_WIFI6E: case Model.X870_GAMING_PLUS_WIFI: + case Model.X870E_GAMING_PLUS_WIFI: case Model.X870_TOMAHAWK_WIFI: case Model.X870P_PRO_WIFI: + case Model.X870EP_PRO_WIFI: case Model.X870E_TOMAHAWK_WIFI: case Model.X870E_CARBON_WIFI: case Model.X870E_EDGE_TI_WIFI: case Model.X870E_GODLIKE: case Model.Z890_ACE: case Model.Z890_CARBON_WIFI: + case Model.Z890_GAMING_PLUS_WIFI: case Model.Z890_TOMAHAWK_WIFI: case Model.Z890_EDGE_TI_WIFI: + case Model.Z890I_EDGE_TI_WIFI: case Model.Z890P_PRO_WIFI: case Model.Z890A_PRO_WIFI: case Model.Z890S_PRO_WIFI: - case Model.B850S_PRO_WIFI6E: - case Model.B850M_GAMING_PLUS_WIFI6E: chip = Chip.NCT6687DR; // MSI AM5/LGA1851 Compatibility break; default: diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs index 447aea4..62d8900 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs @@ -63,10 +63,12 @@ internal class Nct677X : ISuperIO } else if (chip is Chip.NCT6687DR) // MSI AM5/LGA1851 Motherboards { - FAN_PWM_OUT_REG = [0x160, 0x161, 0xE05, 0xE04, 0xE03, 0xE02, 0xE01, 0xE00]; // Duty Cycle Sensors - FAN_PWM_COMMAND_REG = [0xA28, 0xA29, 0xC70, 0xC58, 0xC40, 0xC28, 0xC10, 0xBF8]; // Control Registers for CPU/Pump, Initial Fan Curve Registers for System Fans - FAN_CONTROL_MODE_REG = [0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00]; - FAN_PWM_REQUEST_REG = [0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01]; + // Each index in the below arrays represents a fan header + // ARRAY_KEY = new ushort[] { CPU FAN, PUMP, CHIPSET, EZ-CONNECT FAN, null, null, null, null, null, SYSFAN7, SYSFAN1, SYSFAN2, SYSFAN3, SYSFAN4, SYSFAN5, SYSFAN6 }; + FAN_PWM_OUT_REG = [0x160, 0x161, 0x162, 0x163, 0x164, 0x165, 0x166, 0x167, 0xFFF, 0xC93, 0xE05, 0xE04, 0xE03, 0xE02, 0xE01, 0xE00]; // Duty Cycle Sensors + FAN_PWM_COMMAND_REG = [0xA28, 0xA29, 0xA2A, 0xA2B, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xFFF, 0xBE0, 0xC70, 0xC58, 0xC40, 0xC28, 0xC10, 0xBF8]; // Control Registers for CPU/Pump/EZ-Connect Fan, Initial Fan Curve Registers for System Fans + FAN_CONTROL_MODE_REG = [0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00, 0xA00]; + FAN_PWM_REQUEST_REG = [0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01, 0xA01]; } else { @@ -484,8 +486,8 @@ internal class Nct677X : ISuperIO break; case Chip.NCT6687DR: - Fans = new float?[8]; - Controls = new float?[8]; + Fans = new float?[16]; + Controls = new float?[16]; Voltages = new float?[14]; Temperatures = new float?[7]; @@ -497,7 +499,7 @@ internal class Nct677X : ISuperIO new TemperatureSourceData(null, 0x106), // PCH new TemperatureSourceData(null, 0x108), // CPU Socket new TemperatureSourceData(null, 0x10A), // PCIE_1 - new TemperatureSourceData(null, 0x10C) // M2_1 + new TemperatureSourceData(null, 0x10C) // M2_1 ]; // VIN0 +12V @@ -518,13 +520,21 @@ internal class Nct677X : ISuperIO // CPU Fan 0x140 // PUMP Fan 0x142 + // Chipset Fan 0x144 + // EZ-Conn 0x146 + // NOTHING + // NOTHING + // NOTHING + // NOTHING + // NOTHING + // NOTHING // SYS Fan 1 0x15E // SYS Fan 2 0x15C // SYS Fan 3 0x15A // SYS Fan 4 0x158 // SYS Fan 5 0x156 // SYS Fan 6 0x154 - _fanRpmRegister = [0x140, 0x142, 0x15E, 0x15C, 0x15A, 0x158, 0x156, 0x154]; + _fanRpmRegister = [0x140, 0x142, 0x144, 0x146, 0x148, 0x14A, 0x14C, 0x14E, 0x150, 0x152, 0x15E, 0x15C, 0x15A, 0x158, 0x156, 0x154]; _restoreDefaultFanControlRequired = new bool[_fanRpmRegister.Length]; _initialFanControlMode = new byte[_fanRpmRegister.Length]; @@ -601,20 +611,28 @@ internal class Nct677X : ISuperIO // bit 6 : SYS Fan 5 // bit 7 : SYS Fan 6 - byte mode = ReadByte(FAN_CONTROL_MODE_REG[index]); - byte bitMask = (byte)(0x01 << index); - mode = (byte)(mode | bitMask); - WriteByte(FAN_CONTROL_MODE_REG[index], mode); - WriteByte(FAN_PWM_REQUEST_REG[index], 0x80); Thread.Sleep(50); if (Chip is Chip.NCT6687DR) // For MSI AM5/LGA1851 NCT6687D functionality - { + { + if (index < 8) // Control fans traditionally if part of the old control scheme. Applies to CPU/Pump/EZ-Conn + { + byte mode = ReadByte(FAN_CONTROL_MODE_REG[index]); + byte bitMask = (byte)(0x01 << index); + mode = (byte)(mode | bitMask); + WriteByte(FAN_CONTROL_MODE_REG[index], mode); + } + Set6687DRControl(index, value.Value); } else // All other Nuvoton SIO controllers and motherboards that use NCT6683/6686/6687 { + byte mode = ReadByte(FAN_CONTROL_MODE_REG[index]); + byte bitMask = (byte)(0x01 << index); + mode = (byte)(mode | bitMask); + WriteByte(FAN_CONTROL_MODE_REG[index], mode); + WriteByte(FAN_PWM_COMMAND_REG[index], value.Value); } @@ -1140,24 +1158,30 @@ internal class Nct677X : ISuperIO private void Set6687DRControl(int index, byte? value) { - if (index > 1) // System Fan Control + if (index > 8) // Brute Force System Fan Control { - int initFanCurveReg = FAN_PWM_COMMAND_REG[index]; // Initial Register Address for the Fan Curve - byte currentSpeed = ReadByte(FAN_PWM_OUT_REG[index]); // Current Speed of the target fan + int initFanCurveReg = FAN_PWM_COMMAND_REG[index]; // Initial Register Address for the Fan Curve + int targetFanCurveAddr = initFanCurveReg; // Address of the Current Fan Curve Register we're writing to + ushort targetFanCurveReg; // Integer value of the current fan curve register address, not the value within + byte currentSpeed = ReadByte(FAN_PWM_OUT_REG[index]); // Current Speed of the target fan // If current fan duty cycle matches requested duty cycle, skip re-writing the fan curve - if (currentSpeed != value.Value) + if (currentSpeed == value.Value) + { + return; + } + else { // Write 7-point fan curve for (int count = 0; count < 14; count += 2) { - int targetFanCurveAddr = initFanCurveReg + count; // Address of the Current Fan Curve Register we're writing to - ushort targetFanCurveReg = Convert.ToUInt16(targetFanCurveAddr); // Integer value of the current fan curve register address, not the value within + targetFanCurveAddr = initFanCurveReg+count; + targetFanCurveReg = Convert.ToUInt16(targetFanCurveAddr); WriteByte(targetFanCurveReg, value.Value); } } } - else // Control CPU and Pump Fan normally + else // Control CPU, Pump, Chipset, or EZ-Connect Fan normally { WriteByte(FAN_PWM_COMMAND_REG[index], value.Value); } diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs index 5f3aea4..a7eaae1 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs @@ -154,17 +154,25 @@ public enum Model X570_MS7C35, B850M_MORTAR_WIFI, B850_GAMING_PLUS_WIFI, + B850_GAMING_PLUS_WIFI6E, B850M_GAMING_PLUS_WIFI6E, B840P_PRO_WIFI, + B840M_GAMING_PLUS_WIFI6E, B850_TOMAHAWK_MAX_WIFI, B650M_PROJECT_ZERO, B850P_PRO_WIFI, + B850MA_PRO_WIFI, + B850MP_PRO_WIFI, B850_EDGE_TI_WIFI, + B850I_EDGE_TI_WIFI, + B850MPOWER, X870_GAMING_PLUS_WIFI, + X870E_GAMING_PLUS_WIFI, X870_TOMAHAWK_WIFI, X870E_TOMAHAWK_WIFI, X870E_GODLIKE, X870P_PRO_WIFI, + X870EP_PRO_WIFI, X870E_CARBON_WIFI, X870E_EDGE_TI_WIFI, Z790_GODLIKE_MAX, @@ -172,6 +180,7 @@ public enum Model Z890_TOMAHAWK_WIFI, Z890_CARBON_WIFI, Z890_EDGE_TI_WIFI, + Z890I_EDGE_TI_WIFI, Z890P_PRO_WIFI, Z890A_PRO_WIFI, Z890S_PRO_WIFI, diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs index 8981b04..a9a22e0 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs @@ -632,21 +632,25 @@ internal sealed class SuperIOHardware : Hardware f.Add(new Fan("CPU Fan", 0)); f.Add(new Fan("Pump Fan #1", 1)); - f.Add(new Fan("System Fan #1", 2)); - f.Add(new Fan("System Fan #2", 3)); - f.Add(new Fan("System Fan #3", 4)); - f.Add(new Fan("System Fan #4", 5)); - f.Add(new Fan("System Fan #5", 6)); - f.Add(new Fan("System Fan #6", 7)); + f.Add(new Fan("Chipset Fan", 2)); + f.Add(new Fan("System Fan #1", 10)); + f.Add(new Fan("System Fan #2", 11)); + f.Add(new Fan("System Fan #3", 12)); + f.Add(new Fan("System Fan #4", 13)); + f.Add(new Fan("System Fan #5", 14)); + f.Add(new Fan("System Fan #6", 15)); + f.Add(new Fan("EZ-Connect Fan", 3)); c.Add(new Control("CPU Fan", 0)); c.Add(new Control("Pump Fan", 1)); - c.Add(new Control("System Fan #1", 2)); - c.Add(new Control("System Fan #2", 3)); - c.Add(new Control("System Fan #3", 4)); - c.Add(new Control("System Fan #4", 5)); - c.Add(new Control("System Fan #5", 6)); - c.Add(new Control("System Fan #6", 7)); + c.Add(new Control("Chipset Fan", 2)); + c.Add(new Control("System Fan #1", 10)); + c.Add(new Control("System Fan #2", 11)); + c.Add(new Control("System Fan #3", 12)); + c.Add(new Control("System Fan #4", 13)); + c.Add(new Control("System Fan #5", 14)); + c.Add(new Control("System Fan #6", 15)); + c.Add(new Control("EZ-Connect Fan", 3)); switch (model) { @@ -673,6 +677,9 @@ internal sealed class SuperIOHardware : Hardware case Model.X870E_CARBON_WIFI: case Model.X870E_GODLIKE: + f.Add(new Fan("System Fan #7", 9)); + c.Add(new Control("System Fan #7", 9)); + v.Add(new Voltage("+12V", 0)); v.Add(new Voltage("+5V", 1)); v.Add(new Voltage("CPU Northbridge/SoC", 2)); @@ -718,6 +725,7 @@ internal sealed class SuperIOHardware : Hardware break; case Model.Z890_EDGE_TI_WIFI: + case Model.Z890I_EDGE_TI_WIFI: case Model.Z890P_PRO_WIFI: case Model.Z890A_PRO_WIFI: case Model.Z890S_PRO_WIFI: