Added support for Fintek F71862, F71869, F71889.
authormoel.mich
Mon, 01 Feb 2010 20:16:26 +0000
changeset 16e9abdc6e05af
parent 15 0e812fe67bac
child 17 7ec0cbef0350
Added support for Fintek F71862, F71869, F71889.
Hardware/LPC/Chip.cs
Hardware/LPC/F718XX.cs
Hardware/LPC/IT87XX.cs
Hardware/LPC/LPCGroup.cs
OpenHardwareMonitor.csproj
     1.1 --- a/Hardware/LPC/Chip.cs	Sun Jan 31 22:00:31 2010 +0000
     1.2 +++ b/Hardware/LPC/Chip.cs	Mon Feb 01 20:16:26 2010 +0000
     1.3 @@ -7,12 +7,15 @@
     1.4  
     1.5    public enum Chip : ushort {
     1.6      Unknown = 0,
     1.7 -    IT8716F = 0x8716,
     1.8 -    IT8718F = 0x8718,
     1.9 -    IT8720F = 0x8720,
    1.10 -    IT8726F = 0x8726,
    1.11 +    IT8716 = 0x8716,
    1.12 +    IT8718 = 0x8718,
    1.13 +    IT8720 = 0x8720,
    1.14 +    IT8726 = 0x8726,
    1.15      W83627DHG = 0xA020,
    1.16 -    F71882FG = 0x0541
    1.17 +    F71862 = 0x0601, 
    1.18 +    F71869 = 0x0814,
    1.19 +    F71882 = 0x0541,
    1.20 +    F71889 = 0x0723 
    1.21    }
    1.22  
    1.23  }
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/Hardware/LPC/F718XX.cs	Mon Feb 01 20:16:26 2010 +0000
     2.3 @@ -0,0 +1,199 @@
     2.4 +/*
     2.5 +  
     2.6 +  Version: MPL 1.1/GPL 2.0/LGPL 2.1
     2.7 +
     2.8 +  The contents of this file are subject to the Mozilla Public License Version
     2.9 +  1.1 (the "License"); you may not use this file except in compliance with
    2.10 +  the License. You may obtain a copy of the License at
    2.11 + 
    2.12 +  http://www.mozilla.org/MPL/
    2.13 +
    2.14 +  Software distributed under the License is distributed on an "AS IS" basis,
    2.15 +  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    2.16 +  for the specific language governing rights and limitations under the License.
    2.17 +
    2.18 +  The Original Code is the Open Hardware Monitor code.
    2.19 +
    2.20 +  The Initial Developer of the Original Code is 
    2.21 +  Michael Möller <m.moeller@gmx.ch>.
    2.22 +  Portions created by the Initial Developer are Copyright (C) 2009-2010
    2.23 +  the Initial Developer. All Rights Reserved.
    2.24 +
    2.25 +  Contributor(s):
    2.26 +
    2.27 +  Alternatively, the contents of this file may be used under the terms of
    2.28 +  either the GNU General Public License Version 2 or later (the "GPL"), or
    2.29 +  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
    2.30 +  in which case the provisions of the GPL or the LGPL are applicable instead
    2.31 +  of those above. If you wish to allow use of your version of this file only
    2.32 +  under the terms of either the GPL or the LGPL, and not to allow others to
    2.33 +  use your version of this file under the terms of the MPL, indicate your
    2.34 +  decision by deleting the provisions above and replace them with the notice
    2.35 +  and other provisions required by the GPL or the LGPL. If you do not delete
    2.36 +  the provisions above, a recipient may use your version of this file under
    2.37 +  the terms of any one of the MPL, the GPL or the LGPL.
    2.38 + 
    2.39 +*/
    2.40 +
    2.41 +using System;
    2.42 +using System.Collections.Generic;
    2.43 +using System.Drawing;
    2.44 +using System.Text;
    2.45 +
    2.46 +namespace OpenHardwareMonitor.Hardware.LPC {
    2.47 +  public class F718XX  : IHardware {
    2.48 +
    2.49 +    private string name;
    2.50 +    private Image icon;
    2.51 +
    2.52 +    private Chip chip;
    2.53 +    private ushort address;
    2.54 +
    2.55 +    private List<ISensor> active = new List<ISensor>();
    2.56 +
    2.57 +    private Sensor[] temperatures;
    2.58 +    private Sensor[] fans;
    2.59 +    private Sensor[] voltages;
    2.60 +    private float[] voltageGains;
    2.61 +
    2.62 +    // Hardware Monitor
    2.63 +    private const byte ADDRESS_REGISTER_OFFSET = 0x05;
    2.64 +    private const byte DATA_REGISTER_OFFSET = 0x06;
    2.65 +
    2.66 +    // Hardware Monitor Registers
    2.67 +    private const byte VOLTAGE_BASE_REG = 0x20;
    2.68 +    private const byte TEMPERATURE_BASE_REG = 0x72;
    2.69 +    private byte[] FAN_TACHOMETER_REG = new byte[] { 0xA0, 0xB0, 0xC0, 0xD0 };
    2.70 +    
    2.71 +    private byte ReadByte(byte register) {
    2.72 +      WinRing0.WriteIoPortByte(
    2.73 +        (ushort)(address + ADDRESS_REGISTER_OFFSET), register);
    2.74 +      return WinRing0.ReadIoPortByte((ushort)(address + DATA_REGISTER_OFFSET));
    2.75 +    }
    2.76 +
    2.77 +    public F718XX(Chip chip, ushort address) {
    2.78 +      this.chip = chip;
    2.79 +      this.address = address;
    2.80 +
    2.81 +      switch (chip) {
    2.82 +        case Chip.F71862: name = "Fintek F71862"; break;
    2.83 +        case Chip.F71869: name = "Fintek F71869"; break;
    2.84 +        case Chip.F71882: name = "Fintek F71882"; break;
    2.85 +        case Chip.F71889: name = "Fintek F71889"; break;
    2.86 +        default: return;
    2.87 +      }
    2.88 +
    2.89 +      temperatures = new Sensor[3];
    2.90 +      for (int i = 0; i < temperatures.Length; i++)
    2.91 +        temperatures[i] = new Sensor("Temperature #" + (i + 1), i,
    2.92 +          SensorType.Temperature, this);
    2.93 +
    2.94 +      fans = new Sensor[4];
    2.95 +      for (int i = 0; i < fans.Length; i++)
    2.96 +        fans[i] = new Sensor("Fan #" + (i + 1), i, SensorType.Fan, this);
    2.97 +
    2.98 +      voltageGains = new float[] { 1, 0.5f, 1, 1, 1, 1, 1, 1, 1 };
    2.99 +      voltages = new Sensor[4];
   2.100 +      voltages[0] = new Sensor("VCC3V", 0, SensorType.Voltage, this);
   2.101 +      voltages[1] = new Sensor("CPU VCore", 1, SensorType.Voltage, this);      
   2.102 +      voltages[2] = new Sensor("VSB3V", 7, SensorType.Voltage, this);
   2.103 +      voltages[3] = new Sensor("Battery", 8, SensorType.Voltage, this);
   2.104 +
   2.105 +      this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
   2.106 +    }
   2.107 +
   2.108 +    public string Name {
   2.109 +      get { return name; }
   2.110 +    }
   2.111 +
   2.112 +    public string Identifier {
   2.113 +      get { return "/lpc/f71882fg"; }
   2.114 +    }
   2.115 +
   2.116 +    public Image Icon {
   2.117 +      get { return icon; }
   2.118 +    }
   2.119 +
   2.120 +    public ISensor[] Sensors {
   2.121 +      get { return active.ToArray(); }
   2.122 +    }
   2.123 +
   2.124 +    public string GetReport() {
   2.125 +      StringBuilder r = new StringBuilder();
   2.126 +
   2.127 +      r.AppendLine("LPC F718XX");
   2.128 +      r.AppendLine();
   2.129 +      r.Append("Base Adress: 0x"); r.AppendLine(address.ToString("X4"));
   2.130 +      r.AppendLine();
   2.131 +      r.AppendLine("Hardware Monitor Registers");
   2.132 +      r.AppendLine();
   2.133 +
   2.134 +      r.AppendLine("      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
   2.135 +      r.AppendLine();
   2.136 +      for (int i = 0; i <= 0xF; i++) {
   2.137 +        r.Append(" "); r.Append((i << 4).ToString("X2")); r.Append("  ");
   2.138 +        for (int j = 0; j <= 0xF; j++) {
   2.139 +          r.Append(" ");
   2.140 +          r.Append(ReadByte((byte)((i << 4) | j)).ToString("X2"));
   2.141 +        }
   2.142 +        r.AppendLine();
   2.143 +      }
   2.144 +      r.AppendLine();
   2.145 +      return r.ToString();
   2.146 +    }
   2.147 +
   2.148 +    public void Update() {
   2.149 +
   2.150 +      foreach (Sensor sensor in voltages) {
   2.151 +        int value = ReadByte((byte)(VOLTAGE_BASE_REG + sensor.Index));
   2.152 +        sensor.Value = voltageGains[sensor.Index] * 0.001f * (value << 4);
   2.153 +        if (sensor.Value > 0)
   2.154 +          ActivateSensor(sensor);
   2.155 +        else
   2.156 +          DeactivateSensor(sensor);
   2.157 +      }
   2.158 +
   2.159 +      foreach (Sensor sensor in temperatures) {
   2.160 +        sbyte value = (sbyte)ReadByte((byte)(
   2.161 +          TEMPERATURE_BASE_REG + 2 * sensor.Index));
   2.162 +        sensor.Value = value;
   2.163 +        if (value < sbyte.MaxValue && value > 0)
   2.164 +          ActivateSensor(sensor);
   2.165 +        else
   2.166 +          DeactivateSensor(sensor);
   2.167 +      }
   2.168 +
   2.169 +      foreach (Sensor sensor in fans) {
   2.170 +        int value = ReadByte(FAN_TACHOMETER_REG[sensor.Index]) << 8;
   2.171 +        value |= ReadByte((byte)(FAN_TACHOMETER_REG[sensor.Index] + 1));
   2.172 +
   2.173 +        if (value > 0) {
   2.174 +          sensor.Value = (value < 0x0fff) ? 1.5e6f / value : 0;
   2.175 +          ActivateSensor(sensor);
   2.176 +        } else {
   2.177 +          DeactivateSensor(sensor);
   2.178 +        }
   2.179 +      }      
   2.180 +    }
   2.181 +
   2.182 +    private void ActivateSensor(Sensor sensor) {
   2.183 +      if (!active.Contains(sensor)) {
   2.184 +        active.Add(sensor);
   2.185 +        if (SensorAdded != null)
   2.186 +          SensorAdded(sensor);
   2.187 +      }
   2.188 +    }
   2.189 +
   2.190 +    private void DeactivateSensor(Sensor sensor) {
   2.191 +      if (active.Contains(sensor)) {
   2.192 +        active.Remove(sensor);
   2.193 +        if (SensorRemoved != null)
   2.194 +          SensorRemoved(sensor);
   2.195 +      }
   2.196 +    }
   2.197 +
   2.198 +    public event SensorEventHandler SensorAdded;
   2.199 +    public event SensorEventHandler SensorRemoved;
   2.200 +
   2.201 +  }
   2.202 +}
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/Hardware/LPC/IT87XX.cs	Mon Feb 01 20:16:26 2010 +0000
     3.3 @@ -0,0 +1,225 @@
     3.4 +/*
     3.5 +  
     3.6 +  Version: MPL 1.1/GPL 2.0/LGPL 2.1
     3.7 +
     3.8 +  The contents of this file are subject to the Mozilla Public License Version
     3.9 +  1.1 (the "License"); you may not use this file except in compliance with
    3.10 +  the License. You may obtain a copy of the License at
    3.11 + 
    3.12 +  http://www.mozilla.org/MPL/
    3.13 +
    3.14 +  Software distributed under the License is distributed on an "AS IS" basis,
    3.15 +  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    3.16 +  for the specific language governing rights and limitations under the License.
    3.17 +
    3.18 +  The Original Code is the Open Hardware Monitor code.
    3.19 +
    3.20 +  The Initial Developer of the Original Code is 
    3.21 +  Michael Möller <m.moeller@gmx.ch>.
    3.22 +  Portions created by the Initial Developer are Copyright (C) 2009-2010
    3.23 +  the Initial Developer. All Rights Reserved.
    3.24 +
    3.25 +  Contributor(s):
    3.26 +
    3.27 +  Alternatively, the contents of this file may be used under the terms of
    3.28 +  either the GNU General Public License Version 2 or later (the "GPL"), or
    3.29 +  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
    3.30 +  in which case the provisions of the GPL or the LGPL are applicable instead
    3.31 +  of those above. If you wish to allow use of your version of this file only
    3.32 +  under the terms of either the GPL or the LGPL, and not to allow others to
    3.33 +  use your version of this file under the terms of the MPL, indicate your
    3.34 +  decision by deleting the provisions above and replace them with the notice
    3.35 +  and other provisions required by the GPL or the LGPL. If you do not delete
    3.36 +  the provisions above, a recipient may use your version of this file under
    3.37 +  the terms of any one of the MPL, the GPL or the LGPL.
    3.38 + 
    3.39 +*/
    3.40 +
    3.41 +using System;
    3.42 +using System.Collections.Generic;
    3.43 +using System.Drawing;
    3.44 +using System.Text;
    3.45 +
    3.46 +namespace OpenHardwareMonitor.Hardware.LPC {
    3.47 +  public class IT87XX : IHardware {
    3.48 +
    3.49 +    private string name;
    3.50 +    private Image icon;
    3.51 +        
    3.52 +    private bool available = false;
    3.53 +    private Chip chip;
    3.54 +    private ushort address;
    3.55 +
    3.56 +    private Sensor[] temperatures;
    3.57 +    private Sensor[] fans;
    3.58 +    private Sensor[] voltages;
    3.59 +    private List<ISensor> active = new List<ISensor>();
    3.60 +    private float[] voltageGains;
    3.61 +   
    3.62 +    // Consts
    3.63 +    private const byte ITE_VENDOR_ID = 0x90;
    3.64 +       
    3.65 +    // Environment Controller
    3.66 +    private const byte ADDRESS_REGISTER_OFFSET = 0x05;
    3.67 +    private const byte DATA_REGISTER_OFFSET = 0x06;
    3.68 +
    3.69 +    // Environment Controller Registers    
    3.70 +    private const byte CONFIGURATION_REGISTER = 0x00;
    3.71 +    private const byte TEMPERATURE_BASE_REG = 0x29;
    3.72 +    private const byte VENDOR_ID_REGISTER = 0x58;
    3.73 +    private const byte FAN_TACHOMETER_16_BIT_ENABLE_REGISTER = 0x0c;
    3.74 +    private byte[] FAN_TACHOMETER_REG = 
    3.75 +      new byte[] { 0x0d, 0x0e, 0x0f, 0x80, 0x82 };
    3.76 +    private byte[] FAN_TACHOMETER_EXT_REG =
    3.77 +      new byte[] { 0x18, 0x19, 0x1a, 0x81, 0x83 };
    3.78 +    private const byte VOLTAGE_BASE_REG = 0x20;  
    3.79 +    
    3.80 +    private byte ReadByte(byte register) {
    3.81 +      WinRing0.WriteIoPortByte(
    3.82 +        (ushort)(address + ADDRESS_REGISTER_OFFSET), register);
    3.83 +      return WinRing0.ReadIoPortByte((ushort)(address + DATA_REGISTER_OFFSET));
    3.84 +    }
    3.85 +
    3.86 +    public IT87XX(Chip chip, ushort address) {
    3.87 +      
    3.88 +      this.chip = chip;
    3.89 +      this.address = address;
    3.90 +
    3.91 +      switch (chip) {
    3.92 +        case Chip.IT8716: name = "ITE IT8716"; break;
    3.93 +        case Chip.IT8718: name = "ITE IT8718"; break;
    3.94 +        case Chip.IT8720: name = "ITE IT8720"; break;
    3.95 +        case Chip.IT8726: name = "ITE IT8726"; break;
    3.96 +        default: return;
    3.97 +      }
    3.98 +      
    3.99 +      // Check vendor id
   3.100 +      byte vendorId = ReadByte(VENDOR_ID_REGISTER);      
   3.101 +      if (vendorId != ITE_VENDOR_ID)
   3.102 +        return;
   3.103 +
   3.104 +      // Bit 0x10 of the configuration register should always be 1
   3.105 +      if ((ReadByte(CONFIGURATION_REGISTER) & 0x10) == 0)
   3.106 +        return;
   3.107 +
   3.108 +      temperatures = new Sensor[3];
   3.109 +      for (int i = 0; i < temperatures.Length; i++) 
   3.110 +        temperatures[i] = new Sensor("Temperature #" + (i + 1), i,
   3.111 +          SensorType.Temperature, this);
   3.112 +
   3.113 +      fans = new Sensor[5];
   3.114 +      for (int i = 0; i < fans.Length; i++)
   3.115 +        fans[i] = new Sensor("Fan #" + (i + 1), i, SensorType.Fan, this);
   3.116 +
   3.117 +      voltageGains = new float[] { 
   3.118 +        1, 1, 1, (6.8f / 10 + 1), 1, 1, 1, 1, 1 };
   3.119 +
   3.120 +      voltages = new Sensor[2];
   3.121 +      voltages[0] = new Sensor("CPU VCore", 0, SensorType.Voltage, this);
   3.122 +      voltages[1] = new Sensor("Battery", 8, SensorType.Voltage, this);           
   3.123 +
   3.124 +      available = true;
   3.125 +      icon = Utilities.EmbeddedResources.GetImage("chip.png");
   3.126 +    }
   3.127 +
   3.128 +    public bool IsAvailable {
   3.129 +      get { return available; } 
   3.130 +    }
   3.131 +
   3.132 +    public string Name {
   3.133 +      get { return name; }
   3.134 +    }
   3.135 +
   3.136 +    public string Identifier {
   3.137 +      get { return "/lpc/it87"; }
   3.138 +    }
   3.139 +
   3.140 +    public Image Icon {
   3.141 +      get { return icon; }
   3.142 +    }
   3.143 +
   3.144 +    public ISensor[] Sensors {
   3.145 +      get { return active.ToArray(); }
   3.146 +    }
   3.147 +
   3.148 +    public string GetReport() {
   3.149 +      StringBuilder r = new StringBuilder();
   3.150 +
   3.151 +      r.AppendLine("LPC IT87XX");
   3.152 +      r.AppendLine();
   3.153 +      r.Append("Chip ID: 0x"); r.AppendLine(chip.ToString("X"));
   3.154 +      r.Append("Chip Name: "); r.AppendLine(name);
   3.155 +      r.Append("Base Address: 0x"); r.AppendLine(address.ToString("X4"));
   3.156 +      r.AppendLine();
   3.157 +      r.AppendLine("Environment Controller Registers");
   3.158 +      r.AppendLine();
   3.159 +
   3.160 +      r.AppendLine("      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
   3.161 +      r.AppendLine();
   3.162 +      for (int i = 0; i <= 0xA; i++) {
   3.163 +        r.Append(" "); r.Append((i << 4).ToString("X2")); r.Append("  ");
   3.164 +        for (int j = 0; j <= 0xF; j++) {
   3.165 +          r.Append(" ");
   3.166 +          r.Append(ReadByte((byte)((i << 4) | j)).ToString("X2"));
   3.167 +        }
   3.168 +        r.AppendLine();
   3.169 +      }
   3.170 +      r.AppendLine();
   3.171 +
   3.172 +      return r.ToString();
   3.173 +    }
   3.174 +
   3.175 +    public void Update() {
   3.176 +
   3.177 +      foreach (Sensor sensor in voltages) {
   3.178 +        int value = ReadByte((byte)(VOLTAGE_BASE_REG + sensor.Index));
   3.179 +        sensor.Value = voltageGains[sensor.Index] * 0.001f * (value << 4);
   3.180 +        if (sensor.Value > 0)
   3.181 +          ActivateSensor(sensor);
   3.182 +        else
   3.183 +          DeactivateSensor(sensor);
   3.184 +      }
   3.185 +
   3.186 +      foreach (Sensor sensor in temperatures) {
   3.187 +        sbyte value = (sbyte)ReadByte((byte)(TEMPERATURE_BASE_REG + sensor.Index));
   3.188 +        sensor.Value = value;
   3.189 +        if (value < sbyte.MaxValue && value > 0)
   3.190 +          ActivateSensor(sensor);
   3.191 +        else
   3.192 +          DeactivateSensor(sensor);
   3.193 +      }
   3.194 +
   3.195 +      foreach (Sensor sensor in fans) {
   3.196 +        int value = ReadByte(FAN_TACHOMETER_REG[sensor.Index]);
   3.197 +        value |= ReadByte(FAN_TACHOMETER_EXT_REG[sensor.Index]) << 8;
   3.198 +
   3.199 +        if (value > 0) {
   3.200 +          sensor.Value = (value < 0xffff) ? 1.35e6f / ((value) * 2) : 0;
   3.201 +          ActivateSensor(sensor);
   3.202 +        } else {
   3.203 +          DeactivateSensor(sensor);
   3.204 +        }
   3.205 +      }      
   3.206 +    }
   3.207 +
   3.208 +    private void ActivateSensor(Sensor sensor) {
   3.209 +      if (!active.Contains(sensor)) {
   3.210 +        active.Add(sensor);
   3.211 +        if (SensorAdded != null)
   3.212 +          SensorAdded(sensor);
   3.213 +      }
   3.214 +    }
   3.215 +
   3.216 +    private void DeactivateSensor(Sensor sensor) {
   3.217 +      if (active.Contains(sensor)) {
   3.218 +        active.Remove(sensor);
   3.219 +        if (SensorRemoved != null)
   3.220 +          SensorRemoved(sensor);
   3.221 +      }
   3.222 +    }
   3.223 +
   3.224 +    public event SensorEventHandler SensorAdded;
   3.225 +    public event SensorEventHandler SensorRemoved;
   3.226 +
   3.227 +  }
   3.228 +}
     4.1 --- a/Hardware/LPC/LPCGroup.cs	Sun Jan 31 22:00:31 2010 +0000
     4.2 +++ b/Hardware/LPC/LPCGroup.cs	Mon Feb 01 20:16:26 2010 +0000
     4.3 @@ -75,12 +75,6 @@
     4.4        WinRing0.WriteIoPortByte(valuePort, logicalDeviceNumber);
     4.5      }
     4.6  
     4.7 -    // IT87
     4.8 -    private const ushort IT8716F_CHIP_ID = 0x8716;
     4.9 -    private const ushort IT8718F_CHIP_ID = 0x8718;
    4.10 -    private const ushort IT8720F_CHIP_ID = 0x8720;
    4.11 -    private const ushort IT8726F_CHIP_ID = 0x8726;
    4.12 -
    4.13      private const byte IT87_ENVIRONMENT_CONTROLLER_LDN = 0x04;    
    4.14  
    4.15      private void IT87Enter() {
    4.16 @@ -100,7 +94,9 @@
    4.17      private const ushort FINTEK_VENDOR_ID = 0x1934;
    4.18  
    4.19      private const byte W83627DHG_HARDWARE_MONITOR_LDN = 0x0B;
    4.20 -    private const byte F71882FG_HARDWARE_MONITOR_LDN = 0x04;
    4.21 +
    4.22 +    private const byte F71858_HARDWARE_MONITOR_LDN = 0x02;
    4.23 +    private const byte FINTEK_HARDWARE_MONITOR_LDN = 0x04;
    4.24  
    4.25      private void WinbondFintekEnter() {
    4.26        WinRing0.WriteIoPortByte(registerPort, 0x87);
    4.27 @@ -121,46 +117,79 @@
    4.28  
    4.29          WinbondFintekEnter();
    4.30  
    4.31 -        byte hardwareMonitorLDN;
    4.32 +        byte logicalDeviceNumber;
    4.33          byte id = ReadByte(CHIP_ID_REGISTER);
    4.34          byte revision = ReadByte(CHIP_REVISION_REGISTER);
    4.35          switch (id) {
    4.36 +          case 0x05:
    4.37 +            switch (revision) {
    4.38 +              case 0x41:
    4.39 +                chip = Chip.F71882;
    4.40 +                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    4.41 +                break;
    4.42 +              default:
    4.43 +                chip = Chip.Unknown;
    4.44 +                logicalDeviceNumber = 0;
    4.45 +                break;
    4.46 +            } break;
    4.47 +          case 0x06:
    4.48 +            switch (revision) {             
    4.49 +              case 0x01:
    4.50 +                chip = Chip.F71862;
    4.51 +                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    4.52 +                break;
    4.53 +              default:
    4.54 +                chip = Chip.Unknown;
    4.55 +                logicalDeviceNumber = 0;
    4.56 +                break;
    4.57 +            } break;
    4.58 +          case 0x07:
    4.59 +            switch (revision) {
    4.60 +              case 0x23:
    4.61 +                chip = Chip.F71889;
    4.62 +                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    4.63 +                break;
    4.64 +              default:
    4.65 +                chip = Chip.Unknown;
    4.66 +                logicalDeviceNumber = 0;
    4.67 +                break;
    4.68 +            } break;
    4.69 +          case 0x08:
    4.70 +            switch (revision) {
    4.71 +              case 0x14:
    4.72 +                chip = Chip.F71869;
    4.73 +                logicalDeviceNumber = FINTEK_HARDWARE_MONITOR_LDN;
    4.74 +                break;
    4.75 +              default:
    4.76 +                chip = Chip.Unknown;
    4.77 +                logicalDeviceNumber = 0;
    4.78 +                break;
    4.79 +            } break;
    4.80            case 0xA0:
    4.81              switch (revision & 0xF0) {
    4.82                case 0x20: 
    4.83                  chip = Chip.W83627DHG;
    4.84 -                hardwareMonitorLDN = W83627DHG_HARDWARE_MONITOR_LDN;  
    4.85 +                logicalDeviceNumber = W83627DHG_HARDWARE_MONITOR_LDN;  
    4.86                  break;
    4.87                default: 
    4.88                  chip = Chip.Unknown;
    4.89 -                hardwareMonitorLDN = 0;
    4.90 +                logicalDeviceNumber = 0;
    4.91                  break;
    4.92 -            } break;
    4.93 -          case 0x05:
    4.94 -            switch (revision) {
    4.95 -              case 0x41: 
    4.96 -                chip = Chip.F71882FG;
    4.97 -                hardwareMonitorLDN = F71882FG_HARDWARE_MONITOR_LDN; 
    4.98 -                break;
    4.99 -              default: 
   4.100 -                chip = Chip.Unknown; 
   4.101 -                hardwareMonitorLDN = 0;
   4.102 -                break;
   4.103 -            } break;
   4.104 +            } break;          
   4.105            default:
   4.106              chip = Chip.Unknown; 
   4.107 -            hardwareMonitorLDN = 0;
   4.108 +            logicalDeviceNumber = 0;
   4.109              break;
   4.110          }
   4.111          if (chip != Chip.Unknown) {
   4.112  
   4.113 -          Select(hardwareMonitorLDN);
   4.114 +          Select(logicalDeviceNumber);
   4.115            ushort address = ReadWord(BASE_ADDRESS_REGISTER);
   4.116            Thread.Sleep(1);
   4.117            ushort verify = ReadWord(BASE_ADDRESS_REGISTER);
   4.118  
   4.119            ushort vendorID = 0;
   4.120 -          if (chip == Chip.F71882FG)
   4.121 +          if (chip == Chip.F71862 || chip == Chip.F71882 || chip == Chip.F71889)
   4.122              vendorID = ReadWord(FINTEK_VENDOR_ID_REGISTER);
   4.123  
   4.124            WinbondFintekExit();
   4.125 @@ -174,9 +203,14 @@
   4.126                if (w83627dhg.IsAvailable)
   4.127                  hardware.Add(w83627dhg);
   4.128                break;
   4.129 -            case Chip.F71882FG:  
   4.130 +            case Chip.F71862:
   4.131 +            case Chip.F71882:
   4.132 +            case Chip.F71889: 
   4.133                if (vendorID == FINTEK_VENDOR_ID)
   4.134 -                hardware.Add(new F71882(address));
   4.135 +                hardware.Add(new F718XX(chip, address));
   4.136 +              break;
   4.137 +            case Chip.F71869:
   4.138 +              hardware.Add(new F718XX(chip, address));
   4.139                break;
   4.140              default: break;
   4.141            }
   4.142 @@ -187,10 +221,10 @@
   4.143          IT87Enter();
   4.144  
   4.145          switch (ReadWord(CHIP_ID_REGISTER)) {
   4.146 -          case 0x8716: chip = Chip.IT8716F; break;
   4.147 -          case 0x8718: chip = Chip.IT8718F; break;
   4.148 -          case 0x8720: chip = Chip.IT8720F; break;
   4.149 -          case 0x8726: chip = Chip.IT8726F; break;
   4.150 +          case 0x8716: chip = Chip.IT8716; break;
   4.151 +          case 0x8718: chip = Chip.IT8718; break;
   4.152 +          case 0x8720: chip = Chip.IT8720; break;
   4.153 +          case 0x8726: chip = Chip.IT8726; break;
   4.154            default: chip = Chip.Unknown; break;
   4.155          }
   4.156  
   4.157 @@ -205,7 +239,7 @@
   4.158            if (address != verify || address == 0 || (address & 0xF007) != 0)
   4.159              return;
   4.160  
   4.161 -          IT87 it87 = new IT87(chip, address);
   4.162 +          IT87XX it87 = new IT87XX(chip, address);
   4.163            if (it87.IsAvailable)
   4.164              hardware.Add(it87);
   4.165  
     5.1 --- a/OpenHardwareMonitor.csproj	Sun Jan 31 22:00:31 2010 +0000
     5.2 +++ b/OpenHardwareMonitor.csproj	Mon Feb 01 20:16:26 2010 +0000
     5.3 @@ -63,7 +63,7 @@
     5.4      <Compile Include="Hardware\HDD\HDDGroup.cs" />
     5.5      <Compile Include="Hardware\HDD\SMART.cs" />
     5.6      <Compile Include="Hardware\LPC\Chip.cs" />
     5.7 -    <Compile Include="Hardware\LPC\F71882.cs" />
     5.8 +    <Compile Include="Hardware\LPC\F718XX.cs" />
     5.9      <Compile Include="Hardware\SMBIOS\SMBIOSGroup.cs" />
    5.10      <Compile Include="Hardware\LPC\W83627DHG.cs" />
    5.11      <Compile Include="Hardware\ReportWriter.cs" />
    5.12 @@ -84,7 +84,7 @@
    5.13      <Compile Include="Hardware\IGroup.cs" />
    5.14      <Compile Include="Hardware\IHardware.cs" />
    5.15      <Compile Include="Hardware\ISensor.cs" />
    5.16 -    <Compile Include="Hardware\LPC\IT87.cs" />
    5.17 +    <Compile Include="Hardware\LPC\IT87XX.cs" />
    5.18      <Compile Include="Hardware\LPC\LPCGroup.cs" />
    5.19      <Compile Include="GUI\MainForm.cs">
    5.20        <SubType>Form</SubType>