Re-Structure Fan and Control Register Layout for NCT6687DR, Support 10 new MSI Motherboards (#2068)
* Support for 10 new MSI motherboards with NCT6687D-R SIO controller * Support for newly established fan and control register structure WILL ABSOLUTELY BREAK FAN CONTROL CONFIGS FOR NCT6687DR USERS. This introduces Support for 16 System Fans and Controls, including EZ-Connect, Pump Fan 2, and System Fan 7. Also improved the logic for nct6687dr control.
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user