Esempio n. 1
0
        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;
                }
            }
        }
Esempio n. 2
0
        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;
        }