Hardware/Mainboard/SuperIOHardware.cs
author moel.mich
Sat, 25 Jun 2011 14:46:28 +0000
changeset 304 16a86362c2ca
parent 290 22214a7e85a9
child 305 9652074e6ee5
permissions -rw-r--r--
Changed the maximum buffer size for double buffering of controls that isn't disposed after each draw call to the size of the screen. This should reduce the memory allocation and disposing on each sensor update. Also page faults are no longer increasing with this change.
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@290
   466
                case Model.P67A_UD4_B3: // IT8728F
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@290
   483
                case Model.H67A_UD3H_B3: // IT8728F
moel@290
   484
                  v.Add(new Voltage("VTT", 0));
moel@290
   485
                  v.Add(new Voltage("+5V", 1, 15, 10));
moel@290
   486
                  v.Add(new Voltage("+12V", 2, 68, 22));
moel@290
   487
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@290
   488
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@290
   489
                  v.Add(new Voltage("CPU VCore", 5));
moel@290
   490
                  v.Add(new Voltage("DRAM", 6));
moel@290
   491
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10));
moel@290
   492
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@290
   493
                  t.Add(new Temperature("System", 0));
moel@290
   494
                  t.Add(new Temperature("CPU", 2));
moel@290
   495
                  f.Add(new Fan("CPU Fan", 0));
moel@290
   496
                  f.Add(new Fan("System Fan #1", 1));
moel@290
   497
                  f.Add(new Fan("Power Fan", 2));
moel@290
   498
                  f.Add(new Fan("System Fan #2", 3));
moel@290
   499
                  break;
moel@278
   500
                default:
moel@278
   501
                  v.Add(new Voltage("Voltage #1", 0, true));
moel@278
   502
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@278
   503
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@278
   504
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@278
   505
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@278
   506
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@278
   507
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@278
   508
                  v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@278
   509
                  v.Add(new Voltage("VBat", 8, 10, 10));
moel@278
   510
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@278
   511
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@278
   512
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@278
   513
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@278
   514
                  break;
moel@278
   515
              }
moel@278
   516
              break;
moel@177
   517
            default:
moel@177
   518
              v.Add(new Voltage("Voltage #1", 0, true));
moel@177
   519
              v.Add(new Voltage("Voltage #2", 1, true));
moel@177
   520
              v.Add(new Voltage("Voltage #3", 2, true));
moel@277
   521
              v.Add(new Voltage("Voltage #4", 3, true));
moel@177
   522
              v.Add(new Voltage("Voltage #5", 4, true));
moel@177
   523
              v.Add(new Voltage("Voltage #6", 5, true));
moel@177
   524
              v.Add(new Voltage("Voltage #7", 6, true));
moel@177
   525
              v.Add(new Voltage("Standby +3.3V", 7, 10, 10, 0, true));
moel@195
   526
              v.Add(new Voltage("VBat", 8, 10, 10));
moel@177
   527
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@177
   528
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@177
   529
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@177
   530
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@177
   531
              break;
moel@177
   532
          }
moel@170
   533
          break;
moel@130
   534
          
moel@130
   535
        case Chip.F71858:
moel@195
   536
          v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   537
          v.Add(new Voltage("VSB3V", 1, 150, 150));
moel@195
   538
          v.Add(new Voltage("Battery", 2, 150, 150));
moel@130
   539
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   540
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   541
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   542
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   543
          break;
moel@130
   544
        case Chip.F71862: 
moel@130
   545
        case Chip.F71869: 
moel@130
   546
        case Chip.F71882:
moel@296
   547
        case Chip.F71889AD: 
moel@130
   548
        case Chip.F71889ED: 
moel@130
   549
        case Chip.F71889F:
moel@132
   550
          switch (manufacturer) {
moel@132
   551
            case Manufacturer.EVGA:
moel@132
   552
              switch (model) {
moel@168
   553
                case Model.X58_SLI_Classified: // F71882 
moel@195
   554
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@195
   555
                  v.Add(new Voltage("CPU VCore", 1, 47, 100));
moel@195
   556
                  v.Add(new Voltage("DIMM", 2, 47, 100));
moel@195
   557
                  v.Add(new Voltage("CPU VTT", 3, 24, 100));
moel@195
   558
                  v.Add(new Voltage("IOH Vcore", 4, 24, 100));
moel@195
   559
                  v.Add(new Voltage("+5V", 5, 51, 12));
moel@195
   560
                  v.Add(new Voltage("+12V", 6, 56, 6.8f));
moel@195
   561
                  v.Add(new Voltage("3VSB", 7, 150, 150));
moel@195
   562
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   563
                  t.Add(new Temperature("CPU", 0));
moel@132
   564
                  t.Add(new Temperature("VREG", 1));
moel@132
   565
                  t.Add(new Temperature("System", 2));
moel@132
   566
                  f.Add(new Fan("CPU Fan", 0));
moel@132
   567
                  f.Add(new Fan("Power Fan", 1));
moel@132
   568
                  f.Add(new Fan("Chassis Fan", 2));
moel@132
   569
                  break;
moel@132
   570
                default:
moel@195
   571
                  v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   572
                  v.Add(new Voltage("CPU VCore", 1));
moel@132
   573
                  v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   574
                  v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   575
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   576
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   577
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   578
                  v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   579
                  v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   580
                  for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   581
                    t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   582
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   583
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   584
                  break;
moel@132
   585
              }
moel@132
   586
              break;
moel@132
   587
            default:
moel@195
   588
              v.Add(new Voltage("VCC3V", 0, 150, 150));
moel@132
   589
              v.Add(new Voltage("CPU VCore", 1));
moel@132
   590
              v.Add(new Voltage("Voltage #3", 2, true));
moel@132
   591
              v.Add(new Voltage("Voltage #4", 3, true));
moel@132
   592
              v.Add(new Voltage("Voltage #5", 4, true));
moel@132
   593
              v.Add(new Voltage("Voltage #6", 5, true));
moel@132
   594
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   595
              v.Add(new Voltage("VSB3V", 7, 150, 150));
moel@195
   596
              v.Add(new Voltage("VBat", 8, 150, 150));
moel@132
   597
              for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@132
   598
                t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@132
   599
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@132
   600
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@132
   601
              break;
moel@132
   602
          }
moel@130
   603
          break;
moel@130
   604
moel@220
   605
        case Chip.W83627EHF:
moel@220
   606
          switch (manufacturer) {
moel@220
   607
            case Manufacturer.ASRock:
moel@220
   608
              switch (model) {
moel@220
   609
                case Model.AOD790GX_128M: // W83627EHF
moel@220
   610
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   611
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@220
   612
                  v.Add(new Voltage("+3.3V", 4, 10, 10));
moel@220
   613
                  v.Add(new Voltage("+5V", 5, 20, 10));
moel@220
   614
                  v.Add(new Voltage("+12V", 6, 28, 5));
moel@220
   615
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@220
   616
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   617
                  t.Add(new Temperature("CPU", 0));
moel@220
   618
                  t.Add(new Temperature("Motherboard", 2));
moel@221
   619
                  f.Add(new Fan("CPU Fan", 0));
moel@221
   620
                  f.Add(new Fan("Chassis Fan", 1));                 
moel@220
   621
                  break;
moel@220
   622
                default:
moel@220
   623
                  v.Add(new Voltage("CPU VCore", 0));
moel@220
   624
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   625
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   626
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   627
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   628
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   629
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   630
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   631
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   632
                  v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   633
                  t.Add(new Temperature("CPU", 0));
moel@220
   634
                  t.Add(new Temperature("Auxiliary", 1));
moel@220
   635
                  t.Add(new Temperature("System", 2));
moel@220
   636
                  f.Add(new Fan("System Fan", 0));
moel@220
   637
                  f.Add(new Fan("CPU Fan", 1));
moel@220
   638
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   639
                  f.Add(new Fan("CPU Fan #2", 3));
moel@220
   640
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   641
                  break;
moel@220
   642
              } break;
moel@220
   643
            default:
moel@220
   644
              v.Add(new Voltage("CPU VCore", 0));
moel@220
   645
              v.Add(new Voltage("Voltage #2", 1, true));
moel@220
   646
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@220
   647
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@220
   648
              v.Add(new Voltage("Voltage #5", 4, true));
moel@220
   649
              v.Add(new Voltage("Voltage #6", 5, true));
moel@220
   650
              v.Add(new Voltage("Voltage #7", 6, true));
moel@220
   651
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@220
   652
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@220
   653
              v.Add(new Voltage("Voltage #10", 9, true));
moel@220
   654
              t.Add(new Temperature("CPU", 0));
moel@220
   655
              t.Add(new Temperature("Auxiliary", 1));
moel@220
   656
              t.Add(new Temperature("System", 2));
moel@220
   657
              f.Add(new Fan("System Fan", 0));
moel@220
   658
              f.Add(new Fan("CPU Fan", 1));
moel@220
   659
              f.Add(new Fan("Auxiliary Fan", 2));
moel@220
   660
              f.Add(new Fan("CPU Fan #2", 3));
moel@220
   661
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@220
   662
              break;
moel@220
   663
          }
moel@130
   664
          break;
moel@130
   665
        case Chip.W83627DHG: 
moel@130
   666
        case Chip.W83627DHGP:                      
moel@130
   667
        case Chip.W83667HG:
moel@130
   668
        case Chip.W83667HGB:
moel@152
   669
          switch (manufacturer) {
moel@153
   670
            case Manufacturer.ASRock:
moel@153
   671
              switch (model) {
moel@168
   672
                case Model._880GMH_USB3: // W83627DHG-P
moel@153
   673
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   674
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   675
                  v.Add(new Voltage("+5V", 5, 15, 7.5f));
moel@195
   676
                  v.Add(new Voltage("+12V", 6, 56, 10));
moel@195
   677
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   678
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   679
                  t.Add(new Temperature("CPU", 0));
moel@153
   680
                  t.Add(new Temperature("Motherboard", 2));
moel@153
   681
                  f.Add(new Fan("Chassis Fan", 0));
moel@153
   682
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   683
                  f.Add(new Fan("Power Fan", 2));
moel@153
   684
                  break;
moel@153
   685
                default:
moel@153
   686
                  v.Add(new Voltage("CPU VCore", 0));
moel@153
   687
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   688
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   689
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@153
   690
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@153
   691
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@153
   692
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   693
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   694
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@153
   695
                  t.Add(new Temperature("CPU", 0));
moel@153
   696
                  t.Add(new Temperature("Auxiliary", 1));
moel@153
   697
                  t.Add(new Temperature("System", 2));
moel@153
   698
                  f.Add(new Fan("System Fan", 0));
moel@153
   699
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   700
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   701
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   702
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@153
   703
                  break;
moel@153
   704
              }
moel@153
   705
              break;
moel@152
   706
            case Manufacturer.ASUS:
moel@152
   707
              switch (model) {
moel@174
   708
                case Model.P6X58D_E: // W83667HG                 
moel@174
   709
                case Model.Rampage_II_GENE: // W83667HG 
moel@152
   710
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   711
                  v.Add(new Voltage("+12V", 1, 11.5f, 1.91f));
moel@195
   712
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   713
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   714
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   715
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@195
   716
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@174
   717
                  t.Add(new Temperature("CPU", 0));
moel@174
   718
                  t.Add(new Temperature("Motherboard", 2));
moel@174
   719
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@174
   720
                  f.Add(new Fan("CPU Fan", 1));
moel@174
   721
                  f.Add(new Fan("Power Fan", 2));
moel@174
   722
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@174
   723
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@174
   724
                  break;
moel@174
   725
                case Model.Rampage_Extreme: // W83667HG 
moel@174
   726
                  v.Add(new Voltage("CPU VCore", 0));
moel@195
   727
                  v.Add(new Voltage("+12V", 1, 12, 2));
moel@195
   728
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@195
   729
                  v.Add(new Voltage("+3.3V", 3, 34, 34));
moel@195
   730
                  v.Add(new Voltage("+5V", 4, 15, 7.5f));
moel@195
   731
                  v.Add(new Voltage("Standby +3.3V", 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("Motherboard", 2));
moel@152
   735
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@153
   736
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   737
                  f.Add(new Fan("Power Fan", 2));
moel@152
   738
                  f.Add(new Fan("Chassis Fan #2", 3));
moel@152
   739
                  f.Add(new Fan("Chassis Fan #3", 4));
moel@152
   740
                  break;
moel@152
   741
                default:
moel@152
   742
                  v.Add(new Voltage("CPU VCore", 0));
moel@152
   743
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   744
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   745
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   746
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   747
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   748
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   749
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   750
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   751
                  t.Add(new Temperature("CPU", 0));
moel@152
   752
                  t.Add(new Temperature("Auxiliary", 1));
moel@152
   753
                  t.Add(new Temperature("System", 2));
moel@153
   754
                  f.Add(new Fan("System Fan", 0));
moel@153
   755
                  f.Add(new Fan("CPU Fan", 1));
moel@153
   756
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   757
                  f.Add(new Fan("CPU Fan #2", 3));
moel@153
   758
                  f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   759
                  break;
moel@152
   760
              }
moel@152
   761
              break;
moel@152
   762
            default:
moel@152
   763
              v.Add(new Voltage("CPU VCore", 0));
moel@152
   764
              v.Add(new Voltage("Voltage #2", 1, true));
moel@195
   765
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@195
   766
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@152
   767
              v.Add(new Voltage("Voltage #5", 4, true));
moel@152
   768
              v.Add(new Voltage("Voltage #6", 5, true));
moel@152
   769
              v.Add(new Voltage("Voltage #7", 6, true));
moel@195
   770
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@195
   771
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@152
   772
              t.Add(new Temperature("CPU", 0));
moel@152
   773
              t.Add(new Temperature("Auxiliary", 1));
moel@152
   774
              t.Add(new Temperature("System", 2));
moel@153
   775
              f.Add(new Fan("System Fan", 0));
moel@153
   776
              f.Add(new Fan("CPU Fan", 1));
moel@153
   777
              f.Add(new Fan("Auxiliary Fan", 2));
moel@153
   778
              f.Add(new Fan("CPU Fan #2", 3));
moel@153
   779
              f.Add(new Fan("Auxiliary Fan #2", 4));
moel@152
   780
              break;
moel@152
   781
          } 
moel@130
   782
          break;
moel@130
   783
        case Chip.W83627HF: 
moel@130
   784
        case Chip.W83627THF: 
moel@130
   785
        case Chip.W83687THF:
moel@130
   786
          v.Add(new Voltage("CPU VCore", 0));
moel@130
   787
          v.Add(new Voltage("Voltage #2", 1, true));
moel@130
   788
          v.Add(new Voltage("Voltage #3", 2, true));
moel@195
   789
          v.Add(new Voltage("AVCC", 3, 34, 51));
moel@130
   790
          v.Add(new Voltage("Voltage #5", 4, true));
moel@195
   791
          v.Add(new Voltage("5VSB", 5, 34, 51));
moel@130
   792
          v.Add(new Voltage("VBAT", 6));
moel@130
   793
          t.Add(new Temperature("CPU", 0));
moel@130
   794
          t.Add(new Temperature("Auxiliary", 1));
moel@130
   795
          t.Add(new Temperature("System", 2));
moel@153
   796
          f.Add(new Fan("System Fan", 0));
moel@153
   797
          f.Add(new Fan("CPU Fan", 1));
moel@153
   798
          f.Add(new Fan("Auxiliary Fan", 2));
moel@130
   799
          break;
moel@245
   800
        case Chip.NCT6771F:
moel@265
   801
        case Chip.NCT6776F:
moel@265
   802
          switch (manufacturer) {
moel@265
   803
            case Manufacturer.ASUS:
moel@265
   804
              switch (model) {
moel@265
   805
                case Model.P8P67_PRO: // NCT6776F
moel@265
   806
                  v.Add(new Voltage("CPU VCore", 0));
moel@265
   807
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   808
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   809
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   810
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   811
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   812
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   813
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   814
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@276
   815
                  t.Add(new Temperature("CPU", 1));
moel@276
   816
                  t.Add(new Temperature("Auxiliary", 2));
moel@276
   817
                  t.Add(new Temperature("System", 3));
moel@265
   818
                  f.Add(new Fan("System Fan", 0));
moel@265
   819
                  f.Add(new Fan("CPU Fan", 1));
moel@265
   820
                  f.Add(new Fan("Auxiliary Fan", 2));
moel@265
   821
                  f.Add(new Fan("Auxiliary Fan #2", 3));
moel@265
   822
                  f.Add(new Fan("Auxiliary Fan #3", 4));
moel@265
   823
                  break;
moel@276
   824
                case Model.P8P67_M_PRO: // NCT6776F
moel@276
   825
                  v.Add(new Voltage("CPU VCore", 0));
moel@276
   826
                  v.Add(new Voltage("+12V", 1, 11, 1));
moel@276
   827
                  v.Add(new Voltage("Analog +3.3V", 2, 34, 34));
moel@276
   828
                  v.Add(new Voltage("+3V", 3, 34, 34));
moel@276
   829
                  v.Add(new Voltage("+5V", 4, 12, 3));
moel@276
   830
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@276
   831
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@276
   832
                  v.Add(new Voltage("Standby +3.3V", 7, 34, 34));
moel@276
   833
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@276
   834
                  t.Add(new Temperature("CPU", 0));
moel@276
   835
                  t.Add(new Temperature("Motherboard", 3));
moel@276
   836
                  f.Add(new Fan("Chassis Fan #1", 0));
moel@276
   837
                  f.Add(new Fan("CPU Fan", 1));
moel@276
   838
                  f.Add(new Fan("Chassis Fan #2", 2));
moel@276
   839
                  f.Add(new Fan("Power Fan", 3));
moel@276
   840
                  f.Add(new Fan("Auxiliary Fan", 4));
moel@276
   841
                  break;
moel@265
   842
                default:
moel@265
   843
                  v.Add(new Voltage("CPU VCore", 0));
moel@265
   844
                  v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   845
                  v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   846
                  v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   847
                  v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   848
                  v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   849
                  v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   850
                  v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   851
                  v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   852
                  t.Add(new Temperature("CPU", 0));
moel@276
   853
                  t.Add(new Temperature("CPU", 1));
moel@276
   854
                  t.Add(new Temperature("Auxiliary", 2));
moel@276
   855
                  t.Add(new Temperature("System", 3));
moel@265
   856
                  for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   857
                    f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   858
                  break;
moel@265
   859
              }
moel@265
   860
              break;
moel@265
   861
            default:
moel@265
   862
              v.Add(new Voltage("CPU VCore", 0));
moel@265
   863
              v.Add(new Voltage("Voltage #2", 1, true));
moel@265
   864
              v.Add(new Voltage("AVCC", 2, 34, 34));
moel@265
   865
              v.Add(new Voltage("3VCC", 3, 34, 34));
moel@265
   866
              v.Add(new Voltage("Voltage #5", 4, true));
moel@265
   867
              v.Add(new Voltage("Voltage #6", 5, true));
moel@265
   868
              v.Add(new Voltage("Voltage #7", 6, true));
moel@265
   869
              v.Add(new Voltage("3VSB", 7, 34, 34));
moel@265
   870
              v.Add(new Voltage("VBAT", 8, 34, 34));
moel@265
   871
              t.Add(new Temperature("CPU", 0));
moel@276
   872
              t.Add(new Temperature("CPU", 1));
moel@276
   873
              t.Add(new Temperature("Auxiliary", 2));
moel@276
   874
              t.Add(new Temperature("System", 3));
moel@265
   875
              for (int i = 0; i < superIO.Fans.Length; i++)
moel@265
   876
                f.Add(new Fan("Fan #" + (i + 1), i));
moel@265
   877
              break;
moel@265
   878
          }
moel@245
   879
          break;
moel@130
   880
        default:
moel@130
   881
          for (int i = 0; i < superIO.Voltages.Length; i++)
moel@130
   882
            v.Add(new Voltage("Voltage #" + (i + 1), i, true));
moel@130
   883
          for (int i = 0; i < superIO.Temperatures.Length; i++)
moel@130
   884
            t.Add(new Temperature("Temperature #" + (i + 1), i));
moel@130
   885
          for (int i = 0; i < superIO.Fans.Length; i++)
moel@130
   886
            f.Add(new Fan("Fan #" + (i + 1), i));
moel@130
   887
          break;
moel@130
   888
      }
moel@130
   889
moel@195
   890
      const string formula = "Voltage = value + (value - Vf) * Ri / Rf.";
moel@130
   891
      foreach (Voltage voltage in v) 
moel@130
   892
        if (voltage.Index < superIO.Voltages.Length) {
moel@130
   893
          Sensor sensor = new Sensor(voltage.Name, voltage.Index, 
moel@195
   894
            voltage.Hidden, SensorType.Voltage, this, new [] {
moel@130
   895
            new ParameterDescription("Ri [kΩ]", "Input resistance.\n" + 
moel@130
   896
              formula, voltage.Ri),
moel@130
   897
            new ParameterDescription("Rf [kΩ]", "Reference resistance.\n" + 
moel@130
   898
              formula, voltage.Rf),
moel@130
   899
            new ParameterDescription("Vf [V]", "Reference voltage.\n" + 
moel@130
   900
              formula, voltage.Vf)
moel@165
   901
            }, settings);
moel@130
   902
          voltages.Add(sensor);
moel@130
   903
      }
moel@130
   904
moel@130
   905
      foreach (Temperature temperature in t) 
moel@130
   906
        if (temperature.Index < superIO.Temperatures.Length) {
moel@134
   907
        Sensor sensor = new Sensor(temperature.Name, temperature.Index,
moel@195
   908
          SensorType.Temperature, this, new [] {
moel@130
   909
          new ParameterDescription("Offset [°C]", "Temperature offset.", 0)
moel@165
   910
        }, settings);
moel@130
   911
        temperatures.Add(sensor);
moel@130
   912
      }
moel@130
   913
moel@130
   914
      foreach (Fan fan in f)
moel@130
   915
        if (fan.Index < superIO.Fans.Length) {
moel@134
   916
          Sensor sensor = new Sensor(fan.Name, fan.Index, SensorType.Fan,
moel@165
   917
            this, settings);
moel@130
   918
          fans.Add(sensor);
moel@130
   919
        }
moel@130
   920
    }
moel@130
   921
moel@165
   922
    public override HardwareType HardwareType {
moel@165
   923
      get { return HardwareType.SuperIO; }
moel@130
   924
    }
moel@130
   925
moel@176
   926
    public override IHardware Parent {
moel@176
   927
      get { return mainboard; }
moel@176
   928
    }
moel@176
   929
moel@130
   930
moel@130
   931
    public override string GetReport() {
moel@130
   932
      return superIO.GetReport();
moel@130
   933
    }
moel@130
   934
moel@130
   935
    public override void Update() {
moel@130
   936
      superIO.Update();
moel@130
   937
moel@130
   938
      foreach (Sensor sensor in voltages) {
moel@228
   939
        float? value = readVoltage(sensor.Index);
moel@130
   940
        if (value.HasValue) {
moel@130
   941
          sensor.Value = value + (value - sensor.Parameters[2].Value) *
moel@130
   942
            sensor.Parameters[0].Value / sensor.Parameters[1].Value;
moel@130
   943
          ActivateSensor(sensor);
moel@130
   944
        }
moel@130
   945
      }
moel@130
   946
moel@130
   947
      foreach (Sensor sensor in temperatures) {
moel@228
   948
        float? value = readTemperature(sensor.Index);
moel@130
   949
        if (value.HasValue) {
moel@130
   950
          sensor.Value = value + sensor.Parameters[0].Value;
moel@130
   951
          ActivateSensor(sensor);
moel@130
   952
        }
moel@130
   953
      }
moel@130
   954
moel@130
   955
      foreach (Sensor sensor in fans) {
moel@228
   956
        float? value = readFan(sensor.Index);
moel@130
   957
        if (value.HasValue) {
moel@130
   958
          sensor.Value = value;
moel@130
   959
          if (value.Value > 0)
moel@130
   960
            ActivateSensor(sensor);
moel@130
   961
        }
moel@130
   962
      }
moel@228
   963
moel@228
   964
      postUpdate();
moel@130
   965
    }
moel@130
   966
moel@130
   967
    private class Voltage {
moel@130
   968
      public readonly string Name;
moel@130
   969
      public readonly int Index;
moel@130
   970
      public readonly float Ri;
moel@130
   971
      public readonly float Rf;
moel@130
   972
      public readonly float Vf;
moel@130
   973
      public readonly bool Hidden;
moel@130
   974
moel@202
   975
      public Voltage(string name, int index) :
moel@202
   976
        this(name, index, false) { }
moel@202
   977
      
moel@130
   978
      public Voltage(string name, int index, bool hidden) :
moel@130
   979
        this(name, index, 0, 1, 0, hidden) { }
moel@202
   980
      
moel@202
   981
      public Voltage(string name, int index, float ri, float rf) :
moel@202
   982
        this(name, index, ri, rf, 0, false) { }
moel@202
   983
      
moel@202
   984
      // float ri = 0, float rf = 1, float vf = 0, bool hidden = false) 
moel@202
   985
      
moel@195
   986
      public Voltage(string name, int index, 
moel@202
   987
        float ri, float rf, float vf, bool hidden) 
moel@195
   988
      {
moel@130
   989
        this.Name = name;
moel@130
   990
        this.Index = index;
moel@130
   991
        this.Ri = ri;
moel@130
   992
        this.Rf = rf;
moel@130
   993
        this.Vf = vf;
moel@130
   994
        this.Hidden = hidden;
moel@130
   995
      }
moel@130
   996
    }
moel@130
   997
moel@130
   998
    private class Temperature {
moel@130
   999
      public readonly string Name;
moel@130
  1000
      public readonly int Index;
moel@130
  1001
moel@167
  1002
      public Temperature(string name, int index) {
moel@130
  1003
        this.Name = name;
moel@130
  1004
        this.Index = index;
moel@130
  1005
      }
moel@130
  1006
    }
moel@130
  1007
moel@130
  1008
    private class Fan {
moel@130
  1009
      public readonly string Name;
moel@130
  1010
      public readonly int Index;
moel@130
  1011
moel@130
  1012
      public Fan(string name, int index) {
moel@130
  1013
        this.Name = name;
moel@130
  1014
        this.Index = index;
moel@130
  1015
      }
moel@130
  1016
    }
moel@130
  1017
  }
moel@130
  1018
}