From 9cd1c629e5a29a0c710791db93b9bdf734c44b96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=B6ller?= Date: Thu, 5 Aug 2010 18:06:18 +0000 Subject: [PATCH] Added ISA bus mutex support to the super IO detection. --- Hardware/LPC/F718XX.cs | 4 +-- Hardware/LPC/IT87XX.cs | 4 +-- Hardware/LPC/LPCIO.cs | 64 ++++++++++++++++++++++++------------------ Hardware/LPC/W836XX.cs | 4 +-- Hardware/WinRing0.cs | 4 +-- 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/Hardware/LPC/F718XX.cs b/Hardware/LPC/F718XX.cs index a824bda..08fef7d 100644 --- a/Hardware/LPC/F718XX.cs +++ b/Hardware/LPC/F718XX.cs @@ -88,7 +88,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { r.Append("Base Adress: 0x"); r.AppendLine(address.ToString("X4")); r.AppendLine(); - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(100)) return r.ToString(); r.AppendLine("Hardware Monitor Registers"); @@ -111,7 +111,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { } public void Update() { - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(10)) return; for (int i = 0; i < voltages.Length; i++) { diff --git a/Hardware/LPC/IT87XX.cs b/Hardware/LPC/IT87XX.cs index 64a5e63..0c954a6 100644 --- a/Hardware/LPC/IT87XX.cs +++ b/Hardware/LPC/IT87XX.cs @@ -119,7 +119,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { r.Append("Base Address: 0x"); r.AppendLine(address.ToString("X4")); r.AppendLine(); - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(100)) return r.ToString(); r.AppendLine("Environment Controller Registers"); @@ -147,7 +147,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { } public void Update() { - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(10)) return; for (int i = 0; i < voltages.Length; i++) { diff --git a/Hardware/LPC/LPCIO.cs b/Hardware/LPC/LPCIO.cs index e173a76..b48d6f6 100644 --- a/Hardware/LPC/LPCIO.cs +++ b/Hardware/LPC/LPCIO.cs @@ -120,9 +120,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { WinRing0.WriteIoPortByte(registerPort, 0xAA); } - public LPCIO() { - if (!WinRing0.IsAvailable) - return; + private void Detect() { for (int i = 0; i < REGISTER_PORTS.Length; i++) { registerPort = REGISTER_PORTS[i]; @@ -145,35 +143,35 @@ namespace OpenHardwareMonitor.Hardware.LPC { case 0x41: chip = Chip.F71882; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x06: - switch (revision) { + switch (revision) { case 0x01: chip = Chip.F71862; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x07: switch (revision) { case 0x23: chip = Chip.F71889F; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x08: switch (revision) { case 0x14: chip = Chip.F71869; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x09: switch (revision) { case 0x09: chip = Chip.F71889ED; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x52: switch (revision) { @@ -182,7 +180,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case 0x41: chip = Chip.W83627HF; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0x82: switch (revision & 0xF0) { @@ -208,10 +206,10 @@ namespace OpenHardwareMonitor.Hardware.LPC { } break; case 0xA0: switch (revision & 0xF0) { - case 0x20: + case 0x20: chip = Chip.W83627DHG; - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; - break; + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; + break; } break; case 0xA5: switch (revision & 0xF0) { @@ -225,7 +223,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case 0x70: chip = Chip.W83627DHGP; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; - break; + break; } break; case 0xB3: switch (revision & 0xF0) { @@ -233,20 +231,20 @@ namespace OpenHardwareMonitor.Hardware.LPC { chip = Chip.W83667HGB; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; - } break; + } break; } if (chip == Chip.Unknown) { if (id != 0 && id != 0xff) { WinbondFintekExit(); - report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x"); + report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x"); report.AppendLine(((id << 8) | revision).ToString("X")); report.AppendLine(); } } else { Select(logicalDeviceNumber); - ushort address = ReadWord(BASE_ADDRESS_REGISTER); + ushort address = ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); ushort verify = ReadWord(BASE_ADDRESS_REGISTER); @@ -254,10 +252,10 @@ namespace OpenHardwareMonitor.Hardware.LPC { WinbondFintekExit(); - if (address != verify) { - report.Append("Chip ID: 0x"); + if (address != verify) { + report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); - report.Append("Chip revision: 0x"); + report.Append("Chip revision: 0x"); report.AppendLine(revision.ToString("X")); report.AppendLine("Error: Address verification failed"); report.AppendLine(); @@ -268,7 +266,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { if ((address & 0x07) == 0x05) address &= 0xFFF8; - if (address < 0x100 || (address & 0xF007) != 0) { + if (address < 0x100 || (address & 0xF007) != 0) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Chip revision: 0x"); @@ -310,7 +308,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { break; default: break; } - + return; } @@ -322,7 +320,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { case 0x8716: chip = Chip.IT8716F; break; case 0x8718: chip = Chip.IT8718F; break; case 0x8720: chip = Chip.IT8720F; break; - case 0x8726: chip = Chip.IT8726F; break; + case 0x8726: chip = Chip.IT8726F; break; default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { @@ -333,7 +331,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { report.AppendLine(chipID.ToString("X")); report.AppendLine(); } - } else { + } else { Select(IT87_ENVIRONMENT_CONTROLLER_LDN); ushort address = ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); @@ -345,14 +343,14 @@ namespace OpenHardwareMonitor.Hardware.LPC { if (address != verify || address < 0x100 || (address & 0xF007) != 0) { report.Append("Chip ID: 0x"); - report.AppendLine(chip.ToString("X")); + report.AppendLine(chip.ToString("X")); report.Append("Error: Invalid address 0x"); report.AppendLine(address.ToString("X")); report.AppendLine(); return; } - superIOs.Add(new IT87XX(chip, address, version)); + superIOs.Add(new IT87XX(chip, address, version)); return; } @@ -376,7 +374,19 @@ namespace OpenHardwareMonitor.Hardware.LPC { return; } - } + } + } + + public LPCIO() { + if (!WinRing0.IsAvailable) + return; + + if (!WinRing0.WaitIsaBusMutex(100)) + return; + + Detect(); + + WinRing0.ReleaseIsaBusMutex(); } public ISuperIO[] SuperIO { diff --git a/Hardware/LPC/W836XX.cs b/Hardware/LPC/W836XX.cs index 0462a2c..a134b6f 100644 --- a/Hardware/LPC/W836XX.cs +++ b/Hardware/LPC/W836XX.cs @@ -194,7 +194,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { public float?[] Fans { get { return fans; } } public void Update() { - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(10)) return; for (int i = 0; i < voltages.Length; i++) { @@ -295,7 +295,7 @@ namespace OpenHardwareMonitor.Hardware.LPC { r.Append("Base Adress: 0x"); r.AppendLine(address.ToString("X4")); r.AppendLine(); - if (!WinRing0.WaitIsaBusMutex()) + if (!WinRing0.WaitIsaBusMutex(100)) return r.ToString(); r.AppendLine("Hardware Monitor Registers"); diff --git a/Hardware/WinRing0.cs b/Hardware/WinRing0.cs index 5a04de5..346a851 100644 --- a/Hardware/WinRing0.cs +++ b/Hardware/WinRing0.cs @@ -162,9 +162,9 @@ namespace OpenHardwareMonitor.Hardware { get { return available; } } - public static bool WaitIsaBusMutex() { + public static bool WaitIsaBusMutex(int millisecondsTimeout) { try { - return isaBusMutex.WaitOne(10); + return isaBusMutex.WaitOne(millisecondsTimeout); } catch { return false; } }