1.1 --- a/Hardware/LPC/LPCIO.cs Wed Aug 04 20:27:05 2010 +0000
1.2 +++ b/Hardware/LPC/LPCIO.cs Thu Aug 05 18:06:18 2010 +0000
1.3 @@ -120,9 +120,7 @@
1.4 WinRing0.WriteIoPortByte(registerPort, 0xAA);
1.5 }
1.6
1.7 - public LPCIO() {
1.8 - if (!WinRing0.IsAvailable)
1.9 - return;
1.10 + private void Detect() {
1.11
1.12 for (int i = 0; i < REGISTER_PORTS.Length; i++) {
1.13 registerPort = REGISTER_PORTS[i];
1.14 @@ -145,35 +143,35 @@
1.15 case 0x41:
1.16 chip = Chip.F71882;
1.17 logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.18 - break;
1.19 + break;
1.20 } break;
1.21 case 0x06:
1.22 - switch (revision) {
1.23 + switch (revision) {
1.24 case 0x01:
1.25 chip = Chip.F71862;
1.26 logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.27 - break;
1.28 + break;
1.29 } break;
1.30 case 0x07:
1.31 switch (revision) {
1.32 case 0x23:
1.33 chip = Chip.F71889F;
1.34 logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.35 - break;
1.36 + break;
1.37 } break;
1.38 case 0x08:
1.39 switch (revision) {
1.40 case 0x14:
1.41 chip = Chip.F71869;
1.42 logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.43 - break;
1.44 + break;
1.45 } break;
1.46 case 0x09:
1.47 switch (revision) {
1.48 case 0x09:
1.49 chip = Chip.F71889ED;
1.50 logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.51 - break;
1.52 + break;
1.53 } break;
1.54 case 0x52:
1.55 switch (revision) {
1.56 @@ -182,7 +180,7 @@
1.57 case 0x41:
1.58 chip = Chip.W83627HF;
1.59 logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.60 - break;
1.61 + break;
1.62 } break;
1.63 case 0x82:
1.64 switch (revision & 0xF0) {
1.65 @@ -208,10 +206,10 @@
1.66 } break;
1.67 case 0xA0:
1.68 switch (revision & 0xF0) {
1.69 - case 0x20:
1.70 + case 0x20:
1.71 chip = Chip.W83627DHG;
1.72 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.73 - break;
1.74 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.75 + break;
1.76 } break;
1.77 case 0xA5:
1.78 switch (revision & 0xF0) {
1.79 @@ -225,7 +223,7 @@
1.80 case 0x70:
1.81 chip = Chip.W83627DHGP;
1.82 logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.83 - break;
1.84 + break;
1.85 } break;
1.86 case 0xB3:
1.87 switch (revision & 0xF0) {
1.88 @@ -233,20 +231,20 @@
1.89 chip = Chip.W83667HGB;
1.90 logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.91 break;
1.92 - } break;
1.93 + } break;
1.94 }
1.95 if (chip == Chip.Unknown) {
1.96 if (id != 0 && id != 0xff) {
1.97 WinbondFintekExit();
1.98
1.99 - report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x");
1.100 + report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x");
1.101 report.AppendLine(((id << 8) | revision).ToString("X"));
1.102 report.AppendLine();
1.103 }
1.104 } else {
1.105
1.106 Select(logicalDeviceNumber);
1.107 - ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.108 + ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.109 Thread.Sleep(1);
1.110 ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
1.111
1.112 @@ -254,10 +252,10 @@
1.113
1.114 WinbondFintekExit();
1.115
1.116 - if (address != verify) {
1.117 - report.Append("Chip ID: 0x");
1.118 + if (address != verify) {
1.119 + report.Append("Chip ID: 0x");
1.120 report.AppendLine(chip.ToString("X"));
1.121 - report.Append("Chip revision: 0x");
1.122 + report.Append("Chip revision: 0x");
1.123 report.AppendLine(revision.ToString("X"));
1.124 report.AppendLine("Error: Address verification failed");
1.125 report.AppendLine();
1.126 @@ -268,7 +266,7 @@
1.127 if ((address & 0x07) == 0x05)
1.128 address &= 0xFFF8;
1.129
1.130 - if (address < 0x100 || (address & 0xF007) != 0) {
1.131 + if (address < 0x100 || (address & 0xF007) != 0) {
1.132 report.Append("Chip ID: 0x");
1.133 report.AppendLine(chip.ToString("X"));
1.134 report.Append("Chip revision: 0x");
1.135 @@ -310,7 +308,7 @@
1.136 break;
1.137 default: break;
1.138 }
1.139 -
1.140 +
1.141 return;
1.142 }
1.143
1.144 @@ -322,7 +320,7 @@
1.145 case 0x8716: chip = Chip.IT8716F; break;
1.146 case 0x8718: chip = Chip.IT8718F; break;
1.147 case 0x8720: chip = Chip.IT8720F; break;
1.148 - case 0x8726: chip = Chip.IT8726F; break;
1.149 + case 0x8726: chip = Chip.IT8726F; break;
1.150 default: chip = Chip.Unknown; break;
1.151 }
1.152 if (chip == Chip.Unknown) {
1.153 @@ -333,7 +331,7 @@
1.154 report.AppendLine(chipID.ToString("X"));
1.155 report.AppendLine();
1.156 }
1.157 - } else {
1.158 + } else {
1.159 Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
1.160 ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.161 Thread.Sleep(1);
1.162 @@ -345,14 +343,14 @@
1.163
1.164 if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
1.165 report.Append("Chip ID: 0x");
1.166 - report.AppendLine(chip.ToString("X"));
1.167 + report.AppendLine(chip.ToString("X"));
1.168 report.Append("Error: Invalid address 0x");
1.169 report.AppendLine(address.ToString("X"));
1.170 report.AppendLine();
1.171 return;
1.172 }
1.173
1.174 - superIOs.Add(new IT87XX(chip, address, version));
1.175 + superIOs.Add(new IT87XX(chip, address, version));
1.176
1.177 return;
1.178 }
1.179 @@ -376,7 +374,19 @@
1.180
1.181 return;
1.182 }
1.183 - }
1.184 + }
1.185 + }
1.186 +
1.187 + public LPCIO() {
1.188 + if (!WinRing0.IsAvailable)
1.189 + return;
1.190 +
1.191 + if (!WinRing0.WaitIsaBusMutex(100))
1.192 + return;
1.193 +
1.194 + Detect();
1.195 +
1.196 + WinRing0.ReleaseIsaBusMutex();
1.197 }
1.198
1.199 public ISuperIO[] SuperIO {