private void DisableIOSpaceLock() { if (Chip != Chip.NCT6791D && Chip != Chip.NCT6792D && Chip != Chip.NCT6792DA && Chip != Chip.NCT6793D && Chip != Chip.NCT6795D && Chip != Chip.NCT6796D && Chip != Chip.NCT6796DR && Chip != Chip.NCT6797D && Chip != Chip.NCT6798D) { return; } // the lock is disabled already if the vendor ID can be read if (IsNuvotonVendor()) { return; } _lpcPort.WinbondNuvotonFintekEnter(); _lpcPort.NuvotonDisableIOSpaceLock(); _lpcPort.WinbondNuvotonFintekExit(); }
private bool DetectWinbondFintek(LpcPort port) { port.WinbondNuvotonFintekEnter(); byte logicalDeviceNumber = 0; byte id = port.ReadByte(CHIP_ID_REGISTER); byte revision = port.ReadByte(CHIP_REVISION_REGISTER); Chip chip = Chip.Unknown; switch (id) { case 0x05: { switch (revision) { case 0x07: { chip = Chip.F71858; logicalDeviceNumber = F71858_HARDWARE_MONITOR_LDN; break; } case 0x41: { chip = Chip.F71882; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x06: { switch (revision) { case 0x01: { chip = Chip.F71862; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x07: { switch (revision) { case 0x23: { chip = Chip.F71889F; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x08: { switch (revision) { case 0x14: { chip = Chip.F71869; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x09: { switch (revision) { case 0x01: { chip = Chip.F71808E; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } case 0x09: { chip = Chip.F71889ED; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x10: { switch (revision) { case 0x05: { chip = Chip.F71889AD; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } case 0x07: { chip = Chip.F71869A; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x11: { switch (revision) { case 0x06: { chip = Chip.F71878AD; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } case 0x18: { chip = Chip.F71811; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } } break; } case 0x52: { switch (revision) { case 0x17: case 0x3A: case 0x41: { chip = Chip.W83627HF; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0x82: { switch (revision & 0xF0) { case 0x80: { chip = Chip.W83627THF; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0x85: { switch (revision) { case 0x41: { chip = Chip.W83687THF; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0x88: { switch (revision & 0xF0) { case 0x50: case 0x60: { chip = Chip.W83627EHF; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xA0: { switch (revision & 0xF0) { case 0x20: { chip = Chip.W83627DHG; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xA5: { switch (revision & 0xF0) { case 0x10: { chip = Chip.W83667HG; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xB0: { switch (revision & 0xF0) { case 0x70: { chip = Chip.W83627DHGP; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xB3: { switch (revision & 0xF0) { case 0x50: { chip = Chip.W83667HGB; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xB4: { switch (revision & 0xF0) { case 0x70: { chip = Chip.NCT6771F; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xC3: { switch (revision & 0xF0) { case 0x30: { chip = Chip.NCT6776F; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xC4: { switch (revision & 0xF0) { case 0x50: { chip = Chip.NCT610XD; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xC5: { switch (revision & 0xF0) { case 0x60: { chip = Chip.NCT6779D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xC8: { switch (revision) { case 0x03: { chip = Chip.NCT6791D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xC9: { switch (revision) { case 0x11: { chip = Chip.NCT6792D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } case 0x13: { chip = Chip.NCT6792DA; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xD1: { switch (revision) { case 0x21: { chip = Chip.NCT6793D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xD3: { switch (revision) { case 0x52: { chip = Chip.NCT6795D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } case 0xD4: { switch (revision) { case 0x23: { chip = Chip.NCT6796D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } case 0x2A: { chip = Chip.NCT6796DR; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } case 0x51: { chip = Chip.NCT6797D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } case 0x2B: { chip = Chip.NCT6798D; logicalDeviceNumber = WINBOND_NUVOTON_HARDWARE_MONITOR_LDN; break; } } break; } } if (chip == Chip.Unknown) { if (id != 0 && id != 0xff) { port.WinbondNuvotonFintekExit(); ReportUnknownChip(port, "Winbond / Nuvoton / Fintek", (id << 8) | revision); } } else { port.Select(logicalDeviceNumber); ushort address = port.ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); ushort verify = port.ReadWord(BASE_ADDRESS_REGISTER); ushort vendorId = port.ReadWord(FINTEK_VENDOR_ID_REGISTER); // disable the hardware monitor i/o space lock on NCT679XD chips if (address == verify && (chip == Chip.NCT6791D || chip == Chip.NCT6792D || chip == Chip.NCT6792DA || chip == Chip.NCT6793D || chip == Chip.NCT6795D || chip == Chip.NCT6796D || chip == Chip.NCT6796DR || chip == Chip.NCT6798D || chip == Chip.NCT6797D)) { port.NuvotonDisableIOSpaceLock(); } port.WinbondNuvotonFintekExit(); if (address != verify) { _report.Append("Chip ID: 0x"); _report.AppendLine(chip.ToString("X")); _report.Append("Chip revision: 0x"); _report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture)); _report.AppendLine("Error: Address verification failed"); _report.AppendLine(); return(false); } // some Fintek chips have address register offset 0x05 added already if ((address & 0x07) == 0x05) { address &= 0xFFF8; } if (address < 0x100 || (address & 0xF007) != 0) { _report.Append("Chip ID: 0x"); _report.AppendLine(chip.ToString("X")); _report.Append("Chip revision: 0x"); _report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture)); _report.Append("Error: Invalid address 0x"); _report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture)); _report.AppendLine(); return(false); } switch (chip) { case Chip.W83627DHG: case Chip.W83627DHGP: case Chip.W83627EHF: case Chip.W83627HF: case Chip.W83627THF: case Chip.W83667HG: case Chip.W83667HGB: case Chip.W83687THF: { _superIOs.Add(new W836XX(chip, revision, address)); break; } case Chip.NCT610XD: case Chip.NCT6771F: case Chip.NCT6776F: case Chip.NCT6779D: case Chip.NCT6791D: case Chip.NCT6792D: case Chip.NCT6792DA: case Chip.NCT6793D: case Chip.NCT6795D: case Chip.NCT6796D: case Chip.NCT6796DR: case Chip.NCT6797D: case Chip.NCT6798D: { _superIOs.Add(new Nct677X(chip, revision, address, port)); break; } case Chip.F71858: case Chip.F71862: case Chip.F71869: case Chip.F71878AD: case Chip.F71869A: case Chip.F71882: case Chip.F71889AD: case Chip.F71889ED: case Chip.F71889F: case Chip.F71808E: { if (vendorId != FINTEK_VENDOR_ID) { _report.Append("Chip ID: 0x"); _report.AppendLine(chip.ToString("X")); _report.Append("Chip revision: 0x"); _report.AppendLine(revision.ToString("X", CultureInfo.InvariantCulture)); _report.Append("Error: Invalid vendor ID 0x"); _report.AppendLine(vendorId.ToString("X", CultureInfo.InvariantCulture)); _report.AppendLine(); return(false); } _superIOs.Add(new F718XX(chip, address)); break; } } return(true); } return(false); }