Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Mon, 18 Jul 2011 19:55:43 +0000
changeset 310 7fe8c37b1b84
parent 307 31b2b9b5eae9
child 311 d687db11035c
permissions -rw-r--r--
Improved the mainboard specific configuration for the ASUS P8P67 PRO mainboard.
     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-2011
    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.Globalization;
    41 using System.Threading;
    42 using OpenHardwareMonitor.Hardware.LPC;
    43 
    44 namespace OpenHardwareMonitor.Hardware.Mainboard {
    45   internal class SuperIOHardware : Hardware {
    46 
    47     private readonly Mainboard mainboard;
    48     private readonly ISuperIO superIO;
    49 
    50     private readonly List<Sensor> voltages = new List<Sensor>();
    51     private readonly List<Sensor> temperatures = new List<Sensor>();
    52     private readonly List<Sensor> fans = new List<Sensor>();
    53 
    54     private delegate float? ReadValueDelegate(int index);
    55     private delegate void UpdateDelegate();
    56 
    57     // delegates for mainboard specific sensor reading code
    58     private readonly ReadValueDelegate readVoltage;
    59     private readonly ReadValueDelegate readTemperature;
    60     private readonly ReadValueDelegate readFan;
    61 
    62     // delegate for post update mainboard specific code
    63     private readonly UpdateDelegate postUpdate;
    64 
    65     // mainboard specific mutex
    66     private readonly Mutex mutex;
    67 
    68     public SuperIOHardware(Mainboard mainboard, ISuperIO superIO, 
    69       Manufacturer manufacturer, Model model, ISettings settings) 
    70       : base(ChipName.GetName(superIO.Chip), new Identifier("lpc", 
    71         superIO.Chip.ToString().ToLower(CultureInfo.InvariantCulture)), 
    72         settings)
    73     {
    74       this.mainboard = mainboard;
    75       this.superIO = superIO;
    76 
    77       this.readVoltage = (index) => superIO.Voltages[index];
    78       this.readTemperature = (index) => superIO.Temperatures[index];
    79       this.readFan = (index) => superIO.Fans[index];
    80 
    81       this.postUpdate = () => { };
    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: // IT8720F
    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));
   106                   v.Add(new Voltage("+12V", 4, 30, 10));
   107                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
   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: // IT8720F           
   116                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   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 
   142             case Manufacturer.ASRock:
   143               switch (model) {
   144                 case Model.P55_Deluxe: // IT8720F
   145                   
   146                   v.Add(new Voltage("CPU VCore", 0));
   147                   v.Add(new Voltage("+3.3V", 2));
   148                   v.Add(new Voltage("+12V", 4, 30, 10));
   149                   v.Add(new Voltage("+5V", 5, 6.8f, 10));
   150                   v.Add(new Voltage("VBat", 8));                  
   151                   t.Add(new Temperature("CPU", 0));
   152                   t.Add(new Temperature("Motherboard", 1));
   153                   f.Add(new Fan("CPU Fan", 0));
   154                   f.Add(new Fan("Chassis Fan #1", 1));
   155 
   156                   // this mutex is also used by the official ASRock tool
   157                   mutex = new Mutex(false, "ASRockOCMark");
   158                   
   159                   bool exclusiveAccess = false;
   160                   try {
   161                     exclusiveAccess = mutex.WaitOne(10, false);
   162                   } catch (AbandonedMutexException) { } 
   163                     catch (InvalidOperationException) { }  
   164 
   165                   // only read additional fans if we get exclusive access
   166                   if (exclusiveAccess) {
   167 
   168                     f.Add(new Fan("Chassis Fan #2", 2));
   169                     f.Add(new Fan("Chassis Fan #3", 3));
   170                     f.Add(new Fan("Power Fan", 4));
   171 
   172                     readFan = (index) => {
   173                       if (index < 2) {
   174                         return superIO.Fans[index];
   175                       } else {
   176                         // get GPIO 80-87
   177                         byte? gpio = superIO.ReadGPIO(7);
   178                         if (!gpio.HasValue)
   179                           return null;
   180 
   181                         // read the last 3 fans based on GPIO 83-85
   182                         int[] masks = { 0x05, 0x03, 0x06 };
   183                         return (((gpio.Value >> 3) & 0x07) ==
   184                           masks[index - 2]) ? superIO.Fans[2] : null;
   185                       }
   186                     };
   187 
   188                     int fanIndex = 0;
   189                     postUpdate = () => {
   190                       // get GPIO 80-87
   191                       byte? gpio = superIO.ReadGPIO(7);
   192                       if (!gpio.HasValue)
   193                         return;
   194 
   195                       // prepare the GPIO 83-85 for the next update
   196                       int[] masks = { 0x05, 0x03, 0x06 };
   197                       superIO.WriteGPIO(7,
   198                         (byte)((gpio.Value & 0xC7) | (masks[fanIndex] << 3)));
   199                       fanIndex = (fanIndex + 1) % 3;
   200                     };
   201                   }
   202 
   203                   break;
   204                 default:
   205                   v.Add(new Voltage("CPU VCore", 0));
   206                   v.Add(new Voltage("Voltage #2", 1, true));
   207                   v.Add(new Voltage("Voltage #3", 2, true));
   208                   v.Add(new Voltage("Voltage #4", 3, true));
   209                   v.Add(new Voltage("Voltage #5", 4, true));
   210                   v.Add(new Voltage("Voltage #6", 5, true));
   211                   v.Add(new Voltage("Voltage #7", 6, true));
   212                   v.Add(new Voltage("Voltage #8", 7, true));
   213                   v.Add(new Voltage("VBat", 8));
   214                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   215                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   216                   for (int i = 0; i < superIO.Fans.Length; i++)
   217                     f.Add(new Fan("Fan #" + (i + 1), i));
   218                   break;
   219               };
   220               break;
   221 
   222             case Manufacturer.DFI:
   223               switch (model) {
   224                 case Model.LP_BI_P45_T2RS_Elite: // IT8718F
   225                   v.Add(new Voltage("CPU VCore", 0));
   226                   v.Add(new Voltage("FSB VTT", 1));
   227                   v.Add(new Voltage("+3.3V", 2));
   228                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   229                   v.Add(new Voltage("+12V", 4, 30, 10));
   230                   v.Add(new Voltage("NB Core", 5));
   231                   v.Add(new Voltage("VDIMM", 6));
   232                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
   233                   v.Add(new Voltage("VBat", 8));
   234                   t.Add(new Temperature("CPU", 0));
   235                   t.Add(new Temperature("System", 1));
   236                   t.Add(new Temperature("Chipset", 2));
   237                   f.Add(new Fan("Fan #1", 0));
   238                   f.Add(new Fan("Fan #2", 1));
   239                   f.Add(new Fan("Fan #3", 2));
   240                   break;
   241                 case Model.LP_DK_P55_T3eH9: // IT8720F
   242                   v.Add(new Voltage("CPU VCore", 0));
   243                   v.Add(new Voltage("VTT", 1));
   244                   v.Add(new Voltage("+3.3V", 2));
   245                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   246                   v.Add(new Voltage("+12V", 4, 30, 10));
   247                   v.Add(new Voltage("CPU PLL", 5));
   248                   v.Add(new Voltage("DRAM", 6));
   249                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10));
   250                   v.Add(new Voltage("VBat", 8));
   251                   t.Add(new Temperature("Chipset", 0));
   252                   t.Add(new Temperature("CPU PWM", 1));
   253                   t.Add(new Temperature("CPU", 2));
   254                   f.Add(new Fan("Fan #1", 0));
   255                   f.Add(new Fan("Fan #2", 1));
   256                   f.Add(new Fan("Fan #3", 2));
   257                   break;
   258                 default:
   259                   v.Add(new Voltage("CPU VCore", 0));
   260                   v.Add(new Voltage("VTT", 1, true));
   261                   v.Add(new Voltage("+3.3V", 2, true));
   262                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   263                   v.Add(new Voltage("+12V", 4, 30, 10, 0, true));
   264                   v.Add(new Voltage("Voltage #6", 5, true));
   265                   v.Add(new Voltage("DRAM", 6, true));
   266                   v.Add(new Voltage("+5VSB", 7, 6.8f, 10, 0, true));
   267                   v.Add(new Voltage("VBat", 8));
   268                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   269                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   270                   for (int i = 0; i < superIO.Fans.Length; i++)
   271                     f.Add(new Fan("Fan #" + (i + 1), i));
   272                   break;
   273               }
   274               break;
   275 
   276             case Manufacturer.Gigabyte:
   277               switch (model) {
   278                 case Model._965P_S3: // IT8718F
   279                   v.Add(new Voltage("CPU VCore", 0));
   280                   v.Add(new Voltage("DRAM", 1));
   281                   v.Add(new Voltage("+3.3V", 2));
   282                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   283                   v.Add(new Voltage("+12V", 7, 27, 9.1f));
   284                   v.Add(new Voltage("VBat", 8));
   285                   t.Add(new Temperature("System", 0));
   286                   t.Add(new Temperature("CPU", 1));
   287                   f.Add(new Fan("CPU Fan", 0));
   288                   f.Add(new Fan("System Fan", 1));
   289                   break;
   290                 case Model.EP45_DS3R: // IT8718F
   291                 case Model.EP45_UD3R: 
   292                 case Model.X38_DS5:    
   293                   v.Add(new Voltage("CPU VCore", 0));
   294                   v.Add(new Voltage("DRAM", 1));
   295                   v.Add(new Voltage("+3.3V", 2));
   296                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   297                   v.Add(new Voltage("+12V", 7, 27, 9.1f));
   298                   v.Add(new Voltage("VBat", 8));
   299                   t.Add(new Temperature("System", 0));
   300                   t.Add(new Temperature("CPU", 1));
   301                   f.Add(new Fan("CPU Fan", 0));
   302                   f.Add(new Fan("System Fan #2", 1));
   303                   f.Add(new Fan("Power Fan", 2));
   304                   f.Add(new Fan("System Fan #1", 3));
   305                   break;
   306                 case Model.EX58_EXTREME: // IT8720F 
   307                   v.Add(new Voltage("CPU VCore", 0));
   308                   v.Add(new Voltage("DRAM", 1));
   309                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   310                   v.Add(new Voltage("VBat", 8));
   311                   t.Add(new Temperature("System", 0));
   312                   t.Add(new Temperature("CPU", 1));
   313                   t.Add(new Temperature("Northbridge", 2));
   314                   f.Add(new Fan("CPU Fan", 0));
   315                   f.Add(new Fan("System Fan #2", 1));
   316                   f.Add(new Fan("Power Fan", 2));
   317                   f.Add(new Fan("System Fan #1", 3));
   318                   break;
   319                 case Model.P35_DS3: // IT8718F 
   320                 case Model.P35_DS3L: // IT8718F
   321                   v.Add(new Voltage("CPU VCore", 0));
   322                   v.Add(new Voltage("DRAM", 1));
   323                   v.Add(new Voltage("+3.3V", 2));
   324                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   325                   v.Add(new Voltage("+12V", 7, 27, 9.1f));
   326                   v.Add(new Voltage("VBat", 8));
   327                   t.Add(new Temperature("System", 0));
   328                   t.Add(new Temperature("CPU", 1));
   329                   f.Add(new Fan("CPU Fan", 0));
   330                   f.Add(new Fan("System Fan #1", 1));
   331                   f.Add(new Fan("System Fan #2", 2));
   332                   f.Add(new Fan("Power Fan", 3));
   333                   break;
   334                 case Model.P55_UD4: // IT8720F
   335                 case Model.P55M_UD4: // IT8720F
   336                   v.Add(new Voltage("CPU VCore", 0));
   337                   v.Add(new Voltage("DRAM", 1));
   338                   v.Add(new Voltage("+3.3V", 2));
   339                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   340                   v.Add(new Voltage("+12V", 5, 27, 9.1f));
   341                   v.Add(new Voltage("VBat", 8));
   342                   t.Add(new Temperature("System", 0));
   343                   t.Add(new Temperature("CPU", 2));
   344                   f.Add(new Fan("CPU Fan", 0));
   345                   f.Add(new Fan("System Fan #2", 1));
   346                   f.Add(new Fan("Power Fan", 2));
   347                   f.Add(new Fan("System Fan #1", 3));
   348                   break;
   349                 case Model.GA_MA770T_UD3: // IT8720F
   350                   v.Add(new Voltage("CPU VCore", 0));
   351                   v.Add(new Voltage("DRAM", 1));
   352                   v.Add(new Voltage("+3.3V", 2));
   353                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   354                   v.Add(new Voltage("+12V", 4, 27, 9.1f));
   355                   v.Add(new Voltage("VBat", 8));
   356                   t.Add(new Temperature("System", 0));
   357                   t.Add(new Temperature("CPU", 1));
   358                   f.Add(new Fan("CPU Fan", 0));
   359                   f.Add(new Fan("System Fan #1", 1));
   360                   f.Add(new Fan("System Fan #2", 2));
   361                   f.Add(new Fan("Power Fan", 3));
   362                   break;
   363                 case Model.GA_MA785GMT_UD2H: // IT8718F
   364                   v.Add(new Voltage("CPU VCore", 0));
   365                   v.Add(new Voltage("DRAM", 1));
   366                   v.Add(new Voltage("+3.3V", 2));
   367                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   368                   v.Add(new Voltage("+12V", 4, 27, 9.1f));
   369                   v.Add(new Voltage("VBat", 8));
   370                   t.Add(new Temperature("System", 0));
   371                   t.Add(new Temperature("CPU", 1));
   372                   f.Add(new Fan("CPU Fan", 0));
   373                   f.Add(new Fan("System Fan", 1));
   374                   f.Add(new Fan("NB Fan", 2));
   375                   break;
   376                 case Model.X58A_UD3R: // IT8720F 
   377                   v.Add(new Voltage("CPU VCore", 0));
   378                   v.Add(new Voltage("DRAM", 1));
   379                   v.Add(new Voltage("+3.3V", 2));
   380                   v.Add(new Voltage("+5V", 3, 6.8f, 10));
   381                   v.Add(new Voltage("+12V", 5, 27, 9.1f));
   382                   v.Add(new Voltage("VBat", 8));
   383                   t.Add(new Temperature("System", 0));
   384                   t.Add(new Temperature("CPU", 1));
   385                   t.Add(new Temperature("Northbridge", 2));
   386                   f.Add(new Fan("CPU Fan", 0));
   387                   f.Add(new Fan("System Fan #2", 1));
   388                   f.Add(new Fan("Power Fan", 2));
   389                   f.Add(new Fan("System Fan #1", 3));
   390                   break;
   391                 default:
   392                   v.Add(new Voltage("CPU VCore", 0));
   393                   v.Add(new Voltage("DRAM", 1, true));
   394                   v.Add(new Voltage("+3.3V", 2, true));
   395                   v.Add(new Voltage("+5V", 3, 6.8f, 10, 0, true));
   396                   v.Add(new Voltage("Voltage #5", 4, true));
   397                   v.Add(new Voltage("Voltage #6", 5, true));
   398                   v.Add(new Voltage("Voltage #7", 6, true));
   399                   v.Add(new Voltage("Voltage #8", 7, true));
   400                   v.Add(new Voltage("VBat", 8));
   401                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   402                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   403                   for (int i = 0; i < superIO.Fans.Length; i++)
   404                     f.Add(new Fan("Fan #" + (i + 1), i));
   405                   break;
   406               }
   407               break;
   408 
   409             default:
   410               v.Add(new Voltage("CPU VCore", 0));
   411               v.Add(new Voltage("Voltage #2", 1, true));
   412               v.Add(new Voltage("Voltage #3", 2, true));
   413               v.Add(new Voltage("Voltage #4", 3, true));
   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("Voltage #8", 7, true));
   418               v.Add(new Voltage("VBat", 8));
   419               for (int i = 0; i < superIO.Temperatures.Length; i++)
   420                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   421               for (int i = 0; i < superIO.Fans.Length; i++)
   422                 f.Add(new Fan("Fan #" + (i + 1), i));
   423               break;
   424           }
   425           break;
   426 
   427         case Chip.IT8721F:
   428         case Chip.IT8728F:
   429           switch (manufacturer) {
   430             case Manufacturer.ECS:
   431               switch (model) {
   432                 case Model.A890GXM_A: // IT8721F
   433                   v.Add(new Voltage("CPU VCore", 0));
   434                   v.Add(new Voltage("VDIMM", 1));
   435                   v.Add(new Voltage("NB Voltage", 2));
   436                   v.Add(new Voltage("Analog +3.3V", 3, 10, 10));
   437                   // v.Add(new Voltage("VDIMM", 6, true));
   438                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
   439                   v.Add(new Voltage("VBat", 8, 10, 10));
   440                   t.Add(new Temperature("CPU", 0));
   441                   t.Add(new Temperature("System", 1));
   442                   t.Add(new Temperature("Northbridge", 2));
   443                   f.Add(new Fan("CPU Fan", 0));
   444                   f.Add(new Fan("System Fan", 1));
   445                   f.Add(new Fan("Power Fan", 2));
   446                   break;
   447                 default:
   448                   v.Add(new Voltage("Voltage #1", 0, true));
   449                   v.Add(new Voltage("Voltage #2", 1, true));
   450                   v.Add(new Voltage("Voltage #3", 2, true));
   451                   v.Add(new Voltage("Analog +3.3V", 3, 10, 10, 0, true));
   452                   v.Add(new Voltage("Voltage #5", 4, true));
   453                   v.Add(new Voltage("Voltage #6", 5, true));
   454                   v.Add(new Voltage("Voltage #7", 6, true));
   455                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
   456                   v.Add(new Voltage("VBat", 8, 10, 10));
   457                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   458                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   459                   for (int i = 0; i < superIO.Fans.Length; i++)
   460                     f.Add(new Fan("Fan #" + (i + 1), i));
   461                   break;
   462               }
   463               break;
   464             case Manufacturer.Gigabyte:
   465               switch (model) {
   466                 case Model.P67A_UD4_B3: // IT8728F
   467                   v.Add(new Voltage("+12V", 0, 100, 10));
   468                   v.Add(new Voltage("+5V", 1, 15, 10));
   469                   v.Add(new Voltage("Voltage #3", 2, true));
   470                   v.Add(new Voltage("Voltage #4", 3, true));
   471                   v.Add(new Voltage("Voltage #5", 4, true));
   472                   v.Add(new Voltage("CPU VCore", 5));
   473                   v.Add(new Voltage("DRAM", 6));
   474                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
   475                   v.Add(new Voltage("VBat", 8, 10, 10));
   476                   t.Add(new Temperature("System", 0));
   477                   t.Add(new Temperature("CPU", 2));
   478                   f.Add(new Fan("CPU Fan", 0));
   479                   f.Add(new Fan("System Fan #2", 1));
   480                   f.Add(new Fan("Power Fan", 2));
   481                   f.Add(new Fan("System Fan #1", 3));
   482                   break;
   483                 case Model.H67A_UD3H_B3: // IT8728F
   484                   v.Add(new Voltage("VTT", 0));
   485                   v.Add(new Voltage("+5V", 1, 15, 10));
   486                   v.Add(new Voltage("+12V", 2, 68, 22));
   487                   v.Add(new Voltage("Voltage #4", 3, true));
   488                   v.Add(new Voltage("Voltage #5", 4, true));
   489                   v.Add(new Voltage("CPU VCore", 5));
   490                   v.Add(new Voltage("DRAM", 6));
   491                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
   492                   v.Add(new Voltage("VBat", 8, 10, 10));
   493                   t.Add(new Temperature("System", 0));
   494                   t.Add(new Temperature("CPU", 2));
   495                   f.Add(new Fan("CPU Fan", 0));
   496                   f.Add(new Fan("System Fan #1", 1));
   497                   f.Add(new Fan("Power Fan", 2));
   498                   f.Add(new Fan("System Fan #2", 3));
   499                   break;
   500                 case Model.Z68X_UD7_B3: // IT8728F
   501                   v.Add(new Voltage("VTT", 0));
   502                   v.Add(new Voltage("+3.3V", 1, 13.3f, 20.5f));
   503                   v.Add(new Voltage("+12V", 2, 68, 22));
   504                   v.Add(new Voltage("+5V", 3, 14.3f, 20));
   505                   v.Add(new Voltage("CPU VCore", 5));
   506                   v.Add(new Voltage("DRAM", 6));
   507                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
   508                   v.Add(new Voltage("VBat", 8, 10, 10));
   509                   t.Add(new Temperature("System", 0));
   510                   t.Add(new Temperature("CPU", 1));
   511                   t.Add(new Temperature("System 3", 2));
   512                   f.Add(new Fan("CPU Fan", 0));
   513                   f.Add(new Fan("Power Fan", 1));
   514                   f.Add(new Fan("System Fan #1", 2));
   515                   f.Add(new Fan("System Fan #2", 3));
   516                   f.Add(new Fan("System Fan #3", 4));
   517                   break;
   518                 default:
   519                   v.Add(new Voltage("Voltage #1", 0, true));
   520                   v.Add(new Voltage("Voltage #2", 1, true));
   521                   v.Add(new Voltage("Voltage #3", 2, true));
   522                   v.Add(new Voltage("Voltage #4", 3, true));
   523                   v.Add(new Voltage("Voltage #5", 4, true));
   524                   v.Add(new Voltage("Voltage #6", 5, true));
   525                   v.Add(new Voltage("Voltage #7", 6, true));
   526                   v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
   527                   v.Add(new Voltage("VBat", 8, 10, 10));
   528                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   529                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   530                   for (int i = 0; i < superIO.Fans.Length; i++)
   531                     f.Add(new Fan("Fan #" + (i + 1), i));
   532                   break;
   533               }
   534               break;
   535             default:
   536               v.Add(new Voltage("Voltage #1", 0, true));
   537               v.Add(new Voltage("Voltage #2", 1, true));
   538               v.Add(new Voltage("Voltage #3", 2, true));
   539               v.Add(new Voltage("Voltage #4", 3, true));
   540               v.Add(new Voltage("Voltage #5", 4, true));
   541               v.Add(new Voltage("Voltage #6", 5, true));
   542               v.Add(new Voltage("Voltage #7", 6, true));
   543               v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
   544               v.Add(new Voltage("VBat", 8, 10, 10));
   545               for (int i = 0; i < superIO.Temperatures.Length; i++)
   546                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   547               for (int i = 0; i < superIO.Fans.Length; i++)
   548                 f.Add(new Fan("Fan #" + (i + 1), i));
   549               break;
   550           }
   551           break;
   552           
   553         case Chip.F71858:
   554           v.Add(new Voltage("VCC3V", 0, 150, 150));
   555           v.Add(new Voltage("VSB3V", 1, 150, 150));
   556           v.Add(new Voltage("Battery", 2, 150, 150));
   557           for (int i = 0; i < superIO.Temperatures.Length; i++)
   558             t.Add(new Temperature("Temperature #" + (i + 1), i));
   559           for (int i = 0; i < superIO.Fans.Length; i++)
   560             f.Add(new Fan("Fan #" + (i + 1), i));
   561           break;
   562         case Chip.F71862: 
   563         case Chip.F71869: 
   564         case Chip.F71882:
   565         case Chip.F71889AD: 
   566         case Chip.F71889ED: 
   567         case Chip.F71889F:
   568           switch (manufacturer) {
   569             case Manufacturer.EVGA:
   570               switch (model) {
   571                 case Model.X58_SLI_Classified: // F71882 
   572                   v.Add(new Voltage("VCC3V", 0, 150, 150));
   573                   v.Add(new Voltage("CPU VCore", 1, 47, 100));
   574                   v.Add(new Voltage("DIMM", 2, 47, 100));
   575                   v.Add(new Voltage("CPU VTT", 3, 24, 100));
   576                   v.Add(new Voltage("IOH Vcore", 4, 24, 100));
   577                   v.Add(new Voltage("+5V", 5, 51, 12));
   578                   v.Add(new Voltage("+12V", 6, 56, 6.8f));
   579                   v.Add(new Voltage("3VSB", 7, 150, 150));
   580                   v.Add(new Voltage("VBat", 8, 150, 150));
   581                   t.Add(new Temperature("CPU", 0));
   582                   t.Add(new Temperature("VREG", 1));
   583                   t.Add(new Temperature("System", 2));
   584                   f.Add(new Fan("CPU Fan", 0));
   585                   f.Add(new Fan("Power Fan", 1));
   586                   f.Add(new Fan("Chassis Fan", 2));
   587                   break;
   588                 default:
   589                   v.Add(new Voltage("VCC3V", 0, 150, 150));
   590                   v.Add(new Voltage("CPU VCore", 1));
   591                   v.Add(new Voltage("Voltage #3", 2, true));
   592                   v.Add(new Voltage("Voltage #4", 3, true));
   593                   v.Add(new Voltage("Voltage #5", 4, true));
   594                   v.Add(new Voltage("Voltage #6", 5, true));
   595                   v.Add(new Voltage("Voltage #7", 6, true));
   596                   v.Add(new Voltage("VSB3V", 7, 150, 150));
   597                   v.Add(new Voltage("VBat", 8, 150, 150));
   598                   for (int i = 0; i < superIO.Temperatures.Length; i++)
   599                     t.Add(new Temperature("Temperature #" + (i + 1), i));
   600                   for (int i = 0; i < superIO.Fans.Length; i++)
   601                     f.Add(new Fan("Fan #" + (i + 1), i));
   602                   break;
   603               }
   604               break;
   605             default:
   606               v.Add(new Voltage("VCC3V", 0, 150, 150));
   607               v.Add(new Voltage("CPU VCore", 1));
   608               v.Add(new Voltage("Voltage #3", 2, true));
   609               v.Add(new Voltage("Voltage #4", 3, true));
   610               v.Add(new Voltage("Voltage #5", 4, true));
   611               v.Add(new Voltage("Voltage #6", 5, true));
   612               v.Add(new Voltage("Voltage #7", 6, true));
   613               v.Add(new Voltage("VSB3V", 7, 150, 150));
   614               v.Add(new Voltage("VBat", 8, 150, 150));
   615               for (int i = 0; i < superIO.Temperatures.Length; i++)
   616                 t.Add(new Temperature("Temperature #" + (i + 1), i));
   617               for (int i = 0; i < superIO.Fans.Length; i++)
   618                 f.Add(new Fan("Fan #" + (i + 1), i));
   619               break;
   620           }
   621           break;
   622 
   623         case Chip.W83627EHF:
   624           switch (manufacturer) {
   625             case Manufacturer.ASRock:
   626               switch (model) {
   627                 case Model.AOD790GX_128M: // W83627EHF
   628                   v.Add(new Voltage("CPU VCore", 0));
   629                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
   630                   v.Add(new Voltage("+3.3V", 4, 10, 10));
   631                   v.Add(new Voltage("+5V", 5, 20, 10));
   632                   v.Add(new Voltage("+12V", 6, 28, 5));
   633                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   634                   v.Add(new Voltage("VBAT", 8, 34, 34));
   635                   t.Add(new Temperature("CPU", 0));
   636                   t.Add(new Temperature("Motherboard", 2));
   637                   f.Add(new Fan("CPU Fan", 0));
   638                   f.Add(new Fan("Chassis Fan", 1));                 
   639                   break;
   640                 default:
   641                   v.Add(new Voltage("CPU VCore", 0));
   642                   v.Add(new Voltage("Voltage #2", 1, true));
   643                   v.Add(new Voltage("AVCC", 2, 34, 34));
   644                   v.Add(new Voltage("3VCC", 3, 34, 34));
   645                   v.Add(new Voltage("Voltage #5", 4, true));
   646                   v.Add(new Voltage("Voltage #6", 5, true));
   647                   v.Add(new Voltage("Voltage #7", 6, true));
   648                   v.Add(new Voltage("3VSB", 7, 34, 34));
   649                   v.Add(new Voltage("VBAT", 8, 34, 34));
   650                   v.Add(new Voltage("Voltage #10", 9, true));
   651                   t.Add(new Temperature("CPU", 0));
   652                   t.Add(new Temperature("Auxiliary", 1));
   653                   t.Add(new Temperature("System", 2));
   654                   f.Add(new Fan("System Fan", 0));
   655                   f.Add(new Fan("CPU Fan", 1));
   656                   f.Add(new Fan("Auxiliary Fan", 2));
   657                   f.Add(new Fan("CPU Fan #2", 3));
   658                   f.Add(new Fan("Auxiliary Fan #2", 4));
   659                   break;
   660               } break;
   661             default:
   662               v.Add(new Voltage("CPU VCore", 0));
   663               v.Add(new Voltage("Voltage #2", 1, true));
   664               v.Add(new Voltage("AVCC", 2, 34, 34));
   665               v.Add(new Voltage("3VCC", 3, 34, 34));
   666               v.Add(new Voltage("Voltage #5", 4, true));
   667               v.Add(new Voltage("Voltage #6", 5, true));
   668               v.Add(new Voltage("Voltage #7", 6, true));
   669               v.Add(new Voltage("3VSB", 7, 34, 34));
   670               v.Add(new Voltage("VBAT", 8, 34, 34));
   671               v.Add(new Voltage("Voltage #10", 9, true));
   672               t.Add(new Temperature("CPU", 0));
   673               t.Add(new Temperature("Auxiliary", 1));
   674               t.Add(new Temperature("System", 2));
   675               f.Add(new Fan("System Fan", 0));
   676               f.Add(new Fan("CPU Fan", 1));
   677               f.Add(new Fan("Auxiliary Fan", 2));
   678               f.Add(new Fan("CPU Fan #2", 3));
   679               f.Add(new Fan("Auxiliary Fan #2", 4));
   680               break;
   681           }
   682           break;
   683         case Chip.W83627DHG: 
   684         case Chip.W83627DHGP:                      
   685         case Chip.W83667HG:
   686         case Chip.W83667HGB:
   687           switch (manufacturer) {
   688             case Manufacturer.ASRock:
   689               switch (model) {
   690                 case Model._880GMH_USB3: // W83627DHG-P
   691                   v.Add(new Voltage("CPU VCore", 0));
   692                   v.Add(new Voltage("+3.3V", 3, 34, 34));
   693                   v.Add(new Voltage("+5V", 5, 15, 7.5f));
   694                   v.Add(new Voltage("+12V", 6, 56, 10));
   695                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   696                   v.Add(new Voltage("VBAT", 8, 34, 34));
   697                   t.Add(new Temperature("CPU", 0));
   698                   t.Add(new Temperature("Motherboard", 2));
   699                   f.Add(new Fan("Chassis Fan", 0));
   700                   f.Add(new Fan("CPU Fan", 1));
   701                   f.Add(new Fan("Power Fan", 2));
   702                   break;
   703                 default:
   704                   v.Add(new Voltage("CPU VCore", 0));
   705                   v.Add(new Voltage("Voltage #2", 1, true));
   706                   v.Add(new Voltage("AVCC", 2, 34, 34));
   707                   v.Add(new Voltage("3VCC", 3, 34, 34));
   708                   v.Add(new Voltage("Voltage #5", 4, true));
   709                   v.Add(new Voltage("Voltage #6", 5, true));
   710                   v.Add(new Voltage("Voltage #7", 6, true));
   711                   v.Add(new Voltage("3VSB", 7, 34, 34));
   712                   v.Add(new Voltage("VBAT", 8, 34, 34));
   713                   t.Add(new Temperature("CPU", 0));
   714                   t.Add(new Temperature("Auxiliary", 1));
   715                   t.Add(new Temperature("System", 2));
   716                   f.Add(new Fan("System Fan", 0));
   717                   f.Add(new Fan("CPU Fan", 1));
   718                   f.Add(new Fan("Auxiliary Fan", 2));
   719                   f.Add(new Fan("CPU Fan #2", 3));
   720                   f.Add(new Fan("Auxiliary Fan #2", 4));
   721                   break;
   722               }
   723               break;
   724             case Manufacturer.ASUS:
   725               switch (model) {
   726                 case Model.P6X58D_E: // W83667HG                 
   727                 case Model.Rampage_II_GENE: // W83667HG 
   728                   v.Add(new Voltage("CPU VCore", 0));
   729                   v.Add(new Voltage("+12V", 1, 11.5f, 1.91f));
   730                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
   731                   v.Add(new Voltage("+3.3V", 3, 34, 34));
   732                   v.Add(new Voltage("+5V", 4, 15, 7.5f));
   733                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   734                   v.Add(new Voltage("VBAT", 8, 34, 34));
   735                   t.Add(new Temperature("CPU", 0));
   736                   t.Add(new Temperature("Motherboard", 2));
   737                   f.Add(new Fan("Chassis Fan #1", 0));
   738                   f.Add(new Fan("CPU Fan", 1));
   739                   f.Add(new Fan("Power Fan", 2));
   740                   f.Add(new Fan("Chassis Fan #2", 3));
   741                   f.Add(new Fan("Chassis Fan #3", 4));
   742                   break;
   743                 case Model.Rampage_Extreme: // W83667HG 
   744                   v.Add(new Voltage("CPU VCore", 0));
   745                   v.Add(new Voltage("+12V", 1, 12, 2));
   746                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
   747                   v.Add(new Voltage("+3.3V", 3, 34, 34));
   748                   v.Add(new Voltage("+5V", 4, 15, 7.5f));
   749                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   750                   v.Add(new Voltage("VBAT", 8, 34, 34));
   751                   t.Add(new Temperature("CPU", 0));
   752                   t.Add(new Temperature("Motherboard", 2));
   753                   f.Add(new Fan("Chassis Fan #1", 0));
   754                   f.Add(new Fan("CPU Fan", 1));
   755                   f.Add(new Fan("Power Fan", 2));
   756                   f.Add(new Fan("Chassis Fan #2", 3));
   757                   f.Add(new Fan("Chassis Fan #3", 4));
   758                   break;
   759                 default:
   760                   v.Add(new Voltage("CPU VCore", 0));
   761                   v.Add(new Voltage("Voltage #2", 1, true));
   762                   v.Add(new Voltage("AVCC", 2, 34, 34));
   763                   v.Add(new Voltage("3VCC", 3, 34, 34));
   764                   v.Add(new Voltage("Voltage #5", 4, true));
   765                   v.Add(new Voltage("Voltage #6", 5, true));
   766                   v.Add(new Voltage("Voltage #7", 6, true));
   767                   v.Add(new Voltage("3VSB", 7, 34, 34));
   768                   v.Add(new Voltage("VBAT", 8, 34, 34));
   769                   t.Add(new Temperature("CPU", 0));
   770                   t.Add(new Temperature("Auxiliary", 1));
   771                   t.Add(new Temperature("System", 2));
   772                   f.Add(new Fan("System Fan", 0));
   773                   f.Add(new Fan("CPU Fan", 1));
   774                   f.Add(new Fan("Auxiliary Fan", 2));
   775                   f.Add(new Fan("CPU Fan #2", 3));
   776                   f.Add(new Fan("Auxiliary Fan #2", 4));
   777                   break;
   778               }
   779               break;
   780             default:
   781               v.Add(new Voltage("CPU VCore", 0));
   782               v.Add(new Voltage("Voltage #2", 1, true));
   783               v.Add(new Voltage("AVCC", 2, 34, 34));
   784               v.Add(new Voltage("3VCC", 3, 34, 34));
   785               v.Add(new Voltage("Voltage #5", 4, true));
   786               v.Add(new Voltage("Voltage #6", 5, true));
   787               v.Add(new Voltage("Voltage #7", 6, true));
   788               v.Add(new Voltage("3VSB", 7, 34, 34));
   789               v.Add(new Voltage("VBAT", 8, 34, 34));
   790               t.Add(new Temperature("CPU", 0));
   791               t.Add(new Temperature("Auxiliary", 1));
   792               t.Add(new Temperature("System", 2));
   793               f.Add(new Fan("System Fan", 0));
   794               f.Add(new Fan("CPU Fan", 1));
   795               f.Add(new Fan("Auxiliary Fan", 2));
   796               f.Add(new Fan("CPU Fan #2", 3));
   797               f.Add(new Fan("Auxiliary Fan #2", 4));
   798               break;
   799           } 
   800           break;
   801         case Chip.W83627HF: 
   802         case Chip.W83627THF: 
   803         case Chip.W83687THF:
   804           v.Add(new Voltage("CPU VCore", 0));
   805           v.Add(new Voltage("Voltage #2", 1, true));
   806           v.Add(new Voltage("Voltage #3", 2, true));
   807           v.Add(new Voltage("AVCC", 3, 34, 51));
   808           v.Add(new Voltage("Voltage #5", 4, true));
   809           v.Add(new Voltage("5VSB", 5, 34, 51));
   810           v.Add(new Voltage("VBAT", 6));
   811           t.Add(new Temperature("CPU", 0));
   812           t.Add(new Temperature("Auxiliary", 1));
   813           t.Add(new Temperature("System", 2));
   814           f.Add(new Fan("System Fan", 0));
   815           f.Add(new Fan("CPU Fan", 1));
   816           f.Add(new Fan("Auxiliary Fan", 2));
   817           break;
   818         case Chip.NCT6771F:
   819         case Chip.NCT6776F:
   820           switch (manufacturer) {
   821             case Manufacturer.ASUS:
   822               switch (model) {
   823                 case Model.P8P67_PRO: // NCT6776F
   824                   v.Add(new Voltage("CPU VCore", 0));
   825                   v.Add(new Voltage("+12V", 1, 11, 1));
   826                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
   827                   v.Add(new Voltage("+3.3V", 3, 34, 34));
   828                   v.Add(new Voltage("+5V", 4, 12, 3));
   829                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   830                   v.Add(new Voltage("VBAT", 8, 34, 34));
   831                   t.Add(new Temperature("CPU", 0));
   832                   t.Add(new Temperature("Auxiliary", 2));
   833                   t.Add(new Temperature("Motherboard", 3));
   834                   f.Add(new Fan("Chassis Fan #1", 0));
   835                   f.Add(new Fan("CPU Fan", 1));
   836                   f.Add(new Fan("Power Fan", 2));
   837                   f.Add(new Fan("Chassis Fan #2", 3));
   838                   break;
   839                 case Model.P8P67_M_PRO: // NCT6776F
   840                   v.Add(new Voltage("CPU VCore", 0));
   841                   v.Add(new Voltage("+12V", 1, 11, 1));
   842                   v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
   843                   v.Add(new Voltage("+3.3V", 3, 34, 34));
   844                   v.Add(new Voltage("+5V", 4, 12, 3));
   845                   v.Add(new Voltage("Voltage #6", 5, true));
   846                   v.Add(new Voltage("Voltage #7", 6, true));
   847                   v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
   848                   v.Add(new Voltage("VBAT", 8, 34, 34));
   849                   t.Add(new Temperature("CPU", 0));
   850                   t.Add(new Temperature("Motherboard", 3));
   851                   f.Add(new Fan("Chassis Fan #1", 0));
   852                   f.Add(new Fan("CPU Fan", 1));
   853                   f.Add(new Fan("Chassis Fan #2", 2));
   854                   f.Add(new Fan("Power Fan", 3));
   855                   f.Add(new Fan("Auxiliary Fan", 4));
   856                   break;
   857                 default:
   858                   v.Add(new Voltage("CPU VCore", 0));
   859                   v.Add(new Voltage("Voltage #2", 1, true));
   860                   v.Add(new Voltage("AVCC", 2, 34, 34));
   861                   v.Add(new Voltage("3VCC", 3, 34, 34));
   862                   v.Add(new Voltage("Voltage #5", 4, true));
   863                   v.Add(new Voltage("Voltage #6", 5, true));
   864                   v.Add(new Voltage("Voltage #7", 6, true));
   865                   v.Add(new Voltage("3VSB", 7, 34, 34));
   866                   v.Add(new Voltage("VBAT", 8, 34, 34));
   867                   t.Add(new Temperature("CPU", 0));
   868                   t.Add(new Temperature("CPU", 1));
   869                   t.Add(new Temperature("Auxiliary", 2));
   870                   t.Add(new Temperature("System", 3));
   871                   for (int i = 0; i < superIO.Fans.Length; i++)
   872                     f.Add(new Fan("Fan #" + (i + 1), i));
   873                   break;
   874               }
   875               break;
   876             default:
   877               v.Add(new Voltage("CPU VCore", 0));
   878               v.Add(new Voltage("Voltage #2", 1, true));
   879               v.Add(new Voltage("AVCC", 2, 34, 34));
   880               v.Add(new Voltage("3VCC", 3, 34, 34));
   881               v.Add(new Voltage("Voltage #5", 4, true));
   882               v.Add(new Voltage("Voltage #6", 5, true));
   883               v.Add(new Voltage("Voltage #7", 6, true));
   884               v.Add(new Voltage("3VSB", 7, 34, 34));
   885               v.Add(new Voltage("VBAT", 8, 34, 34));
   886               t.Add(new Temperature("CPU", 0));
   887               t.Add(new Temperature("CPU", 1));
   888               t.Add(new Temperature("Auxiliary", 2));
   889               t.Add(new Temperature("System", 3));
   890               for (int i = 0; i < superIO.Fans.Length; i++)
   891                 f.Add(new Fan("Fan #" + (i + 1), i));
   892               break;
   893           }
   894           break;
   895         default:
   896           for (int i = 0; i < superIO.Voltages.Length; i++)
   897             v.Add(new Voltage("Voltage #" + (i + 1), i, true));
   898           for (int i = 0; i < superIO.Temperatures.Length; i++)
   899             t.Add(new Temperature("Temperature #" + (i + 1), i));
   900           for (int i = 0; i < superIO.Fans.Length; i++)
   901             f.Add(new Fan("Fan #" + (i + 1), i));
   902           break;
   903       }
   904 
   905       const string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
   906       foreach (Voltage voltage in v) 
   907         if (voltage.Index < superIO.Voltages.Length) {
   908           Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
   909             voltage.Hidden, SensorType.Voltage, this, new [] {
   910             new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
   911               formula, voltage.Ri),
   912             new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
   913               formula, voltage.Rf),
   914             new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
   915               formula, voltage.Vf)
   916             }, settings);
   917           voltages.Add(sensor);
   918       }
   919 
   920       foreach (Temperature temperature in t) 
   921         if (temperature.Index < superIO.Temperatures.Length) {
   922         Sensor sensor = new Sensor(temperature.Name, temperature.Index,
   923           SensorType.Temperature, this, new [] {
   924           new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
   925         }, settings);
   926         temperatures.Add(sensor);
   927       }
   928 
   929       foreach (Fan fan in f)
   930         if (fan.Index < superIO.Fans.Length) {
   931           Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
   932             this, settings);
   933           fans.Add(sensor);
   934         }
   935     }
   936 
   937     public override HardwareType HardwareType {
   938       get { return HardwareType.SuperIO; }
   939     }
   940 
   941     public override IHardware Parent {
   942       get { return mainboard; }
   943     }
   944 
   945 
   946     public override string GetReport() {
   947       return superIO.GetReport();
   948     }
   949 
   950     public override void Update() {
   951       superIO.Update();
   952 
   953       foreach (Sensor sensor in voltages) {
   954         float? value = readVoltage(sensor.Index);
   955         if (value.HasValue) {
   956           sensor.Value = value + (value - sensor.Parameters[2].Value) *
   957             sensor.Parameters[0].Value / sensor.Parameters[1].Value;
   958           ActivateSensor(sensor);
   959         }
   960       }
   961 
   962       foreach (Sensor sensor in temperatures) {
   963         float? value = readTemperature(sensor.Index);
   964         if (value.HasValue) {
   965           sensor.Value = value + sensor.Parameters[0].Value;
   966           ActivateSensor(sensor);
   967         }
   968       }
   969 
   970       foreach (Sensor sensor in fans) {
   971         float? value = readFan(sensor.Index);
   972         if (value.HasValue) {
   973           sensor.Value = value;
   974           if (value.Value > 0)
   975             ActivateSensor(sensor);
   976         }
   977       }
   978 
   979       postUpdate();
   980     }
   981 
   982     private class Voltage {
   983       public readonly string Name;
   984       public readonly int Index;
   985       public readonly float Ri;
   986       public readonly float Rf;
   987       public readonly float Vf;
   988       public readonly bool Hidden;
   989 
   990       public Voltage(string name, int index) :
   991         this(name, index, false) { }
   992       
   993       public Voltage(string name, int index, bool hidden) :
   994         this(name, index, 0, 1, 0, hidden) { }
   995       
   996       public Voltage(string name, int index, float ri, float rf) :
   997         this(name, index, ri, rf, 0, false) { }
   998       
   999       // float ri = 0, float rf = 1, float vf = 0, bool hidden = false) 
  1000       
  1001       public Voltage(string name, int index, 
  1002         float ri, float rf, float vf, bool hidden) 
  1003       {
  1004         this.Name = name;
  1005         this.Index = index;
  1006         this.Ri = ri;
  1007         this.Rf = rf;
  1008         this.Vf = vf;
  1009         this.Hidden = hidden;
  1010       }
  1011     }
  1012 
  1013     private class Temperature {
  1014       public readonly string Name;
  1015       public readonly int Index;
  1016 
  1017       public Temperature(string name, int index) {
  1018         this.Name = name;
  1019         this.Index = index;
  1020       }
  1021     }
  1022 
  1023     private class Fan {
  1024       public readonly string Name;
  1025       public readonly int Index;
  1026 
  1027       public Fan(string name, int index) {
  1028         this.Name = name;
  1029         this.Index = index;
  1030       }
  1031     }
  1032   }
  1033 }