Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Tue, 29 Jun 2010 07:44:55 +0000
changeset 146 d27bde956836
parent 144 44a688398012
child 148 abed9987d993
permissions -rw-r--r--
Corrected the mainboard specific configuration for the ASUS M4A79XTD EVO (Issue 79).
     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("+5V", 3, 6.8f, 10, 0));
   117                   v.Add(new Voltage("VBat", 8));
   118                   t.Add(new Temperature("CPU", 0));
   119                   t.Add(new Temperature("Motherboard", 1));
   120                   f.Add(new Fan("CPU Fan", 0));
   121                   f.Add(new Fan("Chassis Fan #1", 1));
   122                   f.Add(new Fan("Chassis Fan #2", 2));
   123                   break;
   124                 default:
   125                   v.Add(new Voltage("CPU VCore", 0));
   126                   v.Add(new Voltage("Voltage #2", 1, true));
   127                   v.Add(new Voltage("Voltage #3", 2, true));
   128                   v.Add(new Voltage("Voltage #4", 3, true));
   129                   v.Add(new Voltage("Voltage #5", 4, true));
   130                   v.Add(new Voltage("Voltage #6", 5, true));
   131                   v.Add(new Voltage("Voltage #7", 6, true));
   132                   v.Add(new Voltage("Voltage #8", 7, true));
   133                   v.Add(new Voltage("VBat", 8));
   134                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   135                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   136                   for (int i = 0; i < superIO.Fans.Length; i++)
   137                     f.Add(new Fan("Fan #" + (i + 1), i));
   138                   break;
   139               }
   140               break;
   141             case Manufacturer.DFI:
   142               switch (model) {
   143                 case Model.LP_BI_P45_T2RS_Elite:
   144                   v.Add(new Voltage("CPU VCore", 0));
   145                   v.Add(new Voltage("FSB VTT", 1));
   146                   v.Add(new Voltage("+3.3V", 2));
   147                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   148                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   149                   v.Add(new Voltage("NB Core", 5));
   150                   v.Add(new Voltage("VDIMM", 6));
   151                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   152                   v.Add(new Voltage("VBat", 8));
   153                   t.Add(new Temperature("CPU", 0));
   154                   t.Add(new Temperature("System", 1));
   155                   t.Add(new Temperature("Chipset", 2));
   156                   f.Add(new Fan("Fan #1", 0));
   157                   f.Add(new Fan("Fan #2", 1));
   158                   f.Add(new Fan("Fan #3", 2));
   159                   break;
   160                 case Model.LP_DK_P55_T3eH9:
   161                   v.Add(new Voltage("CPU VCore", 0));
   162                   v.Add(new Voltage("VTT", 1));
   163                   v.Add(new Voltage("+3.3V", 2));
   164                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   165                   v.Add(new Voltage("+12V", 4, 30, 10, 0));
   166                   v.Add(new Voltage("CPU PLL", 5));
   167                   v.Add(new Voltage("DRAM", 6));
   168                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0));
   169                   v.Add(new Voltage("VBat", 8));
   170                   t.Add(new Temperature("Chipset", 0));
   171                   t.Add(new Temperature("CPU PWM", 1));
   172                   t.Add(new Temperature("CPU", 2));
   173                   f.Add(new Fan("Fan #1", 0));
   174                   f.Add(new Fan("Fan #2", 1));
   175                   f.Add(new Fan("Fan #3", 2));
   176                   break;
   177                 default:
   178                   v.Add(new Voltage("CPU VCore", 0));
   179                   v.Add(new Voltage("VTT", 1, true));
   180                   v.Add(new Voltage("+3.3V", 2, true));
   181                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   182                   v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
   183                   v.Add(new Voltage("Voltage #6", 5, true));
   184                   v.Add(new Voltage("DRAM", 6, true));
   185                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
   186                   v.Add(new Voltage("VBat", 8));
   187                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   188                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   189                   for (int i = 0; i < superIO.Fans.Length; i++)
   190                     f.Add(new Fan("Fan #" + (i + 1), i));
   191                   break;
   192               }
   193               break;
   194 
   195             case Manufacturer.Gigabyte:
   196               switch (model) {
   197                 case Model._965P_S3:
   198                   v.Add(new Voltage("CPU VCore", 0));
   199                   v.Add(new Voltage("DRAM", 1));
   200                   v.Add(new Voltage("+3.3V", 2));
   201                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   202                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   203                   v.Add(new Voltage("VBat", 8));
   204                   t.Add(new Temperature("System", 0));
   205                   t.Add(new Temperature("CPU", 1));
   206                   f.Add(new Fan("CPU Fan", 0));
   207                   f.Add(new Fan("System Fan", 1));
   208                   break;
   209                 case Model.EP45_DS3R:
   210                 case Model.EP45_UD3R: 
   211                 case Model.X38_DS5:    
   212                   v.Add(new Voltage("CPU VCore", 0));
   213                   v.Add(new Voltage("DRAM", 1));
   214                   v.Add(new Voltage("+3.3V", 2));
   215                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   216                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   217                   v.Add(new Voltage("VBat", 8));
   218                   t.Add(new Temperature("System", 0));
   219                   t.Add(new Temperature("CPU", 1));
   220                   f.Add(new Fan("CPU Fan", 0));
   221                   f.Add(new Fan("System Fan #2", 1));
   222                   f.Add(new Fan("Power Fan", 2));
   223                   f.Add(new Fan("System Fan #1", 3));
   224                   break;
   225                 case Model.EX58_EXTREME:
   226                   v.Add(new Voltage("CPU VCore", 0));
   227                   v.Add(new Voltage("DRAM", 1));
   228                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   229                   v.Add(new Voltage("VBat", 8));
   230                   t.Add(new Temperature("System", 0));
   231                   t.Add(new Temperature("CPU", 1));
   232                   t.Add(new Temperature("Northbridge", 2));
   233                   f.Add(new Fan("CPU Fan", 0));
   234                   f.Add(new Fan("System Fan #2", 1));
   235                   f.Add(new Fan("Power Fan", 2));
   236                   f.Add(new Fan("System Fan #1", 3));
   237                   break;
   238                 case Model.P35_DS3:
   239                 case Model.P35_DS3L:
   240                   v.Add(new Voltage("CPU VCore", 0));
   241                   v.Add(new Voltage("DRAM", 1));
   242                   v.Add(new Voltage("+3.3V", 2));
   243                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   244                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0));
   245                   v.Add(new Voltage("VBat", 8));
   246                   t.Add(new Temperature("System", 0));
   247                   t.Add(new Temperature("CPU", 1));
   248                   f.Add(new Fan("CPU Fan", 0));
   249                   f.Add(new Fan("System Fan #1", 1));
   250                   f.Add(new Fan("System Fan #2", 2));
   251                   f.Add(new Fan("Power Fan", 3));
   252                   break;
   253                 case Model.GA_MA785GMT_UD2H:
   254                   v.Add(new Voltage("CPU VCore", 0));
   255                   v.Add(new Voltage("DRAM", 1));
   256                   v.Add(new Voltage("+3.3V", 2));
   257                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   258                   v.Add(new Voltage("+12V", 4, 27, 9.1f, 0));
   259                   v.Add(new Voltage("VBat", 8));
   260                   t.Add(new Temperature("System", 0));
   261                   t.Add(new Temperature("CPU", 1));
   262                   f.Add(new Fan("CPU Fan", 0));
   263                   f.Add(new Fan("System Fan", 1));
   264                   f.Add(new Fan("NB Fan", 2));
   265                   break;
   266                 case Model.X58A_UD3R:
   267                   v.Add(new Voltage("CPU VCore", 0));
   268                   v.Add(new Voltage("DRAM", 1));
   269                   v.Add(new Voltage("+3.3V", 2));
   270                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0));
   271                   v.Add(new Voltage("+12V", 5, 27, 9.1f, 0));
   272                   v.Add(new Voltage("VBat", 8));
   273                   t.Add(new Temperature("System", 0));
   274                   t.Add(new Temperature("CPU", 1));
   275                   t.Add(new Temperature("Northbridge", 2));
   276                   f.Add(new Fan("CPU Fan", 0));
   277                   f.Add(new Fan("System Fan #2", 1));
   278                   f.Add(new Fan("Power Fan", 2));
   279                   f.Add(new Fan("System Fan #1", 3));
   280                   break;
   281                 default:
   282                   v.Add(new Voltage("CPU VCore", 0));
   283                   v.Add(new Voltage("DRAM", 1, true));
   284                   v.Add(new Voltage("+3.3V", 2, true));
   285                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   286                   v.Add(new Voltage("Voltage #5", 4, true));
   287                   v.Add(new Voltage("Voltage #6", 5, true));
   288                   v.Add(new Voltage("Voltage #7", 6, true));
   289                   v.Add(new Voltage("+12V", 7, 27, 9.1f, 0, true));
   290                   v.Add(new Voltage("VBat", 8));
   291                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   292                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   293                   for (int i = 0; i < superIO.Fans.Length; i++)
   294                     f.Add(new Fan("Fan #" + (i + 1), i));
   295                   break;
   296               }
   297               break;
   298 
   299             default:
   300               v.Add(new Voltage("CPU VCore", 0));
   301               v.Add(new Voltage("Voltage #2", 1, true));
   302               v.Add(new Voltage("Voltage #3", 2, true));
   303               v.Add(new Voltage("Voltage #4", 3, true));
   304               v.Add(new Voltage("Voltage #5", 4, true));
   305               v.Add(new Voltage("Voltage #6", 5, true));
   306               v.Add(new Voltage("Voltage #7", 6, true));
   307               v.Add(new Voltage("Voltage #8", 7, true));
   308               v.Add(new Voltage("VBat", 8));
   309               for (int i = 0; i < superIO.Temperatures.Length; i++)
   310                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   311               for (int i = 0; i < superIO.Fans.Length; i++)
   312                 f.Add(new Fan("Fan #" + (i + 1), i));
   313               break;
   314           }
   315           break;
   316           
   317         case Chip.F71858:
   318           v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   319           v.Add(new Voltage("VSB3V", 1, 150, 150, 0));
   320           v.Add(new Voltage("Battery", 2, 150, 150, 0));
   321           for (int i = 0; i < superIO.Temperatures.Length; i++)
   322             t.Add(new Temperature("Temperature #" + (i + 1), i));
   323           for (int i = 0; i < superIO.Fans.Length; i++)
   324             f.Add(new Fan("Fan #" + (i + 1), i));
   325           break;
   326         case Chip.F71862: 
   327         case Chip.F71869: 
   328         case Chip.F71882:
   329         case Chip.F71889ED: 
   330         case Chip.F71889F:
   331           switch (manufacturer) {
   332             case Manufacturer.EVGA:
   333               switch (model) {
   334                 case Model.X58_SLI_Classified:
   335                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   336                   v.Add(new Voltage("CPU VCore", 1, 47, 100, 0));
   337                   v.Add(new Voltage("DIMM", 2, 47, 100, 0));
   338                   v.Add(new Voltage("CPU VTT", 3, 24, 100, 0));
   339                   v.Add(new Voltage("IOH Vcore", 4, 24, 100, 0));
   340                   v.Add(new Voltage("+5V", 5, 51, 12, 0));
   341                   v.Add(new Voltage("+12V", 6, 56, 6.8f, 0));
   342                   v.Add(new Voltage("3VSB", 7, 150, 150, 0));
   343                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   344                   t.Add(new Temperature("CPU", 0));
   345                   t.Add(new Temperature("VREG", 1));
   346                   t.Add(new Temperature("System", 2));
   347                   f.Add(new Fan("CPU Fan", 0));
   348                   f.Add(new Fan("Power Fan", 1));
   349                   f.Add(new Fan("Chassis Fan", 2));
   350                   break;
   351                 default:
   352                   v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   353                   v.Add(new Voltage("CPU VCore", 1));
   354                   v.Add(new Voltage("Voltage #3", 2, true));
   355                   v.Add(new Voltage("Voltage #4", 3, true));
   356                   v.Add(new Voltage("Voltage #5", 4, true));
   357                   v.Add(new Voltage("Voltage #6", 5, true));
   358                   v.Add(new Voltage("Voltage #7", 6, true));
   359                   v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   360                   v.Add(new Voltage("VBat", 8, 150, 150, 0));
   361                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   362                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   363                   for (int i = 0; i < superIO.Fans.Length; i++)
   364                     f.Add(new Fan("Fan #" + (i + 1), i));
   365                   break;
   366               }
   367               break;
   368             default:
   369               v.Add(new Voltage("VCC3V", 0, 150, 150, 0));
   370               v.Add(new Voltage("CPU VCore", 1));
   371               v.Add(new Voltage("Voltage #3", 2, true));
   372               v.Add(new Voltage("Voltage #4", 3, true));
   373               v.Add(new Voltage("Voltage #5", 4, true));
   374               v.Add(new Voltage("Voltage #6", 5, true));
   375               v.Add(new Voltage("Voltage #7", 6, true));
   376               v.Add(new Voltage("VSB3V", 7, 150, 150, 0));
   377               v.Add(new Voltage("VBat", 8, 150, 150, 0));
   378               for (int i = 0; i < superIO.Temperatures.Length; i++)
   379                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   380               for (int i = 0; i < superIO.Fans.Length; i++)
   381                 f.Add(new Fan("Fan #" + (i + 1), i));
   382               break;
   383           }
   384           break;
   385 
   386         case Chip.W83627EHF:          
   387           v.Add(new Voltage("CPU VCore", 0));
   388           v.Add(new Voltage("Voltage #2", 1, true));
   389           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   390           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   391           v.Add(new Voltage("Voltage #5", 4, true));
   392           v.Add(new Voltage("Voltage #6", 5, true));
   393           v.Add(new Voltage("Voltage #7", 6, true));
   394           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   395           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   396           v.Add(new Voltage("Voltage #10", 9, true));
   397           t.Add(new Temperature("CPU", 0));
   398           t.Add(new Temperature("Auxiliary", 1));
   399           t.Add(new Temperature("System", 2));
   400           f.Add(new Fan("System", 0));
   401           f.Add(new Fan("CPU", 1));
   402           f.Add(new Fan("Auxiliary", 2));
   403           f.Add(new Fan("CPU #2", 3));
   404           f.Add(new Fan("Auxiliary #2", 4));
   405           break;
   406         case Chip.W83627DHG: 
   407         case Chip.W83627DHGP:                      
   408         case Chip.W83667HG:
   409         case Chip.W83667HGB:
   410           v.Add(new Voltage("CPU VCore", 0));
   411           v.Add(new Voltage("Voltage #2", 1, true));
   412           v.Add(new Voltage("AVCC", 2, 34, 34, 0));
   413           v.Add(new Voltage("3VCC", 3, 34, 34, 0));
   414           v.Add(new Voltage("Voltage #5", 4, true));
   415           v.Add(new Voltage("Voltage #6", 5, true));
   416           v.Add(new Voltage("Voltage #7", 6, true));
   417           v.Add(new Voltage("3VSB", 7, 34, 34, 0));
   418           v.Add(new Voltage("VBAT", 8, 34, 34, 0));
   419           t.Add(new Temperature("CPU", 0));
   420           t.Add(new Temperature("Auxiliary", 1));
   421           t.Add(new Temperature("System", 2));
   422           f.Add(new Fan("System", 0));
   423           f.Add(new Fan("CPU", 1));
   424           f.Add(new Fan("Auxiliary", 2));
   425           f.Add(new Fan("CPU #2", 3));
   426           f.Add(new Fan("Auxiliary #2", 4));            
   427           break;
   428         case Chip.W83627HF: 
   429         case Chip.W83627THF: 
   430         case Chip.W83687THF:
   431           v.Add(new Voltage("CPU VCore", 0));
   432           v.Add(new Voltage("Voltage #2", 1, true));
   433           v.Add(new Voltage("Voltage #3", 2, true));
   434           v.Add(new Voltage("AVCC", 3, 34, 51, 0));
   435           v.Add(new Voltage("Voltage #5", 4, true));
   436           v.Add(new Voltage("5VSB", 5, 34, 51, 0));
   437           v.Add(new Voltage("VBAT", 6));
   438           t.Add(new Temperature("CPU", 0));
   439           t.Add(new Temperature("Auxiliary", 1));
   440           t.Add(new Temperature("System", 2));
   441           f.Add(new Fan("System", 0));
   442           f.Add(new Fan("CPU", 1));
   443           f.Add(new Fan("Auxiliary", 2));
   444           break;
   445         default:
   446           for (int i = 0; i < superIO.Voltages.Length; i++)
   447             v.Add(new Voltage("Voltage #" + (i + 1), i, true));
   448           for (int i = 0; i < superIO.Temperatures.Length; i++)
   449             t.Add(new Temperature("Temperature #" + (i + 1), i));
   450           for (int i = 0; i < superIO.Fans.Length; i++)
   451             f.Add(new Fan("Fan #" + (i + 1), i));
   452           break;
   453       }
   454 
   455       string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
   456       foreach (Voltage voltage in v) 
   457         if (voltage.Index < superIO.Voltages.Length) {
   458           Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
   459             voltage.Hidden, SensorType.Voltage, this, 
   460             new ParameterDescription[] {
   461             new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
   462               formula, voltage.Ri),
   463             new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
   464               formula, voltage.Rf),
   465             new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
   466               formula, voltage.Vf)
   467             });
   468           voltages.Add(sensor);
   469       }
   470 
   471       foreach (Temperature temperature in t) 
   472         if (temperature.Index < superIO.Temperatures.Length) {
   473         Sensor sensor = new Sensor(temperature.Name, temperature.Index,
   474           SensorType.Temperature, this, new ParameterDescription[] {
   475           new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
   476         });
   477         temperatures.Add(sensor);
   478       }
   479 
   480       foreach (Fan fan in f)
   481         if (fan.Index < superIO.Fans.Length) {
   482           Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
   483             this, null);
   484           fans.Add(sensor);
   485         }
   486     }
   487 
   488     public override Identifier Identifier {
   489       get { return new Identifier("lpc", superIO.Chip.ToString().ToLower()); }
   490     }
   491 
   492     public override Image Icon {
   493       get { return icon; }
   494     }
   495 
   496     public override string Name {
   497       get { return name; }
   498     }
   499 
   500     public override string GetReport() {
   501       return superIO.GetReport();
   502     }
   503 
   504     public override void Update() {
   505       superIO.Update();
   506 
   507       foreach (Sensor sensor in voltages) {
   508         float? value = superIO.Voltages[sensor.Index];
   509         if (value.HasValue) {
   510           sensor.Value = value + (value - sensor.Parameters[2].Value) *
   511             sensor.Parameters[0].Value / sensor.Parameters[1].Value;
   512           ActivateSensor(sensor);
   513         }
   514       }
   515 
   516       foreach (Sensor sensor in temperatures) {
   517         float? value = superIO.Temperatures[sensor.Index];
   518         if (value.HasValue) {
   519           sensor.Value = value + sensor.Parameters[0].Value;
   520           ActivateSensor(sensor);
   521         }
   522       }
   523 
   524       foreach (Sensor sensor in fans) {
   525         float? value = superIO.Fans[sensor.Index];
   526         if (value.HasValue) {
   527           sensor.Value = value;
   528           if (value.Value > 0)
   529             ActivateSensor(sensor);
   530         }
   531       }
   532     }
   533 
   534     private class Voltage {
   535       public readonly string Name;
   536       public readonly int Index;
   537       public readonly float Ri;
   538       public readonly float Rf;
   539       public readonly float Vf;
   540       public readonly bool Hidden;
   541 
   542       public Voltage(string name, int index) :
   543         this(name, index, 0, 1, 0, false) { }
   544 
   545       public Voltage(string name, int index, bool hidden) :
   546         this(name, index, 0, 1, 0, hidden) { }
   547 
   548       public Voltage(string name, int index, float ri, float rf, float vf) :
   549         this(name, index, ri, rf, vf, false) { }
   550 
   551       public Voltage(string name, int index, float ri, float rf, float vf,
   552         bool hidden) {
   553         this.Name = name;
   554         this.Index = index;
   555         this.Ri = ri;
   556         this.Rf = rf;
   557         this.Vf = vf;
   558         this.Hidden = hidden;
   559       }
   560     }
   561 
   562     private class Temperature {
   563       public readonly string Name;
   564       public readonly int Index;
   565 
   566       public Temperature(string name, int index) {
   567         this.Name = name;
   568         this.Index = index;
   569       }
   570     }
   571 
   572     private class Fan {
   573       public readonly string Name;
   574       public readonly int Index;
   575 
   576       public Fan(string name, int index) {
   577         this.Name = name;
   578         this.Index = index;
   579       }
   580     }
   581   }
   582 }