1.1 --- a/Hardware/LPC/LPCIO.cs Thu Aug 12 20:53:27 2010 +0000
1.2 +++ b/Hardware/LPC/LPCIO.cs Sun Aug 15 14:46:58 2010 +0000
1.3 @@ -47,8 +47,6 @@
1.4 private List<ISuperIO> superIOs = new List<ISuperIO>();
1.5 private StringBuilder report = new StringBuilder();
1.6
1.7 - private Chip chip = Chip.Unknown;
1.8 -
1.9 // I/O Ports
1.10 private ushort[] REGISTER_PORTS = new ushort[] { 0x2e, 0x4e };
1.11 private ushort[] VALUE_PORTS = new ushort[] { 0x2f, 0x4f };
1.12 @@ -121,261 +119,290 @@
1.13 WinRing0.WriteIoPortByte(registerPort, 0xAA);
1.14 }
1.15
1.16 + private void ReportUnknownChip(string type, int chip) {
1.17 + report.Append("Chip ID: Unknown ");
1.18 + report.Append(type);
1.19 + report.Append(" with ID 0x");
1.20 + report.Append(chip.ToString("X", CultureInfo.InvariantCulture));
1.21 + report.Append(" at 0x");
1.22 + report.Append(registerPort.ToString("X", CultureInfo.InvariantCulture));
1.23 + report.Append("/0x");
1.24 + report.AppendLine(valuePort.ToString("X", CultureInfo.InvariantCulture));
1.25 + report.AppendLine();
1.26 + }
1.27 +
1.28 + private bool DetectWinbondFintek() {
1.29 + WinbondFintekEnter();
1.30 +
1.31 + byte logicalDeviceNumber;
1.32 + byte id = ReadByte(CHIP_ID_REGISTER);
1.33 + byte revision = ReadByte(CHIP_REVISION_REGISTER);
1.34 + Chip chip = Chip.Unknown;
1.35 + logicalDeviceNumber = 0;
1.36 + switch (id) {
1.37 + case 0x05:
1.38 + switch (revision) {
1.39 + case 0x07:
1.40 + chip = Chip.F71858;
1.41 + logicalDeviceNumber = F71858_HARDWARE_MONITOR_LDN;
1.42 + break;
1.43 + case 0x41:
1.44 + chip = Chip.F71882;
1.45 + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.46 + break;
1.47 + } break;
1.48 + case 0x06:
1.49 + switch (revision) {
1.50 + case 0x01:
1.51 + chip = Chip.F71862;
1.52 + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.53 + break;
1.54 + } break;
1.55 + case 0x07:
1.56 + switch (revision) {
1.57 + case 0x23:
1.58 + chip = Chip.F71889F;
1.59 + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.60 + break;
1.61 + } break;
1.62 + case 0x08:
1.63 + switch (revision) {
1.64 + case 0x14:
1.65 + chip = Chip.F71869;
1.66 + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.67 + break;
1.68 + } break;
1.69 + case 0x09:
1.70 + switch (revision) {
1.71 + case 0x09:
1.72 + chip = Chip.F71889ED;
1.73 + logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.74 + break;
1.75 + } break;
1.76 + case 0x52:
1.77 + switch (revision) {
1.78 + case 0x17:
1.79 + case 0x3A:
1.80 + case 0x41:
1.81 + chip = Chip.W83627HF;
1.82 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.83 + break;
1.84 + } break;
1.85 + case 0x82:
1.86 + switch (revision & 0xF0) {
1.87 + case 0x80:
1.88 + chip = Chip.W83627THF;
1.89 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.90 + break;
1.91 + } break;
1.92 + case 0x85:
1.93 + switch (revision) {
1.94 + case 0x41:
1.95 + chip = Chip.W83687THF;
1.96 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.97 + break;
1.98 + } break;
1.99 + case 0x88:
1.100 + switch (revision & 0xF0) {
1.101 + case 0x50:
1.102 + case 0x60:
1.103 + chip = Chip.W83627EHF;
1.104 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.105 + break;
1.106 + } break;
1.107 + case 0xA0:
1.108 + switch (revision & 0xF0) {
1.109 + case 0x20:
1.110 + chip = Chip.W83627DHG;
1.111 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.112 + break;
1.113 + } break;
1.114 + case 0xA5:
1.115 + switch (revision & 0xF0) {
1.116 + case 0x10:
1.117 + chip = Chip.W83667HG;
1.118 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.119 + break;
1.120 + } break;
1.121 + case 0xB0:
1.122 + switch (revision & 0xF0) {
1.123 + case 0x70:
1.124 + chip = Chip.W83627DHGP;
1.125 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.126 + break;
1.127 + } break;
1.128 + case 0xB3:
1.129 + switch (revision & 0xF0) {
1.130 + case 0x50:
1.131 + chip = Chip.W83667HGB;
1.132 + logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.133 + break;
1.134 + } break;
1.135 + }
1.136 + if (chip == Chip.Unknown) {
1.137 + if (id != 0 && id != 0xff) {
1.138 + WinbondFintekExit();
1.139 +
1.140 + ReportUnknownChip("Winbond / Fintek", ((id << 8) | revision));
1.141 + }
1.142 + } else {
1.143 +
1.144 + Select(logicalDeviceNumber);
1.145 + ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.146 + Thread.Sleep(1);
1.147 + ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
1.148 +
1.149 + ushort vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER);
1.150 +
1.151 + WinbondFintekExit();
1.152 +
1.153 + if (address != verify) {
1.154 + report.Append("Chip ID: 0x");
1.155 + report.AppendLine(chip.ToString("X"));
1.156 + report.Append("Chip revision: 0x");
1.157 + report.AppendLine(revision.ToString("X",
1.158 + CultureInfo.InvariantCulture));
1.159 + report.AppendLine("Error: Address verification failed");
1.160 + report.AppendLine();
1.161 + return false;
1.162 + }
1.163 +
1.164 + // some Fintek chips have address register offset 0x05 added already
1.165 + if ((address & 0x07) == 0x05)
1.166 + address &= 0xFFF8;
1.167 +
1.168 + if (address < 0x100 || (address & 0xF007) != 0) {
1.169 + report.Append("Chip ID: 0x");
1.170 + report.AppendLine(chip.ToString("X"));
1.171 + report.Append("Chip revision: 0x");
1.172 + report.AppendLine(revision.ToString("X",
1.173 + CultureInfo.InvariantCulture));
1.174 + report.Append("Error: Invalid address 0x");
1.175 + report.AppendLine(address.ToString("X",
1.176 + CultureInfo.InvariantCulture));
1.177 + report.AppendLine();
1.178 + return false;
1.179 + }
1.180 +
1.181 + switch (chip) {
1.182 + case Chip.W83627DHG:
1.183 + case Chip.W83627DHGP:
1.184 + case Chip.W83627EHF:
1.185 + case Chip.W83627HF:
1.186 + case Chip.W83627THF:
1.187 + case Chip.W83667HG:
1.188 + case Chip.W83667HGB:
1.189 + case Chip.W83687THF:
1.190 + superIOs.Add(new W836XX(chip, revision, address));
1.191 + break;
1.192 + case Chip.F71858:
1.193 + case Chip.F71862:
1.194 + case Chip.F71869:
1.195 + case Chip.F71882:
1.196 + case Chip.F71889ED:
1.197 + case Chip.F71889F:
1.198 + if (vendorID != FINTEK_VENDOR_ID) {
1.199 + report.Append("Chip ID: 0x");
1.200 + report.AppendLine(chip.ToString("X"));
1.201 + report.Append("Chip revision: 0x");
1.202 + report.AppendLine(revision.ToString("X",
1.203 + CultureInfo.InvariantCulture));
1.204 + report.Append("Error: Invalid vendor ID 0x");
1.205 + report.AppendLine(vendorID.ToString("X",
1.206 + CultureInfo.InvariantCulture));
1.207 + report.AppendLine();
1.208 + return false;
1.209 + }
1.210 + superIOs.Add(new F718XX(chip, address));
1.211 + break;
1.212 + default: break;
1.213 + }
1.214 +
1.215 + return true;
1.216 + }
1.217 +
1.218 + return false;
1.219 + }
1.220 +
1.221 + private bool DetectIT87() {
1.222 + IT87Enter();
1.223 +
1.224 + ushort chipID = ReadWord(CHIP_ID_REGISTER);
1.225 + Chip chip;
1.226 + switch (chipID) {
1.227 + case 0x8712: chip = Chip.IT8712F; break;
1.228 + case 0x8716: chip = Chip.IT8716F; break;
1.229 + case 0x8718: chip = Chip.IT8718F; break;
1.230 + case 0x8720: chip = Chip.IT8720F; break;
1.231 + case 0x8726: chip = Chip.IT8726F; break;
1.232 + default: chip = Chip.Unknown; break;
1.233 + }
1.234 + if (chip == Chip.Unknown) {
1.235 + if (chipID != 0 && chipID != 0xffff) {
1.236 + IT87Exit();
1.237 +
1.238 + ReportUnknownChip("ITE", chipID);
1.239 + }
1.240 + } else {
1.241 + Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
1.242 + ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.243 + Thread.Sleep(1);
1.244 + ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
1.245 +
1.246 + byte version = (byte)(ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F);
1.247 +
1.248 + IT87Exit();
1.249 +
1.250 + if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
1.251 + report.Append("Chip ID: 0x");
1.252 + report.AppendLine(chip.ToString("X"));
1.253 + report.Append("Error: Invalid address 0x");
1.254 + report.AppendLine(address.ToString("X",
1.255 + CultureInfo.InvariantCulture));
1.256 + report.AppendLine();
1.257 + return false;
1.258 + }
1.259 +
1.260 + superIOs.Add(new IT87XX(chip, address, version));
1.261 + return true;
1.262 + }
1.263 +
1.264 + return false;
1.265 + }
1.266 +
1.267 + private bool DetectSMSC() {
1.268 + SMSCEnter();
1.269 +
1.270 + ushort chipID = ReadWord(CHIP_ID_REGISTER);
1.271 + Chip chip;
1.272 + switch (chipID) {
1.273 + default: chip = Chip.Unknown; break;
1.274 + }
1.275 + if (chip == Chip.Unknown) {
1.276 + if (chipID != 0 && chipID != 0xffff) {
1.277 + SMSCExit();
1.278 +
1.279 + ReportUnknownChip("SMSC", chipID);
1.280 + }
1.281 + } else {
1.282 + SMSCExit();
1.283 + return true;
1.284 + }
1.285 +
1.286 + return false;
1.287 + }
1.288 +
1.289 private void Detect() {
1.290
1.291 for (int i = 0; i < REGISTER_PORTS.Length; i++) {
1.292 registerPort = REGISTER_PORTS[i];
1.293 valuePort = VALUE_PORTS[i];
1.294
1.295 - WinbondFintekEnter();
1.296 + if (DetectWinbondFintek()) continue;
1.297
1.298 - byte logicalDeviceNumber;
1.299 - byte id = ReadByte(CHIP_ID_REGISTER);
1.300 - byte revision = ReadByte(CHIP_REVISION_REGISTER);
1.301 - chip = Chip.Unknown;
1.302 - logicalDeviceNumber = 0;
1.303 - switch (id) {
1.304 - case 0x05:
1.305 - switch (revision) {
1.306 - case 0x07:
1.307 - chip = Chip.F71858;
1.308 - logicalDeviceNumber = F71858_HARDWARE_MONITOR_LDN;
1.309 - break;
1.310 - case 0x41:
1.311 - chip = Chip.F71882;
1.312 - logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.313 - break;
1.314 - } break;
1.315 - case 0x06:
1.316 - switch (revision) {
1.317 - case 0x01:
1.318 - chip = Chip.F71862;
1.319 - logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.320 - break;
1.321 - } break;
1.322 - case 0x07:
1.323 - switch (revision) {
1.324 - case 0x23:
1.325 - chip = Chip.F71889F;
1.326 - logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.327 - break;
1.328 - } break;
1.329 - case 0x08:
1.330 - switch (revision) {
1.331 - case 0x14:
1.332 - chip = Chip.F71869;
1.333 - logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.334 - break;
1.335 - } break;
1.336 - case 0x09:
1.337 - switch (revision) {
1.338 - case 0x09:
1.339 - chip = Chip.F71889ED;
1.340 - logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
1.341 - break;
1.342 - } break;
1.343 - case 0x52:
1.344 - switch (revision) {
1.345 - case 0x17:
1.346 - case 0x3A:
1.347 - case 0x41:
1.348 - chip = Chip.W83627HF;
1.349 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.350 - break;
1.351 - } break;
1.352 - case 0x82:
1.353 - switch (revision & 0xF0) {
1.354 - case 0x80:
1.355 - chip = Chip.W83627THF;
1.356 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.357 - break;
1.358 - } break;
1.359 - case 0x85:
1.360 - switch (revision) {
1.361 - case 0x41:
1.362 - chip = Chip.W83687THF;
1.363 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.364 - break;
1.365 - } break;
1.366 - case 0x88:
1.367 - switch (revision & 0xF0) {
1.368 - case 0x50:
1.369 - case 0x60:
1.370 - chip = Chip.W83627EHF;
1.371 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.372 - break;
1.373 - } break;
1.374 - case 0xA0:
1.375 - switch (revision & 0xF0) {
1.376 - case 0x20:
1.377 - chip = Chip.W83627DHG;
1.378 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.379 - break;
1.380 - } break;
1.381 - case 0xA5:
1.382 - switch (revision & 0xF0) {
1.383 - case 0x10:
1.384 - chip = Chip.W83667HG;
1.385 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.386 - break;
1.387 - } break;
1.388 - case 0xB0:
1.389 - switch (revision & 0xF0) {
1.390 - case 0x70:
1.391 - chip = Chip.W83627DHGP;
1.392 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.393 - break;
1.394 - } break;
1.395 - case 0xB3:
1.396 - switch (revision & 0xF0) {
1.397 - case 0x50:
1.398 - chip = Chip.W83667HGB;
1.399 - logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN;
1.400 - break;
1.401 - } break;
1.402 - }
1.403 - if (chip == Chip.Unknown) {
1.404 - if (id != 0 && id != 0xff) {
1.405 - WinbondFintekExit();
1.406 + if (DetectIT87()) continue;
1.407
1.408 - report.Append("Chip ID: Unknown Winbond / Fintek with ID 0x");
1.409 - report.AppendLine(((id << 8) | revision).ToString("X",
1.410 - CultureInfo.InvariantCulture));
1.411 - report.AppendLine();
1.412 - }
1.413 - } else {
1.414 -
1.415 - Select(logicalDeviceNumber);
1.416 - ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.417 - Thread.Sleep(1);
1.418 - ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
1.419 -
1.420 - ushort vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER);
1.421 -
1.422 - WinbondFintekExit();
1.423 -
1.424 - if (address != verify) {
1.425 - report.Append("Chip ID: 0x");
1.426 - report.AppendLine(chip.ToString("X"));
1.427 - report.Append("Chip revision: 0x");
1.428 - report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
1.429 - report.AppendLine("Error: Address verification failed");
1.430 - report.AppendLine();
1.431 - return;
1.432 - }
1.433 -
1.434 - // some Fintek chips have address register offset 0x05 added already
1.435 - if ((address & 0x07) == 0x05)
1.436 - address &= 0xFFF8;
1.437 -
1.438 - if (address < 0x100 || (address & 0xF007) != 0) {
1.439 - report.Append("Chip ID: 0x");
1.440 - report.AppendLine(chip.ToString("X"));
1.441 - report.Append("Chip revision: 0x");
1.442 - report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
1.443 - report.Append("Error: Invalid address 0x");
1.444 - report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture));
1.445 - report.AppendLine();
1.446 - return;
1.447 - }
1.448 -
1.449 - switch (chip) {
1.450 - case Chip.W83627DHG:
1.451 - case Chip.W83627DHGP:
1.452 - case Chip.W83627EHF:
1.453 - case Chip.W83627HF:
1.454 - case Chip.W83627THF:
1.455 - case Chip.W83667HG:
1.456 - case Chip.W83667HGB:
1.457 - case Chip.W83687THF:
1.458 - superIOs.Add(new W836XX(chip, revision, address));
1.459 - break;
1.460 - case Chip.F71858:
1.461 - case Chip.F71862:
1.462 - case Chip.F71869:
1.463 - case Chip.F71882:
1.464 - case Chip.F71889ED:
1.465 - case Chip.F71889F:
1.466 - if (vendorID != FINTEK_VENDOR_ID) {
1.467 - report.Append("Chip ID: 0x");
1.468 - report.AppendLine(chip.ToString("X"));
1.469 - report.Append("Chip revision: 0x");
1.470 - report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture));
1.471 - report.Append("Error: Invalid vendor ID 0x");
1.472 - report.AppendLine(vendorID.ToString("X", CultureInfo.InvariantCulture));
1.473 - report.AppendLine();
1.474 - return;
1.475 - }
1.476 - superIOs.Add(new F718XX(chip, address));
1.477 - break;
1.478 - default: break;
1.479 - }
1.480 -
1.481 - return;
1.482 - }
1.483 -
1.484 - IT87Enter();
1.485 -
1.486 - ushort chipID = ReadWord(CHIP_ID_REGISTER);
1.487 - switch (chipID) {
1.488 - case 0x8712: chip = Chip.IT8712F; break;
1.489 - case 0x8716: chip = Chip.IT8716F; break;
1.490 - case 0x8718: chip = Chip.IT8718F; break;
1.491 - case 0x8720: chip = Chip.IT8720F; break;
1.492 - case 0x8726: chip = Chip.IT8726F; break;
1.493 - default: chip = Chip.Unknown; break;
1.494 - }
1.495 - if (chip == Chip.Unknown) {
1.496 - if (chipID != 0 && chipID != 0xffff) {
1.497 - IT87Exit();
1.498 -
1.499 - report.Append("Chip ID: Unknown ITE with ID 0x");
1.500 - report.AppendLine(chipID.ToString("X", CultureInfo.InvariantCulture));
1.501 - report.AppendLine();
1.502 - }
1.503 - } else {
1.504 - Select(IT87_ENVIRONMENT_CONTROLLER_LDN);
1.505 - ushort address = ReadWord(BASE_ADDRESS_REGISTER);
1.506 - Thread.Sleep(1);
1.507 - ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
1.508 -
1.509 - byte version = (byte)(ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F);
1.510 -
1.511 - IT87Exit();
1.512 -
1.513 - if (address != verify || address < 0x100 || (address & 0xF007) != 0) {
1.514 - report.Append("Chip ID: 0x");
1.515 - report.AppendLine(chip.ToString("X"));
1.516 - report.Append("Error: Invalid address 0x");
1.517 - report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture));
1.518 - report.AppendLine();
1.519 - return;
1.520 - }
1.521 -
1.522 - superIOs.Add(new IT87XX(chip, address, version));
1.523 -
1.524 - return;
1.525 - }
1.526 -
1.527 - SMSCEnter();
1.528 -
1.529 - chipID = ReadWord(CHIP_ID_REGISTER);
1.530 - switch (chipID) {
1.531 - default: chip = Chip.Unknown; break;
1.532 - }
1.533 - if (chip == Chip.Unknown) {
1.534 - if (chipID != 0 && chipID != 0xffff) {
1.535 - SMSCExit();
1.536 -
1.537 - report.Append("Chip ID: Unknown SMSC with ID 0x");
1.538 - report.AppendLine(chipID.ToString("X", CultureInfo.InvariantCulture));
1.539 - report.AppendLine();
1.540 - }
1.541 - } else {
1.542 - SMSCExit();
1.543 -
1.544 - return;
1.545 - }
1.546 + if (DetectSMSC()) continue;
1.547 }
1.548 }
1.549