Proart x870e creator wifi (#1547)

* fix line endings to lf

* add support for proart_x870e_creator_wifi

---------

Co-authored-by: damesene <reg.sliva@hotmail.com>
Co-authored-by: PhyxionNL <7643972+PhyxionNL@users.noreply.github.com>
This commit is contained in:
damesene
2025-01-17 12:56:44 +01:00
committed by GitHub
co-authored by damesene PhyxionNL
parent 09197be639
commit 7753ee91b9
5 changed files with 110 additions and 79 deletions
@@ -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):
@@ -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)
@@ -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);
@@ -254,6 +254,7 @@ public enum Model
B650M_AORUS_ELITE_AX,
X870E_AORUS_PRO,
X870E_AORUS_PRO_ICE,
PROART_X870E_CREATOR_WIFI,
// Shuttle
FH67,
@@ -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));