Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Mon, 28 Jun 2010 20:39:49 +0000
changeset 145 673c2ad36db2
parent 138 1301992d8ae5
child 146 d27bde956836
permissions -rw-r--r--
Added the ITE chip version to the report.
     1 /*
     2   
     3   Version: MPL 1.1/GPL 2.0/LGPL 2.1
     4 
     5   The contents of this file are subject to the Mozilla Public License Version
     6   1.1 (the "License"); you may not use this file except in compliance with
     7   the License. You may obtain a copy of the License at
     8  
     9   http://www.mozilla.org/MPL/
    10 
    11   Software distributed under the License is distributed on an "AS IS" basis,
    12   WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
    13   for the specific language governing rights and limitations under the License.
    14 
    15   The Original Code is the Open Hardware Monitor code.
    16 
    17   The Initial Developer of the Original Code is 
    18   Michael Möller <m.moeller@gmx.ch>.
    19   Portions created by the Initial Developer are Copyright (C) 2009-2010
    20   the Initial Developer. All Rights Reserved.
    21 
    22   Contributor(s):
    23 
    24   Alternatively, the contents of this file may be used under the terms of
    25   either the GNU General Public License Version 2 or later (the "GPL"), or
    26   the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
    27   in which case the provisions of the GPL or the LGPL are applicable instead
    28   of those above. If you wish to allow use of your version of this file only
    29   under the terms of either the GPL or the LGPL, and not to allow others to
    30   use your version of this file under the terms of the MPL, indicate your
    31   decision by deleting the provisions above and replace them with the notice
    32   and other provisions required by the GPL or the LGPL. If you do not delete
    33   the provisions above, a recipient may use your version of this file under
    34   the terms of any one of the MPL, the GPL or the LGPL.
    35  
    36 */
    37 
    38 using System;
    39 using System.Collections.Generic;
    40 using System.Drawing;
    41 using OpenHardwareMonitor.Hardware.LPC;
    42 
    43 namespace OpenHardwareMonitor.Hardware.Mainboard {
    44   public class SuperIOHardware : Hardware {
    45 
    46     private ISuperIO superIO;
    47     private Image icon;
    48     protected readonly string name;
    49 
    50     private List<Sensor> voltages = new List<Sensor>();
    51     private List<Sensor> temperatures = new List<Sensor>();
    52     private List<Sensor> fans = new List<Sensor>();  
    53 
    54     public SuperIOHardware(ISuperIO superIO, Manufacturer manufacturer, 
    55       Model model) 
    56     {
    57       this.superIO = superIO;
    58       this.icon = Utilities.EmbeddedResources.GetImage("chip.png");
    59 
    60       switch (superIO.Chip) {
    61         case Chip.F71858: name = "Fintek F71858"; break;
    62         case Chip.F71862: name = "Fintek F71862"; break;
    63         case Chip.F71869: name = "Fintek F71869"; break;
    64         case Chip.F71882: name = "Fintek F71882"; break;
    65         case Chip.F71889ED: name = "Fintek F71889ED"; break;
    66         case Chip.F71889F: name = "Fintek F71889F"; break;
    67         case Chip.IT8712F: this.name = "ITE IT8712F"; break;
    68         case Chip.IT8716F: this.name = "ITE IT8716F"; break;
    69         case Chip.IT8718F: this.name = "ITE IT8718F"; break;
    70         case Chip.IT8720F: this.name = "ITE IT8720F"; break;
    71         case Chip.IT8726F: this.name = "ITE IT8726F"; break;
    72         case Chip.W83627DHG: this.name = "Winbond W83627DHG"; break;
    73         case Chip.W83627DHGP: this.name = "Winbond W83627DHG-P"; break;
    74         case Chip.W83627EHF: this.name = "Winbond W83627EHF"; break;
    75         case Chip.W83627HF: this.name = "Winbond W83627HF"; break;
    76         case Chip.W83627THF: this.name = "Winbond W83627THF"; break;
    77         case Chip.W83667HG: this.name = "Winbond W83667HG"; break;
    78         case Chip.W83667HGB: this.name = "Winbond W83667HG-B"; break;
    79         case Chip.W83687THF: this.name = "Winbond W83687THF"; break;
    80         case Chip.Unknown: this.name = "Unkown"; break;
    81       }
    82 
    83       List<Voltage> v = new List<Voltage>();
    84       List<Temperature> t = new List<Temperature>();
    85       List<Fan> f = new List<Fan>();
    86 
    87       switch (superIO.Chip) {
    88         case Chip.IT8712F:
    89         case Chip.IT8716F:
    90         case Chip.IT8718F:
    91         case Chip.IT8720F:
    92         case Chip.IT8726F:
    93           switch (manufacturer) {
    94             case Manufacturer.ASUS:
    95               switch (model) {
    96                 case Model.Crosshair_III_Formula:
    97                   v.Add(new Voltage("VBat", 8));
    98                   t.Add(new Temperature("CPU", 0));
    99                   for (int i = 0; i < superIO.Fans.Length; i++)
   100                     f.Add(new Fan("Fan #" + (i + 1), i));
   101                   break;
   102                 case Model.M2N_SLI_DELUXE:                
   103                   v.Add(new Voltage("CPU VCore", 0));
   104                   v.Add(new Voltage("+3.3V", 1));
   105                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   106                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   107                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   108                   v.Add(new Voltage("VBat", 8));
   109                   t.Add(new Temperature("CPU", 0));
   110                   t.Add(new Temperature("Motherboard", 1));
   111                   f.Add(new Fan("CPU Fan", 0));
   112                   f.Add(new Fan("Chassis Fan #1", 1));
   113                   f.Add(new Fan("Power Fan", 2));
   114                   break;
   115                 case Model.M4A79XTD_EVO:
   116                   v.Add(new Voltage("+3.3V", 1, 18, 16, 0));
   117                   v.Add(new Voltage("CPU VCore", 2, 12, 15, 0));                  
   118                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   119                   v.Add(new Voltage("+12V", 4, 5.6f, 2.7f, 0));
   120                   v.Add(new Voltage("VBat", 8));
   121                   t.Add(new Temperature("CPU", 0));
   122                   t.Add(new Temperature("Motherboard", 1));
   123                   f.Add(new Fan("CPU Fan", 0));
   124                   f.Add(new Fan("Chassis Fan #1", 1));
   125                   f.Add(new Fan("Chassis Fan #2", 2));
   126                   break;
   127                 default:
   128                   v.Add(new Voltage("CPU VCore", 0));
   129                   v.Add(new Voltage("Voltage #2", 1, true));
   130                   v.Add(new Voltage("Voltage #3", 2, true));
   131                   v.Add(new Voltage("Voltage #4", 3, true));
   132                   v.Add(new Voltage("Voltage #5", 4, true));
   133                   v.Add(new Voltage("Voltage #6", 5, true));
   134                   v.Add(new Voltage("Voltage #7", 6, true));
   135                   v.Add(new Voltage("Voltage #8", 7, true));
   136                   v.Add(new Voltage("VBat", 8));
   137                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   138                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   139                   for (int i = 0; i < superIO.Fans.Length; i++)
   140                     f.Add(new Fan("Fan #" + (i + 1), i));
   141                   break;
   142               }
   143               break;
   144             case Manufacturer.DFI:
   145               switch (model) {
   146                 case Model.LP_BI_P45_T2RS_Elite:
   147                   v.Add(new Voltage("CPU VCore", 0));
   148                   v.Add(new Voltage("FSB VTT", 1));
   149                   v.Add(new Voltage("+3.3V", 2));
   150                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   151                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   152                   v.Add(new Voltage("NB Core", 5));
   153                   v.Add(new Voltage("VDIMM", 6));
   154                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   155                   v.Add(new Voltage("VBat", 8));
   156                   t.Add(new Temperature("CPU", 0));
   157                   t.Add(new Temperature("System", 1));
   158                   t.Add(new Temperature("Chipset", 2));
   159                   f.Add(new Fan("Fan #1", 0));
   160                   f.Add(new Fan("Fan #2", 1));
   161                   f.Add(new Fan("Fan #3", 2));
   162                   break;
   163                 case Model.LP_DK_P55_T3eH9:
   164                   v.Add(new Voltage("CPU VCore", 0));
   165                   v.Add(new Voltage("VTT", 1));
   166                   v.Add(new Voltage("+3.3V", 2));
   167                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   168                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   169                   v.Add(new Voltage("CPU PLL", 5));
   170                   v.Add(new Voltage("DRAM", 6));
   171                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   172                   v.Add(new Voltage("VBat", 8));
   173                   t.Add(new Temperature("Chipset", 0));
   174                   t.Add(new Temperature("CPU PWM", 1));
   175                   t.Add(new Temperature("CPU", 2));
   176                   f.Add(new Fan("Fan #1", 0));
   177                   f.Add(new Fan("Fan #2", 1));
   178                   f.Add(new Fan("Fan #3", 2));
   179                   break;
   180                 default:
   181                   v.Add(new Voltage("CPU VCore", 0));
   182                   v.Add(new Voltage("VTT", 1, true));
   183                   v.Add(new Voltage("+3.3V", 2, true));
   184                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   185                   v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
   186                   v.Add(new Voltage("Voltage #6", 5, true));
   187                   v.Add(new Voltage("DRAM", 6, true));
   188                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
   189                   v.Add(new Voltage("VBat", 8));
   190                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   191                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   192                   for (int i = 0; i < superIO.Fans.Length; i++)
   193                     f.Add(new Fan("Fan #" + (i + 1), i));
   194                   break;
   195               }
   196               break;
   197 
   198             case Manufacturer.Gigabyte:
   199               switch (model) {
   200                 case Model._965P_S3:
   201                   v.Add(new Voltage("CPU VCore", 0));
   202                   v.Add(new Voltage("DRAM", 1));
   203                   v.Add(new Voltage("+3.3V", 2));
   204                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   205                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   206                   v.Add(new Voltage("VBat", 8));
   207                   t.Add(new Temperature("System", 0));
   208                   t.Add(new Temperature("CPU", 1));
   209                   f.Add(new Fan("CPU Fan", 0));
   210                   f.Add(new Fan("System Fan", 1));
   211                   break;
   212                 case Model.EP45_DS3R:
   213                 case Model.EP45_UD3R: 
   214                 case Model.X38_DS5:    
   215                   v.Add(new Voltage("CPU VCore", 0));
   216                   v.Add(new Voltage("DRAM", 1));
   217                   v.Add(new Voltage("+3.3V", 2));
   218                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   219                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   220                   v.Add(new Voltage("VBat", 8));
   221                   t.Add(new Temperature("System", 0));
   222                   t.Add(new Temperature("CPU", 1));
   223                   f.Add(new Fan("CPU Fan", 0));
   224                   f.Add(new Fan("System Fan #2", 1));
   225                   f.Add(new Fan("Power Fan", 2));
   226                   f.Add(new Fan("System Fan #1", 3));
   227                   break;
   228                 case Model.EX58_EXTREME:
   229                   v.Add(new Voltage("CPU VCore", 0));
   230                   v.Add(new Voltage("DRAM", 1));
   231                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   232                   v.Add(new Voltage("VBat", 8));
   233                   t.Add(new Temperature("System", 0));
   234                   t.Add(new Temperature("CPU", 1));
   235                   t.Add(new Temperature("Northbridge", 2));
   236                   f.Add(new Fan("CPU Fan", 0));
   237                   f.Add(new Fan("System Fan #2", 1));
   238                   f.Add(new Fan("Power Fan", 2));
   239                   f.Add(new Fan("System Fan #1", 3));
   240                   break;
   241                 case Model.P35_DS3:
   242                 case Model.P35_DS3L:
   243                   v.Add(new Voltage("CPU VCore", 0));
   244                   v.Add(new Voltage("DRAM", 1));
   245                   v.Add(new Voltage("+3.3V", 2));
   246                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   247                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   248                   v.Add(new Voltage("VBat", 8));
   249                   t.Add(new Temperature("System", 0));
   250                   t.Add(new Temperature("CPU", 1));
   251                   f.Add(new Fan("CPU Fan", 0));
   252                   f.Add(new Fan("System Fan #1", 1));
   253                   f.Add(new Fan("System Fan #2", 2));
   254                   f.Add(new Fan("Power Fan", 3));
   255                   break;
   256                 case Model.GA_MA785GMT_UD2H:
   257                   v.Add(new Voltage("CPU VCore", 0));
   258                   v.Add(new Voltage("DRAM", 1));
   259                   v.Add(new Voltage("+3.3V", 2));
   260                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   261                   v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
   262                   v.Add(new Voltage("VBat", 8));
   263                   t.Add(new Temperature("System", 0));
   264                   t.Add(new Temperature("CPU", 1));
   265                   f.Add(new Fan("CPU Fan", 0));
   266                   f.Add(new Fan("System Fan", 1));
   267                   f.Add(new Fan("NB Fan", 2));
   268                   break;
   269                 case Model.X58A_UD3R:
   270                   v.Add(new Voltage("CPU VCore", 0));
   271                   v.Add(new Voltage("DRAM", 1));
   272                   v.Add(new Voltage("+3.3V", 2));
   273                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   274                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
   275                   v.Add(new Voltage("VBat", 8));
   276                   t.Add(new Temperature("System", 0));
   277                   t.Add(new Temperature("CPU", 1));
   278                   t.Add(new Temperature("Northbridge", 2));
   279                   f.Add(new Fan("CPU Fan", 0));
   280                   f.Add(new Fan("System Fan #2", 1));
   281                   f.Add(new Fan("Power Fan", 2));
   282                   f.Add(new Fan("System Fan #1", 3));
   283                   break;
   284                 default:
   285                   v.Add(new Voltage("CPU VCore", 0));
   286                   v.Add(new Voltage("DRAM", 1, true));
   287                   v.Add(new Voltage("+3.3V", 2, true));
   288                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   289                   v.Add(new Voltage("Voltage #5", 4, true));
   290                   v.Add(new Voltage("Voltage #6", 5, true));
   291                   v.Add(new Voltage("Voltage #7", 6, true));
   292                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
   293                   v.Add(new Voltage("VBat", 8));
   294                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   295                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   296                   for (int i = 0; i < superIO.Fans.Length; i++)
   297                     f.Add(new Fan("Fan #" + (i + 1), i));
   298                   break;
   299               }
   300               break;
   301 
   302             default:
   303               v.Add(new Voltage("CPU VCore", 0));
   304               v.Add(new Voltage("Voltage #2", 1, true));
   305               v.Add(new Voltage("Voltage #3", 2, true));
   306               v.Add(new Voltage("Voltage #4", 3, true));
   307               v.Add(new Voltage("Voltage #5", 4, true));
   308               v.Add(new Voltage("Voltage #6", 5, true));
   309               v.Add(new Voltage("Voltage #7", 6, true));
   310               v.Add(new Voltage("Voltage #8", 7, true));
   311               v.Add(new Voltage("VBat", 8));
   312               for (int i = 0; i < superIO.Temperatures.Length; i++)
   313                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   314               for (int i = 0; i < superIO.Fans.Length; i++)
   315                 f.Add(new Fan("Fan #" + (i + 1), i));
   316               break;
   317           }
   318           break;
   319           
   320         case Chip.F71858:
   321           v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   322           v.Add(new Voltage("VSB3V", 1, 150, 150, 0));
   323           v.Add(new Voltage("Battery", 2, 150, 150, 0));
   324           for (int i = 0; i < superIO.Temperatures.Length; i++)
   325             t.Add(new Temperature("Temperature #" + (i + 1), i));
   326           for (int i = 0; i < superIO.Fans.Length; i++)
   327             f.Add(new Fan("Fan #" + (i + 1), i));
   328           break;
   329         case Chip.F71862: 
   330         case Chip.F71869: 
   331         case Chip.F71882:
   332         case Chip.F71889ED: 
   333         case Chip.F71889F:
   334           switch (manufacturer) {
   335             case Manufacturer.EVGA:
   336               switch (model) {
   337                 case Model.X58_SLI_Classified:
   338                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   339                   v.Add(new Voltage("CPU VCore", 1, 47, 100, 0));
   340                   v.Add(new Voltage("DIMM", 2, 47, 100, 0));
   341                   v.Add(new Voltage("CPU VTT", 3, 24, 100, 0));
   342                   v.Add(new Voltage("IOH Vcore", 4, 24, 100, 0));
   343                   v.Add(new Voltage("+5V", 5, 51, 12, 0));
   344                   v.Add(new Voltage("+12V", 6, 56, 6.8f, 0));
   345                   v.Add(new Voltage("3VSB", 7, 150, 150, 0));
   346                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   347                   t.Add(new Temperature("CPU", 0));
   348                   t.Add(new Temperature("VREG", 1));
   349                   t.Add(new Temperature("System", 2));
   350                   f.Add(new Fan("CPU Fan", 0));
   351                   f.Add(new Fan("Power Fan", 1));
   352                   f.Add(new Fan("Chassis Fan", 2));
   353                   break;
   354                 default:
   355                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   356                   v.Add(new Voltage("CPU VCore", 1));
   357                   v.Add(new Voltage("Voltage #3", 2, true));
   358                   v.Add(new Voltage("Voltage #4", 3, true));
   359                   v.Add(new Voltage("Voltage #5", 4, true));
   360                   v.Add(new Voltage("Voltage #6", 5, true));
   361                   v.Add(new Voltage("Voltage #7", 6, true));
   362                   v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   363                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   364                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   365                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   366                   for (int i = 0; i < superIO.Fans.Length; i++)
   367                     f.Add(new Fan("Fan #" + (i + 1), i));
   368                   break;
   369               }
   370               break;
   371             default:
   372               v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   373               v.Add(new Voltage("CPU VCore", 1));
   374               v.Add(new Voltage("Voltage #3", 2, true));
   375               v.Add(new Voltage("Voltage #4", 3, true));
   376               v.Add(new Voltage("Voltage #5", 4, true));
   377               v.Add(new Voltage("Voltage #6", 5, true));
   378               v.Add(new Voltage("Voltage #7", 6, true));
   379               v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   380               v.Add(new Voltage("VBat", 8, 150, 150, 0));
   381               for (int i = 0; i < superIO.Temperatures.Length; i++)
   382                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   383               for (int i = 0; i < superIO.Fans.Length; i++)
   384                 f.Add(new Fan("Fan #" + (i + 1), i));
   385               break;
   386           }
   387           break;
   388 
   389         case Chip.W83627EHF:          
   390           v.Add(new Voltage("CPU VCore", 0));
   391           v.Add(new Voltage("Voltage #2", 1, true));
   392           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   393           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   394           v.Add(new Voltage("Voltage #5", 4, true));
   395           v.Add(new Voltage("Voltage #6", 5, true));
   396           v.Add(new Voltage("Voltage #7", 6, true));
   397           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   398           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   399           v.Add(new Voltage("Voltage #10", 9, true));
   400           t.Add(new Temperature("CPU", 0));
   401           t.Add(new Temperature("Auxiliary", 1));
   402           t.Add(new Temperature("System", 2));
   403           f.Add(new Fan("System", 0));
   404           f.Add(new Fan("CPU", 1));
   405           f.Add(new Fan("Auxiliary", 2));
   406           f.Add(new Fan("CPU #2", 3));
   407           f.Add(new Fan("Auxiliary #2", 4));
   408           break;
   409         case Chip.W83627DHG: 
   410         case Chip.W83627DHGP:                      
   411         case Chip.W83667HG:
   412         case Chip.W83667HGB:
   413           v.Add(new Voltage("CPU VCore", 0));
   414           v.Add(new Voltage("Voltage #2", 1, true));
   415           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   416           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   417           v.Add(new Voltage("Voltage #5", 4, true));
   418           v.Add(new Voltage("Voltage #6", 5, true));
   419           v.Add(new Voltage("Voltage #7", 6, true));
   420           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   421           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   422           t.Add(new Temperature("CPU", 0));
   423           t.Add(new Temperature("Auxiliary", 1));
   424           t.Add(new Temperature("System", 2));
   425           f.Add(new Fan("System", 0));
   426           f.Add(new Fan("CPU", 1));
   427           f.Add(new Fan("Auxiliary", 2));
   428           f.Add(new Fan("CPU #2", 3));
   429           f.Add(new Fan("Auxiliary #2", 4));            
   430           break;
   431         case Chip.W83627HF: 
   432         case Chip.W83627THF: 
   433         case Chip.W83687THF:
   434           v.Add(new Voltage("CPU VCore", 0));
   435           v.Add(new Voltage("Voltage #2", 1, true));
   436           v.Add(new Voltage("Voltage #3", 2, true));
   437           v.Add(new Voltage("AVCC", 3, 34, 51, 0));
   438           v.Add(new Voltage("Voltage #5", 4, true));
   439           v.Add(new Voltage("5VSB", 5, 34, 51, 0));
   440           v.Add(new Voltage("VBAT", 6));
   441           t.Add(new Temperature("CPU", 0));
   442           t.Add(new Temperature("Auxiliary", 1));
   443           t.Add(new Temperature("System", 2));
   444           f.Add(new Fan("System", 0));
   445           f.Add(new Fan("CPU", 1));
   446           f.Add(new Fan("Auxiliary", 2));
   447           break;
   448         default:
   449           for (int i = 0; i < superIO.Voltages.Length; i++)
   450             v.Add(new Voltage("Voltage #" + (i + 1), i, true));
   451           for (int i = 0; i < superIO.Temperatures.Length; i++)
   452             t.Add(new Temperature("Temperature #" + (i + 1), i));
   453           for (int i = 0; i < superIO.Fans.Length; i++)
   454             f.Add(new Fan("Fan #" + (i + 1), i));
   455           break;
   456       }
   457 
   458       string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
   459       foreach (Voltage voltage in v) 
   460         if (voltage.Index < superIO.Voltages.Length) {
   461           Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
   462             voltage.Hidden, SensorType.Voltage, this, 
   463             new ParameterDescription[] {
   464             new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
   465               formula, voltage.Ri),
   466             new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
   467               formula, voltage.Rf),
   468             new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
   469               formula, voltage.Vf)
   470             });
   471           voltages.Add(sensor);
   472       }
   473 
   474       foreach (Temperature temperature in t) 
   475         if (temperature.Index < superIO.Temperatures.Length) {
   476         Sensor sensor = new Sensor(temperature.Name, temperature.Index,
   477           SensorType.Temperature, this, new ParameterDescription[] {
   478           new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
   479         });
   480         temperatures.Add(sensor);
   481       }
   482 
   483       foreach (Fan fan in f)
   484         if (fan.Index < superIO.Fans.Length) {
   485           Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
   486             this, null);
   487           fans.Add(sensor);
   488         }
   489     }
   490 
   491     public override Identifier Identifier {
   492       get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
   493     }
   494 
   495     public override Image Icon {
   496       get { return icon; }
   497     }
   498 
   499     public override string Name {
   500       get { return name; }
   501     }
   502 
   503     public override string GetReport() {
   504       return superIO.GetReport();
   505     }
   506 
   507     public override void Update() {
   508       superIO.Update();
   509 
   510       foreach (Sensor sensor in voltages) {
   511         float? value = superIO.Voltages[sensor.Index];
   512         if (value.HasValue) {
   513           sensor.Value = value + (value - sensor.Parameters[2].Value) *
   514             sensor.Parameters[0].Value / sensor.Parameters[1].Value;
   515           ActivateSensor(sensor);
   516         }
   517       }
   518 
   519       foreach (Sensor sensor in temperatures) {
   520         float? value = superIO.Temperatures[sensor.Index];
   521         if (value.HasValue) {
   522           sensor.Value = value + sensor.Parameters[0].Value;
   523           ActivateSensor(sensor);
   524         }
   525       }
   526 
   527       foreach (Sensor sensor in fans) {
   528         float? value = superIO.Fans[sensor.Index];
   529         if (value.HasValue) {
   530           sensor.Value = value;
   531           if (value.Value > 0)
   532             ActivateSensor(sensor);
   533         }
   534       }
   535     }
   536 
   537     private class Voltage {
   538       public readonly string Name;
   539       public readonly int Index;
   540       public readonly float Ri;
   541       public readonly float Rf;
   542       public readonly float Vf;
   543       public readonly bool Hidden;
   544 
   545       public Voltage(string name, int index) :
   546         this(name, index, 0, 1, 0, false) { }
   547 
   548       public Voltage(string name, int index, bool hidden) :
   549         this(name, index, 0, 1, 0, hidden) { }
   550 
   551       public Voltage(string name, int index, float ri, float rf, float vf) :
   552         this(name, index, ri, rf, vf, false) { }
   553 
   554       public Voltage(string name, int index, float ri, float rf, float vf,
   555         bool hidden) {
   556         this.Name = name;
   557         this.Index = index;
   558         this.Ri = ri;
   559         this.Rf = rf;
   560         this.Vf = vf;
   561         this.Hidden = hidden;
   562       }
   563     }
   564 
   565     private class Temperature {
   566       public readonly string Name;
   567       public readonly int Index;
   568 
   569       public Temperature(string name, int index) {
   570         this.Name = name;
   571         this.Index = index;
   572       }
   573     }
   574 
   575     private class Fan {
   576       public readonly string Name;
   577       public readonly int Index;
   578 
   579       public Fan(string name, int index) {
   580         this.Name = name;
   581         this.Index = index;
   582       }
   583     }
   584   }
   585 }