public LPCIO(Mainboard.Manufacturer mainboardManufacturer, Mainboard.Model mainboardModel) { if (!WinRing0.IsAvailable) { return; } for (int i = 0; i < REGISTER_PORTS.Length; i++) { registerPort = REGISTER_PORTS[i]; valuePort = VALUE_PORTS[i]; WinbondFintekEnter(); byte logicalDeviceNumber; byte id = ReadByte(CHIP_ID_REGISTER); byte revision = ReadByte(CHIP_REVISION_REGISTER); chip = Chip.Unknown; logicalDeviceNumber = 0; 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 0x09: chip = Chip.F71889ED; logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN; break; } break; case 0x52: switch (revision) { case 0x17: case 0x3A: case 0x41: chip = Chip.W83627HF; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0x82: switch (revision) { case 0x83: chip = Chip.W83627THF; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0x85: switch (revision) { case 0x41: chip = Chip.W83687THF; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0x88: switch (revision & 0xF0) { case 0x50: case 0x60: chip = Chip.W83627EHF; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0xA0: switch (revision & 0xF0) { case 0x20: chip = Chip.W83627DHG; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0xA5: switch (revision & 0xF0) { case 0x10: chip = Chip.W83667HG; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0xB0: switch (revision & 0xF0) { case 0x70: chip = Chip.W83627DHGP; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; case 0xB3: switch (revision & 0xF0) { case 0x50: chip = Chip.W83667HGB; logicalDeviceNumber = WINBOND_HARDWARE_MONITOR_LDN; break; } break; } if (chip == Chip.Unknown) { if (id != 0 && id != 0xff) { WinbondFintekExit(); 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); Thread.Sleep(1); ushort verify = ReadWord(BASE_ADDRESS_REGISTER); ushort vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER); WinbondFintekExit(); if (address != verify) { report.Append("Chip ID: 0x"); report.AppendLine(chip.ToString("X")); report.Append("Chip revision: 0x"); report.AppendLine(revision.ToString("X")); report.AppendLine("Error: Address verification failed"); report.AppendLine(); return; } // 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")); report.Append("Error: Invalid address 0x"); report.AppendLine(address.ToString("X")); report.AppendLine(); return; } 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: W836XX w836XX = new W836XX(chip, revision, address); if (w836XX.IsAvailable) { hardware.Add(w836XX); } break; case Chip.F71858: case Chip.F71862: case Chip.F71869: case Chip.F71882: case Chip.F71889ED: case Chip.F71889F: 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")); report.Append("Error: Invalid vendor ID 0x"); report.AppendLine(vendorID.ToString("X")); report.AppendLine(); return; } hardware.Add(new F718XX(chip, address)); break; default: break; } return; } IT87Enter(); ushort chipID = ReadWord(CHIP_ID_REGISTER); switch (chipID) { 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 0x8726: chip = Chip.IT8726F; break; default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { if (chipID != 0 && chipID != 0xffff) { IT87Exit(); report.Append("Chip ID: Unknown ITE with ID 0x"); report.AppendLine(chipID.ToString("X")); report.AppendLine(); } } else { Select(IT87_ENVIRONMENT_CONTROLLER_LDN); ushort address = ReadWord(BASE_ADDRESS_REGISTER); Thread.Sleep(1); ushort verify = ReadWord(BASE_ADDRESS_REGISTER); 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")); report.AppendLine(); return; } IT87XX it87 = new IT87XX(chip, address, mainboardManufacturer, mainboardModel); if (it87.IsAvailable) { hardware.Add(it87); } return; } SMSCEnter(); chipID = ReadWord(CHIP_ID_REGISTER); switch (chipID) { default: chip = Chip.Unknown; break; } if (chip == Chip.Unknown) { if (chipID != 0 && chipID != 0xffff) { SMSCExit(); report.Append("Chip ID: Unknown SMSC with ID 0x"); report.AppendLine(chipID.ToString("X")); report.AppendLine(); } } else { SMSCExit(); return; } } }
public IT87XX(Chip chip, ushort address, Mainboard.Manufacturer mainboardManufacturer, Mainboard.Model mainboardModel) : base(chip) { this.address = address; this.addressReg = (ushort)(address + ADDRESS_REGISTER_OFFSET); this.dataReg = (ushort)(address + DATA_REGISTER_OFFSET); // Check vendor id bool valid; byte vendorId = ReadByte(VENDOR_ID_REGISTER, out valid); if (!valid || vendorId != ITE_VENDOR_ID) { return; } // Bit 0x10 of the configuration register should always be 1 if ((ReadByte(CONFIGURATION_REGISTER, out valid) & 0x10) == 0) { return; } if (!valid) { return; } string[] temperatureLabels; List <Voltage> voltageConfigs = new List <Voltage>(); switch (mainboardManufacturer) { case Mainboard.Manufacturer.DFI: switch (mainboardModel) { case Mainboard.Model.LP_BI_P45_T2RS_Elite: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("FSB VTT", 1)); voltageConfigs.Add(new Voltage("+3.3V", 2)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0)); voltageConfigs.Add(new Voltage("NB Core", 5)); voltageConfigs.Add(new Voltage("VDIMM", 6)); voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("VBat", 8)); temperatureLabels = new string[] { "CPU", "System", "Chipset" }; break; case Mainboard.Model.LP_DK_P55_T3eH9: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("VTT", 1)); voltageConfigs.Add(new Voltage("+3.3V", 2)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0)); voltageConfigs.Add(new Voltage("CPU PLL", 5)); voltageConfigs.Add(new Voltage("DRAM", 6)); voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("VBat", 8)); temperatureLabels = new string[] { "Chipset", "CPU PWM", "CPU" }; break; default: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("VTT", 1, true)); voltageConfigs.Add(new Voltage("+3.3V", 2, true)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true)); voltageConfigs.Add(new Voltage("+12V", 4, 30, 10, 0, true)); voltageConfigs.Add(new Voltage("Voltage #6", 5, true)); voltageConfigs.Add(new Voltage("DRAM", 6, true)); voltageConfigs.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true)); voltageConfigs.Add(new Voltage("VBat", 8)); temperatureLabels = new string[] { "Temperature #1", "Temperature #2", "Temperature #3" }; break; } break; case Mainboard.Manufacturer.Gigabyte: switch (mainboardModel) { case Mainboard.Model.EP45_DS3R: case Mainboard.Model.P35_DS3: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("DRAM", 1)); voltageConfigs.Add(new Voltage("+3.3V", 2)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("+12V", 7, 27, 9.1f, 0)); voltageConfigs.Add(new Voltage("VBat", 8)); break; case Mainboard.Model.GA_MA785GMT_UD2H: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("DRAM", 1)); voltageConfigs.Add(new Voltage("+3.3V", 2)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0)); voltageConfigs.Add(new Voltage("+12V", 4, 27, 9.1f, 0)); voltageConfigs.Add(new Voltage("VBat", 8)); break; default: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("DRAM", 1, true)); voltageConfigs.Add(new Voltage("+3.3V", 2, true)); voltageConfigs.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true)); voltageConfigs.Add(new Voltage("Voltage #5", 4, true)); voltageConfigs.Add(new Voltage("Voltage #6", 5, true)); voltageConfigs.Add(new Voltage("Voltage #7", 6, true)); voltageConfigs.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true)); voltageConfigs.Add(new Voltage("VBat", 8)); break; } temperatureLabels = new string[] { "System", "CPU" }; break; default: voltageConfigs.Add(new Voltage("CPU VCore", 0)); voltageConfigs.Add(new Voltage("Voltage #2", 1, true)); voltageConfigs.Add(new Voltage("Voltage #3", 2, true)); voltageConfigs.Add(new Voltage("Voltage #4", 3, true)); voltageConfigs.Add(new Voltage("Voltage #5", 4, true)); voltageConfigs.Add(new Voltage("Voltage #6", 5, true)); voltageConfigs.Add(new Voltage("Voltage #7", 6, true)); voltageConfigs.Add(new Voltage("Voltage #8", 7, true)); voltageConfigs.Add(new Voltage("VBat", 8)); temperatureLabels = new string[] { "Temperature #1", "Temperature #2", "Temperature #3" }; break; } string formula = "Voltage = value + (value - Vf) * Ri / Rf."; foreach (Voltage voltage in voltageConfigs) { voltages.Add(new Sensor(voltage.Name, voltage.Index, voltage.Hidden, null, SensorType.Voltage, this, new ParameterDescription[] { new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + formula, voltage.Ri), new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + formula, voltage.Rf), new ParameterDescription("Vf [V]", "Reference voltage.\n" + formula, voltage.Vf) })); } for (int i = 0; i < temperatureLabels.Length; i++) { if (temperatureLabels[i] != null) { temperatures.Add(new Sensor(temperatureLabels[i], i, null, SensorType.Temperature, this, new ParameterDescription[] { new ParameterDescription("Offset [°C]", "Temperature offset.", 0) })); } } fans = new Sensor[5]; for (int i = 0; i < fans.Length; i++) { fans[i] = new Sensor("Fan #" + (i + 1), i, SensorType.Fan, this); } available = true; }