private void ReportUnknownChip(LPCPort port, string type, int chip) { report.Append("Chip ID: Unknown "); report.Append(type); report.Append(" with ID 0x"); report.Append(chip.ToString("X", CultureInfo.InvariantCulture)); report.Append(" at 0x"); report.Append(port.RegisterPort.ToString("X", CultureInfo.InvariantCulture)); report.Append("/0x"); report.AppendLine(port.ValuePort.ToString("X", CultureInfo.InvariantCulture)); report.AppendLine(); }
private void Detect() { for (int i = 0; i < REGISTER_PORTS.Length; i++) { var port = new LPCPort(REGISTER_PORTS[i], VALUE_PORTS[i]); if (DetectWinbondFintek(port)) { continue; } if (DetectIT87(port)) { continue; } if (DetectSMSC(port)) { continue; } } }
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 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.NCT610X; 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; } 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 NCT6791D chips if (address == verify && chip == Chip.NCT6791D) { 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.NCT610X: case Chip.NCT6771F: case Chip.NCT6776F: case Chip.NCT6779D: case Chip.NCT6791D: superIOs.Add(new NCT677X(chip, revision, address, port)); break; case Chip.F71858: case Chip.F71862: case Chip.F71869: 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; default: break; } return(true); } return(false); }
private bool DetectIT87(LPCPort port) { // IT87XX can enter only on port 0x2E if (port.RegisterPort != 0x2E) { return(false); } port.IT87Enter(); ushort chipID = port.ReadWord(CHIP_ID_REGISTER); Chip chip; switch (chipID) { case 0x8620: chip = Chip.IT8620E; break; case 0x8628: chip = Chip.IT8628E; break; case 0x8688: chip = Chip.IT8688E; break; case 0x8705: chip = Chip.IT8705F; break; case 0x8712: chip = Chip.IT8712F; break; case 0x8716: chip = Chip.IT8716F; break; case 0x8718: chip = Chip.IT8718F; break; case 0x8720: chip = Chip.IT8720F; break; case 0x8721: chip = Chip.IT8721F; break; case 0x8726: chip = Chip.IT8726F; break; case 0x8728: chip = Chip.IT8728F; break; case 0x8771: chip = Chip.IT8771E; break; case 0x8772: chip = Chip.IT8772E; break; default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { if (chipID != 0 && chipID != 0xffff) { port.IT87Exit(); ReportUnknownChip(port, "ITE", chipID); } } else { port.Select(IT87_ENVIRONMENT_CONTROLLER_LDN); ushort address = port.ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); ushort verify = port.ReadWord(BASE_ADDRESS_REGISTER); byte version = (byte)(port.ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F); ushort gpioAddress; ushort gpioVerify; if (chip == Chip.IT8705F) { port.Select(IT8705_GPIO_LDN); gpioAddress = port.ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); gpioVerify = port.ReadWord(BASE_ADDRESS_REGISTER); } else { port.Select(IT87XX_GPIO_LDN); gpioAddress = port.ReadWord(BASE_ADDRESS_REGISTER + 2); Thread.Sleep(1); gpioVerify = port.ReadWord(BASE_ADDRESS_REGISTER + 2); } port.IT87Exit(); if (address != verify || address < 0x100 || (address & 0xF007) != 0) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Error: Invalid address 0x"); report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture)); report.AppendLine(); return(false); } if (gpioAddress != gpioVerify || gpioAddress < 0x100 || (gpioAddress & 0xF007) != 0) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Error: Invalid GPIO address 0x"); report.AppendLine(gpioAddress.ToString("X", CultureInfo.InvariantCulture)); report.AppendLine(); return(false); } superIOs.Add(new IT87XX(chip, address, gpioAddress, version)); return(true); } return(false); }
public NCT677X(Chip chip, byte revision, ushort port, LPCPort lpcPort) { this.chip = chip; this.revision = revision; this.port = port; this.lpcPort = lpcPort; if (chip == LPC.Chip.NCT610X) { VENDOR_ID_HIGH_REGISTER = 0x80FE; VENDOR_ID_LOW_REGISTER = 0x00FE; FAN_PWM_OUT_REG = new ushort[] { 0x04A, 0x04B, 0x04C }; FAN_PWM_COMMAND_REG = new ushort[] { 0x119, 0x129, 0x139 }; FAN_CONTROL_MODE_REG = new ushort[] { 0x113, 0x123, 0x133 }; vBatMonitorControlRegister = 0x0318; } else { VENDOR_ID_HIGH_REGISTER = 0x804F; VENDOR_ID_LOW_REGISTER = 0x004F; FAN_PWM_OUT_REG = new ushort[] { 0x001, 0x003, 0x011, 0x013, 0x015, 0x017, 0x029 }; FAN_PWM_COMMAND_REG = new ushort[] { 0x109, 0x209, 0x309, 0x809, 0x909, 0xA09, 0xB09 }; FAN_CONTROL_MODE_REG = new ushort[] { 0x102, 0x202, 0x302, 0x802, 0x902, 0xA02, 0xB02 }; vBatMonitorControlRegister = 0x005D; } this.isNuvotonVendor = IsNuvotonVendor(); if (!isNuvotonVendor) { return; } switch (chip) { case Chip.NCT6771F: case Chip.NCT6776F: if (chip == Chip.NCT6771F) { fans = new double?[4]; // min RPM value with 16-bit fan counter minFanRPM = (int)(1.35e6 / 0xFFFF); temperaturesSource = new byte[] { (byte)SourceNCT6771F.PECI_0, (byte)SourceNCT6771F.CPUTIN, (byte)SourceNCT6771F.AUXTIN, (byte)SourceNCT6771F.SYSTIN }; } else { fans = new double?[5]; // min RPM value with 13-bit fan counter minFanRPM = (int)(1.35e6 / 0x1FFF); temperaturesSource = new byte[] { (byte)SourceNCT6776F.PECI_0, (byte)SourceNCT6776F.CPUTIN, (byte)SourceNCT6776F.AUXTIN, (byte)SourceNCT6776F.SYSTIN }; } fanRpmBaseRegister = new ushort[] { 0x656, 0x658, 0x65A, 0x65C, 0x65E }; controls = new double?[3]; voltages = new double?[9]; voltageRegisters = new ushort[] { 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x550, 0x551 }; voltageVBatRegister = 0x551; temperatures = new double?[4]; temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x150, 0x250, 0x62B, 0x62C, 0x62D }; temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x151, 0x251, 0x62E, 0x62E, 0x62E }; temperatureHalfBit = new int[] { -1, 7, 7, 7, 7, 7, 0, 1, 2 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x622, 0x623, 0x624, 0x625, 0x626 }; alternateTemperatureRegister = new ushort?[] { null, null, null, null }; break; 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: switch (chip) { case Chip.NCT6791D: case Chip.NCT6792D: case Chip.NCT6792DA: case Chip.NCT6793D: case Chip.NCT6795D: fans = new double?[6]; controls = new double?[6]; break; case Chip.NCT6796D: case Chip.NCT6796DR: case Chip.NCT6797D: case Chip.NCT6798D: fans = new double?[7]; controls = new double?[7]; break; default: fans = new double?[5]; controls = new double?[5]; break; } fanCountRegister = new ushort[] { 0x4B0, 0x4B2, 0x4B4, 0x4B6, 0x4B8, 0x4BA, 0x4CC }; // max value for 13-bit fan counter maxFanCount = 0x1FFF; // min value that could be transfered to 16-bit RPM registers minFanCount = 0x15; voltages = new double?[15]; voltageRegisters = new ushort[] { 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x48A, 0x48B, 0x48C, 0x48D, 0x48E }; voltageVBatRegister = 0x488; temperatures = new double?[7]; temperaturesSource = new byte[] { (byte)SourceNCT67XXD.PECI_0, (byte)SourceNCT67XXD.CPUTIN, (byte)SourceNCT67XXD.SYSTIN, (byte)SourceNCT67XXD.AUXTIN0, (byte)SourceNCT67XXD.AUXTIN1, (byte)SourceNCT67XXD.AUXTIN2, (byte)SourceNCT67XXD.AUXTIN3 }; temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x079, 0x07B, 0x150 }; temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x151 }; temperatureHalfBit = new int[] { -1, 7, 7, 7, 7, 7, 7 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x800, 0x900, 0x622 }; alternateTemperatureRegister = new ushort?[] { null, 0x491, 0x490, 0x492, 0x493, 0x494, 0x495 }; break; case Chip.NCT610X: fans = new double?[3]; controls = new double?[3]; fanRpmBaseRegister = new ushort[] { 0x030, 0x032, 0x034 }; // min value RPM value with 13-bit fan counter minFanRPM = (int)(1.35e6 / 0x1FFF); voltages = new double?[9]; voltageRegisters = new ushort[] { 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x307, 0x308, 0x309 }; voltageVBatRegister = 0x308; temperatures = new double?[4]; temperaturesSource = new byte[] { (byte)SourceNCT610X.PECI_0, (byte)SourceNCT610X.SYSTIN, (byte)SourceNCT610X.CPUTIN, (byte)SourceNCT610X.AUXTIN }; temperatureRegister = new ushort[] { 0x027, 0x018, 0x019, 0x01A }; temperatureHalfRegister = new ushort[] { 0, 0x01B, 0x11B, 0x21B }; temperatureHalfBit = new int[] { -1, 7, 7, 7 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300 }; alternateTemperatureRegister = new ushort?[] { null, 0x018, 0x019, 0x01A }; break; } }
public NCT677X(Chip chip, byte revision, ushort port, LPCPort lpcPort) { this.chip = chip; this.revision = revision; this.port = port; this.lpcPort = lpcPort; if (chip == LPC.Chip.NCT610X) { VENDOR_ID_HIGH_REGISTER = 0x80FE; VENDOR_ID_LOW_REGISTER = 0x00FE; FAN_PWM_OUT_REG = new ushort[] { 0x04A, 0x04B, 0x04C }; FAN_PWM_COMMAND_REG = new ushort[] { 0x119, 0x129, 0x139 }; FAN_CONTROL_MODE_REG = new ushort[] { 0x113, 0x123, 0x133 }; vBatMonitorControlRegister = 0x0318; } else { VENDOR_ID_HIGH_REGISTER = 0x804F; VENDOR_ID_LOW_REGISTER = 0x004F; FAN_PWM_OUT_REG = new ushort[] { 0x001, 0x003, 0x011, 0x013, 0x015, 0x017 }; FAN_PWM_COMMAND_REG = new ushort[] { 0x109, 0x209, 0x309, 0x809, 0x909, 0xA09 }; FAN_CONTROL_MODE_REG = new ushort[] { 0x102, 0x202, 0x302, 0x802, 0x902, 0xA02 }; vBatMonitorControlRegister = 0x005D; } this.isNuvotonVendor = IsNuvotonVendor(); if (!isNuvotonVendor) return; switch (chip) { case Chip.NCT6771F: case Chip.NCT6776F: if (chip == Chip.NCT6771F) { fans = new float?[4]; // min value RPM value with 16-bit fan counter minFanRPM = (int)(1.35e6 / 0xFFFF); temperaturesSource = new byte[] { (byte)SourceNCT6771F.PECI_0, (byte)SourceNCT6771F.CPUTIN, (byte)SourceNCT6771F.AUXTIN, (byte)SourceNCT6771F.SYSTIN }; } else { fans = new float?[5]; // min value RPM value with 13-bit fan counter minFanRPM = (int)(1.35e6 / 0x1FFF); temperaturesSource = new byte[] { (byte)SourceNCT6776F.PECI_0, (byte)SourceNCT6776F.CPUTIN, (byte)SourceNCT6776F.AUXTIN, (byte)SourceNCT6776F.SYSTIN }; } fanRpmBaseRegister = 0x656; controls = new float?[3]; voltages = new float?[9]; voltageRegisters = new ushort[] { 0x020, 0x021, 0x022, 0x023, 0x024, 0x025, 0x026, 0x550, 0x551 }; voltageVBatRegister = 0x551; temperatures = new float?[4]; temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x150, 0x250, 0x62B, 0x62C, 0x62D }; temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x151, 0x251, 0x62E, 0x62E, 0x62E }; temperatureHalfBit = new int[] { -1, 7, 7, 7, 7, 7, 0, 1, 2 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x622, 0x623, 0x624, 0x625, 0x626 }; alternateTemperatureRegister = new ushort?[] { null, null, null, null }; break; case Chip.NCT6779D: case Chip.NCT6791D: if (chip == Chip.NCT6779D) { fans = new float?[5]; controls = new float?[5]; } else { fans = new float?[6]; controls = new float?[6]; } fanRpmBaseRegister = 0x4C0; // min value RPM value with 13-bit fan counter minFanRPM = (int)(1.35e6 / 0x1FFF); voltages = new float?[15]; voltageRegisters = new ushort[] { 0x480, 0x481, 0x482, 0x483, 0x484, 0x485, 0x486, 0x487, 0x488, 0x489, 0x48A, 0x48B, 0x48C, 0x48D, 0x48E }; voltageVBatRegister = 0x488; temperatures = new float?[7]; temperaturesSource = new byte[] { (byte)SourceNCT67XXD.PECI_0, (byte)SourceNCT67XXD.CPUTIN, (byte)SourceNCT67XXD.SYSTIN, (byte)SourceNCT67XXD.AUXTIN0, (byte)SourceNCT67XXD.AUXTIN1, (byte)SourceNCT67XXD.AUXTIN2, (byte)SourceNCT67XXD.AUXTIN3 }; temperatureRegister = new ushort[] { 0x027, 0x073, 0x075, 0x077, 0x079, 0x07B, 0x150 }; temperatureHalfRegister = new ushort[] { 0, 0x074, 0x076, 0x078, 0x07A, 0x07C, 0x151 }; temperatureHalfBit = new int[] { -1, 7, 7, 7, 7, 7, 7 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300, 0x800, 0x900, 0x622 }; alternateTemperatureRegister = new ushort?[] {null, 0x491, 0x490, 0x492, 0x493, 0x494, 0x495 }; break; case Chip.NCT610X: fans = new float?[3]; controls = new float?[3]; fanRpmBaseRegister = 0x030; // min value RPM value with 13-bit fan counter minFanRPM = (int)(1.35e6 / 0x1FFF); voltages = new float?[9]; voltageRegisters = new ushort[] { 0x300, 0x301, 0x302, 0x303, 0x304, 0x305, 0x307, 0x308, 0x309 }; voltageVBatRegister = 0x308; temperatures = new float?[4]; temperaturesSource = new byte[] { (byte)SourceNCT610X.PECI_0, (byte)SourceNCT610X.SYSTIN, (byte)SourceNCT610X.CPUTIN, (byte)SourceNCT610X.AUXTIN }; temperatureRegister = new ushort[] { 0x027, 0x018, 0x019, 0x01A }; temperatureHalfRegister = new ushort[] { 0, 0x01B, 0x11B, 0x21B }; temperatureHalfBit = new int[] { -1, 7, 7, 7 }; temperatureSourceRegister = new ushort[] { 0x621, 0x100, 0x200, 0x300 }; alternateTemperatureRegister = new ushort?[] {null, 0x018, 0x019, 0x01A }; break; } }
private void Detect() { for (int i = 0; i < REGISTER_PORTS.Length; i++) { var port = new LPCPort(REGISTER_PORTS[i], VALUE_PORTS[i]); if (DetectWinbondFintek(port)) continue; if (DetectIT87(port)) continue; if (DetectSMSC(port)) continue; } }
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 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.NCT610X; 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; } 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 NCT6791D chips if (address == verify && chip == Chip.NCT6791D) { 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.NCT610X: case Chip.NCT6771F: case Chip.NCT6776F: case Chip.NCT6779D: case Chip.NCT6791D: superIOs.Add(new NCT677X(chip, revision, address, port)); break; case Chip.F71858: case Chip.F71862: case Chip.F71869: 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; default: break; } return true; } return false; }
private bool DetectSMSC(LPCPort port) { port.SMSCEnter(); ushort chipID = port.ReadWord(CHIP_ID_REGISTER); Chip chip; switch (chipID) { default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { if (chipID != 0 && chipID != 0xffff) { port.SMSCExit(); ReportUnknownChip(port, "SMSC", chipID); } } else { port.SMSCExit(); return true; } return false; }
private bool DetectIT87(LPCPort port) { // IT87XX can enter only on port 0x2E if (port.RegisterPort != 0x2E) return false; port.IT87Enter(); ushort chipID = port.ReadWord(CHIP_ID_REGISTER); Chip chip; switch (chipID) { case 0x8620: chip = Chip.IT8620E; break; case 0x8628: chip = Chip.IT8628E; break; case 0x8705: chip = Chip.IT8705F; break; case 0x8712: chip = Chip.IT8712F; break; case 0x8716: chip = Chip.IT8716F; break; case 0x8718: chip = Chip.IT8718F; break; case 0x8720: chip = Chip.IT8720F; break; case 0x8721: chip = Chip.IT8721F; break; case 0x8726: chip = Chip.IT8726F; break; case 0x8728: chip = Chip.IT8728F; break; case 0x8771: chip = Chip.IT8771E; break; case 0x8772: chip = Chip.IT8772E; break; default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { if (chipID != 0 && chipID != 0xffff) { port.IT87Exit(); ReportUnknownChip(port, "ITE", chipID); } } else { port.Select(IT87_ENVIRONMENT_CONTROLLER_LDN); ushort address = port.ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); ushort verify = port.ReadWord(BASE_ADDRESS_REGISTER); byte version = (byte)(port.ReadByte(IT87_CHIP_VERSION_REGISTER) & 0x0F); ushort gpioAddress; ushort gpioVerify; if (chip == Chip.IT8705F) { port.Select(IT8705_GPIO_LDN); gpioAddress = port.ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); gpioVerify = port.ReadWord(BASE_ADDRESS_REGISTER); } else { port.Select(IT87XX_GPIO_LDN); gpioAddress = port.ReadWord(BASE_ADDRESS_REGISTER + 2); Thread.Sleep(1); gpioVerify = port.ReadWord(BASE_ADDRESS_REGISTER + 2); } port.IT87Exit(); if (address != verify || address < 0x100 || (address & 0xF007) != 0) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Error: Invalid address 0x"); report.AppendLine(address.ToString("X", CultureInfo.InvariantCulture)); report.AppendLine(); return false; } if (gpioAddress != gpioVerify || gpioAddress < 0x100 || (gpioAddress & 0xF007) != 0) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Error: Invalid GPIO address 0x"); report.AppendLine(gpioAddress.ToString("X", CultureInfo.InvariantCulture)); report.AppendLine(); return false; } superIOs.Add(new IT87XX(chip, address, gpioAddress, version)); return true; } return false; }