Exemple #1
0
        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);
        }