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