From 7753ee91b97c204a71031bc7de3dede2a4b88d0c Mon Sep 17 00:00:00 2001 From: damesene Date: Fri, 17 Jan 2025 12:56:44 +0100 Subject: [PATCH] Proart x870e creator wifi (#1547) * fix line endings to lf * add support for proart_x870e_creator_wifi --------- Co-authored-by: damesene Co-authored-by: PhyxionNL <7643972+PhyxionNL@users.noreply.github.com> --- .../Hardware/Motherboard/Identification.cs | 2 + .../Hardware/Motherboard/Lpc/LpcIO.cs | 68 +++++++------- .../Hardware/Motherboard/Lpc/Nct677X.cs | 90 +++++++++---------- .../Hardware/Motherboard/Model.cs | 1 + .../Hardware/Motherboard/SuperIOHardware.cs | 28 ++++++ 5 files changed, 110 insertions(+), 79 deletions(-) diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs index ef1d32d..4e856bd 100755 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Identification.cs @@ -607,6 +607,8 @@ internal class Identification return Model.X870E_AORUS_PRO; case var _ when name.Equals("X870E AORUS PRO ICE", StringComparison.OrdinalIgnoreCase): return Model.X870E_AORUS_PRO_ICE; + case var _ when name.Equals("PROART X870E-CREATOR WIFI", StringComparison.OrdinalIgnoreCase): + return Model.PROART_X870E_CREATOR_WIFI; case var _ when name.Equals("PRIME X870-P", StringComparison.OrdinalIgnoreCase): return Model.PRIME_X870_P; case var _ when name.Equals("ROG CROSSHAIR X870E HERO", StringComparison.OrdinalIgnoreCase): diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs index b870fa5..b8d3219 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/LpcIO.cs @@ -403,9 +403,9 @@ internal class LpcIO chip = Chip.NCT6799D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; - case 0x06: - chip = Chip.NCT6701D; - logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; + case 0x06: + chip = Chip.NCT6701D; + logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } @@ -549,7 +549,7 @@ internal class LpcIO port.IT87Enter(); chipId = port.ReadWord(CHIP_ID_REGISTER); } - + Chip chip = chipId switch { 0x8613 => Chip.IT8613E, @@ -649,41 +649,41 @@ internal class LpcIO return false; } - private IGigabyteController FindGigabyteEC(LpcPort port, Chip chip, Motherboard motherboard) + private IGigabyteController FindGigabyteEC(LpcPort port, Chip chip, Motherboard motherboard) { // The controller only affects the 2nd ITE chip if present, and only a few // models are known to use this controller. // IT8795E likely to need this too, but may use different registers. if (motherboard.Manufacturer != Manufacturer.Gigabyte || port.RegisterPort != 0x4E || chip is not (Chip.IT8790E or Chip.IT8792E or Chip.IT87952E)) - return null; - - Vendor vendor = DetectVendor(); - - IGigabyteController gigabyteController = FindGigabyteECUsingSmfi(port, chip, vendor); - if (gigabyteController != null) - return gigabyteController; - - // ECIO is only available on AMD motherboards with IT8791E/IT8792E/IT8795E. - if (chip == Chip.IT8792E && vendor == Vendor.AMD) - { - gigabyteController = EcioPortGigabyteController.TryCreate(); - if (gigabyteController != null) - return gigabyteController; - } - - return null; - - Vendor DetectVendor() - { - string manufacturer = motherboard.SMBios.Processors[0].ManufacturerName; - if (manufacturer.IndexOf("Intel", StringComparison.OrdinalIgnoreCase) != -1) - return Vendor.Intel; - - if (manufacturer.IndexOf("Advanced Micro Devices", StringComparison.OrdinalIgnoreCase) != -1 || manufacturer.StartsWith("AMD", StringComparison.OrdinalIgnoreCase)) - return Vendor.AMD; - - return Vendor.Unknown; - } + return null; + + Vendor vendor = DetectVendor(); + + IGigabyteController gigabyteController = FindGigabyteECUsingSmfi(port, chip, vendor); + if (gigabyteController != null) + return gigabyteController; + + // ECIO is only available on AMD motherboards with IT8791E/IT8792E/IT8795E. + if (chip == Chip.IT8792E && vendor == Vendor.AMD) + { + gigabyteController = EcioPortGigabyteController.TryCreate(); + if (gigabyteController != null) + return gigabyteController; + } + + return null; + + Vendor DetectVendor() + { + string manufacturer = motherboard.SMBios.Processors[0].ManufacturerName; + if (manufacturer.IndexOf("Intel", StringComparison.OrdinalIgnoreCase) != -1) + return Vendor.Intel; + + if (manufacturer.IndexOf("Advanced Micro Devices", StringComparison.OrdinalIgnoreCase) != -1 || manufacturer.StartsWith("AMD", StringComparison.OrdinalIgnoreCase)) + return Vendor.AMD; + + return Vendor.Unknown; + } } private IGigabyteController FindGigabyteECUsingSmfi(LpcPort port, Chip chip, Vendor vendor) diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs index be0491d..b513ac2 100644 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Lpc/Nct677X.cs @@ -820,33 +820,33 @@ internal class Nct677X : ISuperIO } byte page = (byte)(address >> 8); - byte index = (byte)(address & 0xFF); - - //wait for access, access == EC_SPACE_PAGE_SELECT - //timeout: after 500ms, abort and force access - byte access; - - DateTime timeout = DateTime.UtcNow.AddMilliseconds(500); - while (true) - { - access = Ring0.ReadIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET); - if (access == EC_SPACE_PAGE_SELECT || DateTime.UtcNow > timeout) - break; - - System.Threading.Thread.Sleep(1); - } - - if (access != EC_SPACE_PAGE_SELECT) - { - // Failed to gain access: force register access - Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, EC_SPACE_PAGE_SELECT); - } - + byte index = (byte)(address & 0xFF); + + //wait for access, access == EC_SPACE_PAGE_SELECT + //timeout: after 500ms, abort and force access + byte access; + + DateTime timeout = DateTime.UtcNow.AddMilliseconds(500); + while (true) + { + access = Ring0.ReadIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET); + if (access == EC_SPACE_PAGE_SELECT || DateTime.UtcNow > timeout) + break; + + System.Threading.Thread.Sleep(1); + } + + if (access != EC_SPACE_PAGE_SELECT) + { + // Failed to gain access: force register access + Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, EC_SPACE_PAGE_SELECT); + } + Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, page); Ring0.WriteIoPort(_port + EC_SPACE_INDEX_REGISTER_OFFSET, index); - byte result = Ring0.ReadIoPort(_port + EC_SPACE_DATA_REGISTER_OFFSET); - - //free access for other instances + byte result = Ring0.ReadIoPort(_port + EC_SPACE_DATA_REGISTER_OFFSET); + + //free access for other instances Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, EC_SPACE_PAGE_SELECT); return result; @@ -866,26 +866,26 @@ internal class Nct677X : ISuperIO else { byte page = (byte)(address >> 8); - byte index = (byte)(address & 0xFF); - - //wait for access, access == EC_SPACE_PAGE_SELECT - //timeout: after 500ms, abort and force access - byte access; - - DateTime timeout = DateTime.UtcNow.AddMilliseconds(500); - while (true) - { - access = Ring0.ReadIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET); - if (access == EC_SPACE_PAGE_SELECT || DateTime.UtcNow > timeout) - break; - - System.Threading.Thread.Sleep(1); - } - - if (access != EC_SPACE_PAGE_SELECT) - { - // Failed to gain access: force register access - Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, EC_SPACE_PAGE_SELECT); + byte index = (byte)(address & 0xFF); + + //wait for access, access == EC_SPACE_PAGE_SELECT + //timeout: after 500ms, abort and force access + byte access; + + DateTime timeout = DateTime.UtcNow.AddMilliseconds(500); + while (true) + { + access = Ring0.ReadIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET); + if (access == EC_SPACE_PAGE_SELECT || DateTime.UtcNow > timeout) + break; + + System.Threading.Thread.Sleep(1); + } + + if (access != EC_SPACE_PAGE_SELECT) + { + // Failed to gain access: force register access + Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, EC_SPACE_PAGE_SELECT); } Ring0.WriteIoPort(_port + EC_SPACE_PAGE_REGISTER_OFFSET, page); diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs index 93e7372..c513881 100755 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/Model.cs @@ -254,6 +254,7 @@ public enum Model B650M_AORUS_ELITE_AX, X870E_AORUS_PRO, X870E_AORUS_PRO_ICE, + PROART_X870E_CREATOR_WIFI, // Shuttle FH67, diff --git a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs index 643ed75..5fd9fca 100755 --- a/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs +++ b/LibreHardwareMonitorLib/Hardware/Motherboard/SuperIOHardware.cs @@ -4430,6 +4430,34 @@ internal sealed class SuperIOHardware : Hardware break; + case Model.PROART_X870E_CREATOR_WIFI: // ITE IT8696E + 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("+3V Standby", 7, 34, 34)); + v.Add(new Voltage("CMOS Battery", 8, 34, 34)); + v.Add(new Voltage("CPU Termination", 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("Motherboard", 2)); + t.Add(new Temperature("CPU", 22)); + + 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 Control("Fan #" + (i + 1), i)); + + break; + default: v.Add(new Voltage("Vcore", 0)); v.Add(new Voltage("Voltage #2", 1, true));