moel@135: /*
moel@130:   
moel@130:   Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@130: 
moel@130:   The contents of this file are subject to the Mozilla Public License Version
moel@130:   1.1 (the "License"); you may not use this file except in compliance with
moel@130:   the License. You may obtain a copy of the License at
moel@130:  
moel@130:   http://www.mozilla.org/MPL/
moel@130: 
moel@130:   Software distributed under the License is distributed on an "AS IS" basis,
moel@130:   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@130:   for the specific language governing rights and limitations under the License.
moel@130: 
moel@130:   The Original Code is the Open Hardware Monitor code.
moel@130: 
moel@130:   The Initial Developer of the Original Code is 
moel@130:   Michael Möller <m.moeller@gmx.ch>.
moel@130:   Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@130:   the Initial Developer. All Rights Reserved.
moel@130: 
moel@130:   Contributor(s):
moel@130: 
moel@130:   Alternatively, the contents of this file may be used under the terms of
moel@130:   either the GNU General Public License Version 2 or later (the "GPL"), or
moel@130:   the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@130:   in which case the provisions of the GPL or the LGPL are applicable instead
moel@130:   of those above. If you wish to allow use of your version of this file only
moel@130:   under the terms of either the GPL or the LGPL, and not to allow others to
moel@130:   use your version of this file under the terms of the MPL, indicate your
moel@130:   decision by deleting the provisions above and replace them with the notice
moel@130:   and other provisions required by the GPL or the LGPL. If you do not delete
moel@130:   the provisions above, a recipient may use your version of this file under
moel@130:   the terms of any one of the MPL, the GPL or the LGPL.
moel@130:  
moel@130: */
moel@130: 
moel@130: using System;
moel@130: using System.Collections.Generic;
moel@130: using System.Drawing;
moel@130: using OpenHardwareMonitor.Hardware.LPC;
moel@130: 
moel@130: namespace OpenHardwareMonitor.Hardware.Mainboard {
moel@130:   public class SuperIOHardware : Hardware {
moel@130: 
moel@130:     private ISuperIO superIO;
moel@130:     private Image icon;
moel@130:     protected readonly string name;
moel@130: 
moel@130:     private List<Sensor> voltages = new List<Sensor>();
moel@130:     private List<Sensor> temperatures = new List<Sensor>();
moel@130:     private List<Sensor> fans = new List<Sensor>();  
moel@130: 
moel@130:     public SuperIOHardware(ISuperIO superIO, Manufacturer manufacturer, 
moel@130:       Model model) 
moel@130:     {
moel@130:       this.superIO = superIO;
moel@130:       this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
moel@130: 
moel@130:       switch (superIO.Chip) {
moel@130:         case Chip.F71858: name = "Fintek F71858"; break;
moel@130:         case Chip.F71862: name = "Fintek F71862"; break;
moel@130:         case Chip.F71869: name = "Fintek F71869"; break;
moel@130:         case Chip.F71882: name = "Fintek F71882"; break;
moel@130:         case Chip.F71889ED: name = "Fintek F71889ED"; break;
moel@130:         case Chip.F71889F: name = "Fintek F71889F"; break;
moel@130:         case Chip.IT8712F: this.name = "ITE IT8712F"; break;
moel@130:         case Chip.IT8716F: this.name = "ITE IT8716F"; break;
moel@130:         case Chip.IT8718F: this.name = "ITE IT8718F"; break;
moel@130:         case Chip.IT8720F: this.name = "ITE IT8720F"; break;
moel@130:         case Chip.IT8726F: this.name = "ITE IT8726F"; break;
moel@130:         case Chip.W83627DHG: this.name = "Winbond W83627DHG"; break;
moel@130:         case Chip.W83627DHGP: this.name = "Winbond W83627DHG-P"; break;
moel@130:         case Chip.W83627EHF: this.name = "Winbond W83627EHF"; break;
moel@130:         case Chip.W83627HF: this.name = "Winbond W83627HF"; break;
moel@130:         case Chip.W83627THF: this.name = "Winbond W83627THF"; break;
moel@130:         case Chip.W83667HG: this.name = "Winbond W83667HG"; break;
moel@130:         case Chip.W83667HGB: this.name = "Winbond W83667HG-B"; break;
moel@130:         case Chip.W83687THF: this.name = "Winbond W83687THF"; break;
moel@135:         case Chip.Unknown: this.name = "Unkown"; break;
moel@130:       }
moel@130: 
moel@130:       List<Voltage> v = new List<Voltage>();
moel@130:       List<Temperature> t = new List<Temperature>();
moel@130:       List<Fan> f = new List<Fan>();
moel@130: 
moel@130:       switch (superIO.Chip) {
moel@130:         case Chip.IT8712F:
moel@130:         case Chip.IT8716F:
moel@130:         case Chip.IT8718F:
moel@130:         case Chip.IT8720F:
moel@130:         case Chip.IT8726F:
moel@130:           switch (manufacturer) {
moel@133:             case Manufacturer.ASUS:
moel@133:               switch (model) {
moel@133:                 case Model.Crosshair_III_Formula:
moel@133:                   v.Add(new Voltage("VBat", 8));
moel@133:                   t.Add(new Temperature("CPU", 0));
moel@133:                   for (int i = 0; i < superIO.Fans.Length; i++)
moel@133:                     f.Add(new Fan("Fan #" + (i + 1), i));
moel@133:                   break;
moel@144:                 case Model.M2N_SLI_DELUXE:                
moel@133:                   v.Add(new Voltage("CPU VCore", 0));
moel@133:                   v.Add(new Voltage("+3.3V", 1));
moel@133:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@133:                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
moel@133:                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
moel@133:                   v.Add(new Voltage("VBat", 8));
moel@133:                   t.Add(new Temperature("CPU", 0));
moel@133:                   t.Add(new Temperature("Motherboard", 1));
moel@133:                   f.Add(new Fan("CPU Fan", 0));
moel@133:                   f.Add(new Fan("Chassis Fan #1", 1));
moel@133:                   f.Add(new Fan("Power Fan", 2));
moel@133:                   break;
moel@146:                 case Model.M4A79XTD_EVO:              
moel@144:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@144:                   v.Add(new Voltage("VBat", 8));
moel@144:                   t.Add(new Temperature("CPU", 0));
moel@144:                   t.Add(new Temperature("Motherboard", 1));
moel@144:                   f.Add(new Fan("CPU Fan", 0));
moel@144:                   f.Add(new Fan("Chassis Fan #1", 1));
moel@144:                   f.Add(new Fan("Chassis Fan #2", 2));
moel@144:                   break;
moel@133:                 default:
moel@133:                   v.Add(new Voltage("CPU VCore", 0));
moel@133:                   v.Add(new Voltage("Voltage #2", 1, true));
moel@133:                   v.Add(new Voltage("Voltage #3", 2, true));
moel@133:                   v.Add(new Voltage("Voltage #4", 3, true));
moel@133:                   v.Add(new Voltage("Voltage #5", 4, true));
moel@133:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@133:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@133:                   v.Add(new Voltage("Voltage #8", 7, true));
moel@133:                   v.Add(new Voltage("VBat", 8));
moel@133:                   for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@133:                     t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@133:                   for (int i = 0; i < superIO.Fans.Length; i++)
moel@133:                     f.Add(new Fan("Fan #" + (i + 1), i));
moel@133:                   break;
moel@133:               }
moel@133:               break;
moel@130:             case Manufacturer.DFI:
moel@130:               switch (model) {
moel@130:                 case Model.LP_BI_P45_T2RS_Elite:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("FSB VTT", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
moel@130:                   v.Add(new Voltage("NB Core", 5));
moel@130:                   v.Add(new Voltage("VDIMM", 6));
moel@130:                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("CPU", 0));
moel@130:                   t.Add(new Temperature("System", 1));
moel@130:                   t.Add(new Temperature("Chipset", 2));
moel@130:                   f.Add(new Fan("Fan #1", 0));
moel@130:                   f.Add(new Fan("Fan #2", 1));
moel@130:                   f.Add(new Fan("Fan #3", 2));
moel@130:                   break;
moel@130:                 case Model.LP_DK_P55_T3eH9:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("VTT", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
moel@130:                   v.Add(new Voltage("CPU PLL", 5));
moel@130:                   v.Add(new Voltage("DRAM", 6));
moel@130:                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("Chipset", 0));
moel@130:                   t.Add(new Temperature("CPU PWM", 1));
moel@130:                   t.Add(new Temperature("CPU", 2));
moel@130:                   f.Add(new Fan("Fan #1", 0));
moel@130:                   f.Add(new Fan("Fan #2", 1));
moel@130:                   f.Add(new Fan("Fan #3", 2));
moel@130:                   break;
moel@130:                 default:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("VTT", 1, true));
moel@130:                   v.Add(new Voltage("+3.3V", 2, true));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130:                   v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
moel@130:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@130:                   v.Add(new Voltage("DRAM", 6, true));
moel@130:                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130:                     t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130:                   for (int i = 0; i < superIO.Fans.Length; i++)
moel@130:                     f.Add(new Fan("Fan #" + (i + 1), i));
moel@130:                   break;
moel@130:               }
moel@130:               break;
moel@130: 
moel@130:             case Manufacturer.Gigabyte:
moel@130:               switch (model) {
moel@130:                 case Model._965P_S3:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("DRAM", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("System", 0));
moel@130:                   t.Add(new Temperature("CPU", 1));
moel@130:                   f.Add(new Fan("CPU Fan", 0));
moel@130:                   f.Add(new Fan("System Fan", 1));
moel@130:                   break;
moel@130:                 case Model.EP45_DS3R:
moel@130:                 case Model.EP45_UD3R: 
moel@138:                 case Model.X38_DS5:    
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("DRAM", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("System", 0));
moel@130:                   t.Add(new Temperature("CPU", 1));
moel@130:                   f.Add(new Fan("CPU Fan", 0));
moel@130:                   f.Add(new Fan("System Fan #2", 1));
moel@130:                   f.Add(new Fan("Power Fan", 2));
moel@130:                   f.Add(new Fan("System Fan #1", 3));
moel@130:                   break;
moel@133:                 case Model.EX58_EXTREME:
moel@133:                   v.Add(new Voltage("CPU VCore", 0));
moel@133:                   v.Add(new Voltage("DRAM", 1));
moel@133:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@133:                   v.Add(new Voltage("VBat", 8));
moel@133:                   t.Add(new Temperature("System", 0));
moel@133:                   t.Add(new Temperature("CPU", 1));
moel@138:                   t.Add(new Temperature("Northbridge", 2));
moel@133:                   f.Add(new Fan("CPU Fan", 0));
moel@133:                   f.Add(new Fan("System Fan #2", 1));
moel@133:                   f.Add(new Fan("Power Fan", 2));
moel@133:                   f.Add(new Fan("System Fan #1", 3));
moel@133:                   break;
moel@130:                 case Model.P35_DS3:
moel@154:                 case Model.P35_DS3L:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("DRAM", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("System", 0));
moel@130:                   t.Add(new Temperature("CPU", 1));
moel@130:                   f.Add(new Fan("CPU Fan", 0));
moel@130:                   f.Add(new Fan("System Fan #1", 1));
moel@130:                   f.Add(new Fan("System Fan #2", 2));
moel@130:                   f.Add(new Fan("Power Fan", 3));
moel@130:                   break;
moel@154:                 case Model.P55_UD4:                
moel@148:                   v.Add(new Voltage("CPU VCore", 0));
moel@148:                   v.Add(new Voltage("DRAM", 1));
moel@148:                   v.Add(new Voltage("+3.3V", 2));
moel@148:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@148:                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
moel@148:                   v.Add(new Voltage("VBat", 8));
moel@148:                   t.Add(new Temperature("System", 0));
moel@148:                   t.Add(new Temperature("CPU", 2));
moel@148:                   f.Add(new Fan("CPU Fan", 0));
moel@148:                   f.Add(new Fan("System Fan #2", 1));
moel@148:                   f.Add(new Fan("Power Fan", 2));
moel@148:                   f.Add(new Fan("System Fan #1", 3));
moel@148:                   break;
moel@154:                 case Model.GA_MA770T_UD3:
moel@154:                   v.Add(new Voltage("CPU VCore", 0));
moel@154:                   v.Add(new Voltage("DRAM", 1));
moel@154:                   v.Add(new Voltage("+3.3V", 2));
moel@154:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@154:                   v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
moel@154:                   v.Add(new Voltage("VBat", 8));
moel@154:                   t.Add(new Temperature("System", 0));
moel@154:                   t.Add(new Temperature("CPU", 1));
moel@154:                   f.Add(new Fan("CPU Fan", 0));
moel@154:                   f.Add(new Fan("System Fan #1", 1));
moel@154:                   f.Add(new Fan("System Fan #2", 2));
moel@154:                   f.Add(new Fan("Power Fan", 3));
moel@154:                   break;
moel@130:                 case Model.GA_MA785GMT_UD2H:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("DRAM", 1));
moel@130:                   v.Add(new Voltage("+3.3V", 2));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@130:                   v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   t.Add(new Temperature("System", 0));
moel@130:                   t.Add(new Temperature("CPU", 1));
moel@130:                   f.Add(new Fan("CPU Fan", 0));
moel@130:                   f.Add(new Fan("System Fan", 1));
moel@130:                   f.Add(new Fan("NB Fan", 2));
moel@130:                   break;
moel@138:                 case Model.X58A_UD3R:
moel@138:                   v.Add(new Voltage("CPU VCore", 0));
moel@138:                   v.Add(new Voltage("DRAM", 1));
moel@138:                   v.Add(new Voltage("+3.3V", 2));
moel@138:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
moel@138:                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
moel@138:                   v.Add(new Voltage("VBat", 8));
moel@138:                   t.Add(new Temperature("System", 0));
moel@138:                   t.Add(new Temperature("CPU", 1));
moel@138:                   t.Add(new Temperature("Northbridge", 2));
moel@138:                   f.Add(new Fan("CPU Fan", 0));
moel@138:                   f.Add(new Fan("System Fan #2", 1));
moel@138:                   f.Add(new Fan("Power Fan", 2));
moel@138:                   f.Add(new Fan("System Fan #1", 3));
moel@138:                   break;
moel@130:                 default:
moel@130:                   v.Add(new Voltage("CPU VCore", 0));
moel@130:                   v.Add(new Voltage("DRAM", 1, true));
moel@130:                   v.Add(new Voltage("+3.3V", 2, true));
moel@130:                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
moel@130:                   v.Add(new Voltage("Voltage #5", 4, true));
moel@130:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@130:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@130:                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
moel@130:                   v.Add(new Voltage("VBat", 8));
moel@130:                   for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130:                     t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130:                   for (int i = 0; i < superIO.Fans.Length; i++)
moel@130:                     f.Add(new Fan("Fan #" + (i + 1), i));
moel@130:                   break;
moel@130:               }
moel@130:               break;
moel@130: 
moel@130:             default:
moel@130:               v.Add(new Voltage("CPU VCore", 0));
moel@130:               v.Add(new Voltage("Voltage #2", 1, true));
moel@130:               v.Add(new Voltage("Voltage #3", 2, true));
moel@130:               v.Add(new Voltage("Voltage #4", 3, true));
moel@130:               v.Add(new Voltage("Voltage #5", 4, true));
moel@130:               v.Add(new Voltage("Voltage #6", 5, true));
moel@130:               v.Add(new Voltage("Voltage #7", 6, true));
moel@130:               v.Add(new Voltage("Voltage #8", 7, true));
moel@130:               v.Add(new Voltage("VBat", 8));
moel@130:               for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130:                 t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130:               for (int i = 0; i < superIO.Fans.Length; i++)
moel@130:                 f.Add(new Fan("Fan #" + (i + 1), i));
moel@130:               break;
moel@130:           }
moel@130:           break;
moel@130:           
moel@130:         case Chip.F71858:
moel@132:           v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
moel@132:           v.Add(new Voltage("VSB3V", 1, 150, 150, 0));
moel@132:           v.Add(new Voltage("Battery", 2, 150, 150, 0));
moel@130:           for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130:             t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130:           for (int i = 0; i < superIO.Fans.Length; i++)
moel@130:             f.Add(new Fan("Fan #" + (i + 1), i));
moel@130:           break;
moel@130:         case Chip.F71862: 
moel@130:         case Chip.F71869: 
moel@130:         case Chip.F71882:
moel@130:         case Chip.F71889ED: 
moel@130:         case Chip.F71889F:
moel@132:           switch (manufacturer) {
moel@132:             case Manufacturer.EVGA:
moel@132:               switch (model) {
moel@132:                 case Model.X58_SLI_Classified:
moel@132:                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
moel@132:                   v.Add(new Voltage("CPU VCore", 1, 47, 100, 0));
moel@132:                   v.Add(new Voltage("DIMM", 2, 47, 100, 0));
moel@132:                   v.Add(new Voltage("CPU VTT", 3, 24, 100, 0));
moel@132:                   v.Add(new Voltage("IOH Vcore", 4, 24, 100, 0));
moel@132:                   v.Add(new Voltage("+5V", 5, 51, 12, 0));
moel@132:                   v.Add(new Voltage("+12V", 6, 56, 6.8f, 0));
moel@132:                   v.Add(new Voltage("3VSB", 7, 150, 150, 0));
moel@132:                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
moel@132:                   t.Add(new Temperature("CPU", 0));
moel@132:                   t.Add(new Temperature("VREG", 1));
moel@132:                   t.Add(new Temperature("System", 2));
moel@132:                   f.Add(new Fan("CPU Fan", 0));
moel@132:                   f.Add(new Fan("Power Fan", 1));
moel@132:                   f.Add(new Fan("Chassis Fan", 2));
moel@132:                   break;
moel@132:                 default:
moel@132:                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
moel@132:                   v.Add(new Voltage("CPU VCore", 1));
moel@132:                   v.Add(new Voltage("Voltage #3", 2, true));
moel@132:                   v.Add(new Voltage("Voltage #4", 3, true));
moel@132:                   v.Add(new Voltage("Voltage #5", 4, true));
moel@132:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@132:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@132:                   v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
moel@132:                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
moel@132:                   for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132:                     t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132:                   for (int i = 0; i < superIO.Fans.Length; i++)
moel@132:                     f.Add(new Fan("Fan #" + (i + 1), i));
moel@132:                   break;
moel@132:               }
moel@132:               break;
moel@132:             default:
moel@132:               v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
moel@132:               v.Add(new Voltage("CPU VCore", 1));
moel@132:               v.Add(new Voltage("Voltage #3", 2, true));
moel@132:               v.Add(new Voltage("Voltage #4", 3, true));
moel@132:               v.Add(new Voltage("Voltage #5", 4, true));
moel@132:               v.Add(new Voltage("Voltage #6", 5, true));
moel@132:               v.Add(new Voltage("Voltage #7", 6, true));
moel@132:               v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
moel@132:               v.Add(new Voltage("VBat", 8, 150, 150, 0));
moel@132:               for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132:                 t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132:               for (int i = 0; i < superIO.Fans.Length; i++)
moel@132:                 f.Add(new Fan("Fan #" + (i + 1), i));
moel@132:               break;
moel@132:           }
moel@130:           break;
moel@130: 
moel@130:         case Chip.W83627EHF:          
moel@130:           v.Add(new Voltage("CPU VCore", 0));
moel@130:           v.Add(new Voltage("Voltage #2", 1, true));
moel@130:           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
moel@130:           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
moel@130:           v.Add(new Voltage("Voltage #5", 4, true));
moel@130:           v.Add(new Voltage("Voltage #6", 5, true));
moel@130:           v.Add(new Voltage("Voltage #7", 6, true));
moel@130:           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
moel@130:           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@130:           v.Add(new Voltage("Voltage #10", 9, true));
moel@130:           t.Add(new Temperature("CPU", 0));
moel@130:           t.Add(new Temperature("Auxiliary", 1));
moel@130:           t.Add(new Temperature("System", 2));
moel@153:           f.Add(new Fan("System Fan", 0));
moel@153:           f.Add(new Fan("CPU Fan", 1));
moel@153:           f.Add(new Fan("Auxiliary Fan", 2));
moel@153:           f.Add(new Fan("CPU Fan #2", 3));
moel@153:           f.Add(new Fan("Auxiliary Fan #2", 4));
moel@130:           break;
moel@130:         case Chip.W83627DHG: 
moel@130:         case Chip.W83627DHGP:                      
moel@130:         case Chip.W83667HG:
moel@130:         case Chip.W83667HGB:
moel@152:           switch (manufacturer) {
moel@153:             case Manufacturer.ASRock:
moel@153:               switch (model) {
moel@153:                 case Model._880GMH_USB3: 
moel@153:                   v.Add(new Voltage("CPU VCore", 0));
moel@153:                   v.Add(new Voltage("+3.3V", 3, 34, 34, 0));
moel@153:                   v.Add(new Voltage("+5V", 5, 15, 7.5f, 0));
moel@153:                   v.Add(new Voltage("+12V", 6, 56, 10, 0));
moel@153:                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34, 0));
moel@153:                   v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@153:                   t.Add(new Temperature("CPU", 0));
moel@153:                   t.Add(new Temperature("Motherboard", 2));
moel@153:                   f.Add(new Fan("Chassis Fan", 0));
moel@153:                   f.Add(new Fan("CPU Fan", 1));
moel@153:                   f.Add(new Fan("Power Fan", 2));
moel@153:                   break;
moel@153:                 default:
moel@153:                   v.Add(new Voltage("CPU VCore", 0));
moel@153:                   v.Add(new Voltage("Voltage #2", 1, true));
moel@153:                   v.Add(new Voltage("AVCC", 2, 34, 34, 0));
moel@153:                   v.Add(new Voltage("3VCC", 3, 34, 34, 0));
moel@153:                   v.Add(new Voltage("Voltage #5", 4, true));
moel@153:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@153:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@153:                   v.Add(new Voltage("3VSB", 7, 34, 34, 0));
moel@153:                   v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@153:                   t.Add(new Temperature("CPU", 0));
moel@153:                   t.Add(new Temperature("Auxiliary", 1));
moel@153:                   t.Add(new Temperature("System", 2));
moel@153:                   f.Add(new Fan("System Fan", 0));
moel@153:                   f.Add(new Fan("CPU Fan", 1));
moel@153:                   f.Add(new Fan("Auxiliary Fan", 2));
moel@153:                   f.Add(new Fan("CPU Fan #2", 3));
moel@153:                   f.Add(new Fan("Auxiliary Fan #2", 4));
moel@153:                   break;
moel@153:               }
moel@153:               break;
moel@152:             case Manufacturer.ASUS:
moel@152:               switch (model) {
moel@152:                 case Model.P6X58D_E:
moel@152:                   v.Add(new Voltage("CPU VCore", 0));
moel@152:                   v.Add(new Voltage("+12V", 1, 11.5f, 1.91f, 0));
moel@152:                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34, 0));
moel@152:                   v.Add(new Voltage("+3.3V", 3, 34, 34, 0));
moel@153:                   v.Add(new Voltage("+5V", 4, 15, 7.5f, 0));
moel@152:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@152:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@152:                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34, 0));
moel@152:                   v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@152:                   t.Add(new Temperature("CPU", 0));
moel@153:                   t.Add(new Temperature("Auxiliary", 1, true));
moel@152:                   t.Add(new Temperature("Motherboard", 2));
moel@152:                   f.Add(new Fan("Chassis Fan #1", 0));
moel@153:                   f.Add(new Fan("CPU Fan", 1));
moel@153:                   f.Add(new Fan("Power Fan", 2));
moel@152:                   f.Add(new Fan("Chassis Fan #2", 3));
moel@152:                   f.Add(new Fan("Chassis Fan #3", 4));
moel@152:                   break;
moel@152:                 default:
moel@152:                   v.Add(new Voltage("CPU VCore", 0));
moel@152:                   v.Add(new Voltage("Voltage #2", 1, true));
moel@152:                   v.Add(new Voltage("AVCC", 2, 34, 34, 0));
moel@152:                   v.Add(new Voltage("3VCC", 3, 34, 34, 0));
moel@152:                   v.Add(new Voltage("Voltage #5", 4, true));
moel@152:                   v.Add(new Voltage("Voltage #6", 5, true));
moel@152:                   v.Add(new Voltage("Voltage #7", 6, true));
moel@152:                   v.Add(new Voltage("3VSB", 7, 34, 34, 0));
moel@152:                   v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@152:                   t.Add(new Temperature("CPU", 0));
moel@152:                   t.Add(new Temperature("Auxiliary", 1));
moel@152:                   t.Add(new Temperature("System", 2));
moel@153:                   f.Add(new Fan("System Fan", 0));
moel@153:                   f.Add(new Fan("CPU Fan", 1));
moel@153:                   f.Add(new Fan("Auxiliary Fan", 2));
moel@153:                   f.Add(new Fan("CPU Fan #2", 3));
moel@153:                   f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152:                   break;
moel@152:               }
moel@152:               break;
moel@152:             default:
moel@152:               v.Add(new Voltage("CPU VCore", 0));
moel@152:               v.Add(new Voltage("Voltage #2", 1, true));
moel@152:               v.Add(new Voltage("AVCC", 2, 34, 34, 0));
moel@152:               v.Add(new Voltage("3VCC", 3, 34, 34, 0));
moel@152:               v.Add(new Voltage("Voltage #5", 4, true));
moel@152:               v.Add(new Voltage("Voltage #6", 5, true));
moel@152:               v.Add(new Voltage("Voltage #7", 6, true));
moel@152:               v.Add(new Voltage("3VSB", 7, 34, 34, 0));
moel@152:               v.Add(new Voltage("VBAT", 8, 34, 34, 0));
moel@152:               t.Add(new Temperature("CPU", 0));
moel@152:               t.Add(new Temperature("Auxiliary", 1));
moel@152:               t.Add(new Temperature("System", 2));
moel@153:               f.Add(new Fan("System Fan", 0));
moel@153:               f.Add(new Fan("CPU Fan", 1));
moel@153:               f.Add(new Fan("Auxiliary Fan", 2));
moel@153:               f.Add(new Fan("CPU Fan #2", 3));
moel@153:               f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152:               break;
moel@152:           } 
moel@130:           break;
moel@130:         case Chip.W83627HF: 
moel@130:         case Chip.W83627THF: 
moel@130:         case Chip.W83687THF:
moel@130:           v.Add(new Voltage("CPU VCore", 0));
moel@130:           v.Add(new Voltage("Voltage #2", 1, true));
moel@130:           v.Add(new Voltage("Voltage #3", 2, true));
moel@130:           v.Add(new Voltage("AVCC", 3, 34, 51, 0));
moel@130:           v.Add(new Voltage("Voltage #5", 4, true));
moel@130:           v.Add(new Voltage("5VSB", 5, 34, 51, 0));
moel@130:           v.Add(new Voltage("VBAT", 6));
moel@130:           t.Add(new Temperature("CPU", 0));
moel@130:           t.Add(new Temperature("Auxiliary", 1));
moel@130:           t.Add(new Temperature("System", 2));
moel@153:           f.Add(new Fan("System Fan", 0));
moel@153:           f.Add(new Fan("CPU Fan", 1));
moel@153:           f.Add(new Fan("Auxiliary Fan", 2));
moel@130:           break;
moel@130:         default:
moel@130:           for (int i = 0; i < superIO.Voltages.Length; i++)
moel@130:             v.Add(new Voltage("Voltage #" + (i + 1), i, true));
moel@130:           for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130:             t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130:           for (int i = 0; i < superIO.Fans.Length; i++)
moel@130:             f.Add(new Fan("Fan #" + (i + 1), i));
moel@130:           break;
moel@130:       }
moel@130: 
moel@130:       string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
moel@130:       foreach (Voltage voltage in v) 
moel@130:         if (voltage.Index < superIO.Voltages.Length) {
moel@130:           Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
moel@134:             voltage.Hidden, SensorType.Voltage, this, 
moel@130:             new ParameterDescription[] {
moel@130:             new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
moel@130:               formula, voltage.Ri),
moel@130:             new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
moel@130:               formula, voltage.Rf),
moel@130:             new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
moel@130:               formula, voltage.Vf)
moel@130:             });
moel@130:           voltages.Add(sensor);
moel@130:       }
moel@130: 
moel@130:       foreach (Temperature temperature in t) 
moel@130:         if (temperature.Index < superIO.Temperatures.Length) {
moel@134:         Sensor sensor = new Sensor(temperature.Name, temperature.Index,
moel@130:           SensorType.Temperature, this, new ParameterDescription[] {
moel@130:           new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
moel@130:         });
moel@130:         temperatures.Add(sensor);
moel@130:       }
moel@130: 
moel@130:       foreach (Fan fan in f)
moel@130:         if (fan.Index < superIO.Fans.Length) {
moel@134:           Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
moel@130:             this, null);
moel@130:           fans.Add(sensor);
moel@130:         }
moel@130:     }
moel@130: 
moel@130:     public override Identifier Identifier {
moel@130:       get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
moel@130:     }
moel@130: 
moel@130:     public override Image Icon {
moel@130:       get { return icon; }
moel@130:     }
moel@130: 
moel@130:     public override string Name {
moel@130:       get { return name; }
moel@130:     }
moel@130: 
moel@130:     public override string GetReport() {
moel@130:       return superIO.GetReport();
moel@130:     }
moel@130: 
moel@130:     public override void Update() {
moel@130:       superIO.Update();
moel@130: 
moel@130:       foreach (Sensor sensor in voltages) {
moel@130:         float? value = superIO.Voltages[sensor.Index];
moel@130:         if (value.HasValue) {
moel@130:           sensor.Value = value + (value - sensor.Parameters[2].Value) *
moel@130:             sensor.Parameters[0].Value / sensor.Parameters[1].Value;
moel@130:           ActivateSensor(sensor);
moel@130:         }
moel@130:       }
moel@130: 
moel@130:       foreach (Sensor sensor in temperatures) {
moel@130:         float? value = superIO.Temperatures[sensor.Index];
moel@130:         if (value.HasValue) {
moel@130:           sensor.Value = value + sensor.Parameters[0].Value;
moel@130:           ActivateSensor(sensor);
moel@130:         }
moel@130:       }
moel@130: 
moel@130:       foreach (Sensor sensor in fans) {
moel@130:         float? value = superIO.Fans[sensor.Index];
moel@130:         if (value.HasValue) {
moel@130:           sensor.Value = value;
moel@130:           if (value.Value > 0)
moel@130:             ActivateSensor(sensor);
moel@130:         }
moel@130:       }
moel@130:     }
moel@130: 
moel@130:     private class Voltage {
moel@130:       public readonly string Name;
moel@130:       public readonly int Index;
moel@130:       public readonly float Ri;
moel@130:       public readonly float Rf;
moel@130:       public readonly float Vf;
moel@130:       public readonly bool Hidden;
moel@130: 
moel@130:       public Voltage(string name, int index) :
moel@130:         this(name, index, 0, 1, 0, false) { }
moel@130: 
moel@130:       public Voltage(string name, int index, bool hidden) :
moel@130:         this(name, index, 0, 1, 0, hidden) { }
moel@130: 
moel@130:       public Voltage(string name, int index, float ri, float rf, float vf) :
moel@130:         this(name, index, ri, rf, vf, false) { }
moel@130: 
moel@130:       public Voltage(string name, int index, float ri, float rf, float vf,
moel@130:         bool hidden) {
moel@130:         this.Name = name;
moel@130:         this.Index = index;
moel@130:         this.Ri = ri;
moel@130:         this.Rf = rf;
moel@130:         this.Vf = vf;
moel@130:         this.Hidden = hidden;
moel@130:       }
moel@130:     }
moel@130: 
moel@130:     private class Temperature {
moel@130:       public readonly string Name;
moel@130:       public readonly int Index;
moel@153:       public readonly bool Hidden;
moel@130: 
moel@153:       public Temperature(string name, int index) :
moel@153:         this(name, index, false) { }
moel@153: 
moel@153:       public Temperature(string name, int index, bool hidden) {
moel@130:         this.Name = name;
moel@130:         this.Index = index;
moel@153:         this.Hidden = hidden;
moel@130:       }
moel@130:     }
moel@130: 
moel@130:     private class Fan {
moel@130:       public readonly string Name;
moel@130:       public readonly int Index;
moel@130: 
moel@130:       public Fan(string name, int index) {
moel@130:         this.Name = name;
moel@130:         this.Index = index;
moel@130:       }
moel@130:     }
moel@130:   }
moel@130: }