Hardware/LPC/F718XX.cs
author moel.mich
Sat, 02 Oct 2010 18:15:46 +0000
changeset 206 1fa8eddc24a7
parent 166 fa9dfbfc4145
child 228 458a6c3de579
permissions -rw-r--r--
Replaced HttpUtility.UrlEncode with Uri.EscapeDataString and deleted the reference to the System.Web assembly. The System.Web assembly seems to be missing on some .NET 4.0 installations (and the overhead of using it is a bit large, just for the UrlEncode method).
moel@16
     1
/*
moel@16
     2
  
moel@16
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@16
     4
moel@16
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@16
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@16
     7
  the License. You may obtain a copy of the License at
moel@16
     8
 
moel@16
     9
  http://www.mozilla.org/MPL/
moel@16
    10
moel@16
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@16
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@16
    13
  for the specific language governing rights and limitations under the License.
moel@16
    14
moel@16
    15
  The Original Code is the Open Hardware Monitor code.
moel@16
    16
moel@16
    17
  The Initial Developer of the Original Code is 
moel@16
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@16
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2010
moel@16
    20
  the Initial Developer. All Rights Reserved.
moel@16
    21
moel@16
    22
  Contributor(s):
moel@16
    23
moel@16
    24
  Alternatively, the contents of this file may be used under the terms of
moel@16
    25
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@16
    26
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@16
    27
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@16
    28
  of those above. If you wish to allow use of your version of this file only
moel@16
    29
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@16
    30
  use your version of this file under the terms of the MPL, indicate your
moel@16
    31
  decision by deleting the provisions above and replace them with the notice
moel@16
    32
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@16
    33
  the provisions above, a recipient may use your version of this file under
moel@16
    34
  the terms of any one of the MPL, the GPL or the LGPL.
moel@16
    35
 
moel@16
    36
*/
moel@16
    37
moel@166
    38
using System.Globalization;
moel@16
    39
using System.Text;
moel@16
    40
moel@16
    41
namespace OpenHardwareMonitor.Hardware.LPC {
moel@165
    42
  internal class F718XX : ISuperIO {
moel@16
    43
moel@195
    44
    private readonly ushort address;
moel@195
    45
    private readonly Chip chip;
moel@16
    46
moel@195
    47
    private readonly float?[] voltages;
moel@195
    48
    private readonly float?[] temperatures;
moel@195
    49
    private readonly float?[] fans;
moel@16
    50
moel@16
    51
    // Hardware Monitor
moel@16
    52
    private const byte ADDRESS_REGISTER_OFFSET = 0x05;
moel@16
    53
    private const byte DATA_REGISTER_OFFSET = 0x06;
moel@16
    54
moel@16
    55
    // Hardware Monitor Registers
moel@16
    56
    private const byte VOLTAGE_BASE_REG = 0x20;
moel@68
    57
    private const byte TEMPERATURE_CONFIG_REG = 0x69;
moel@68
    58
    private const byte TEMPERATURE_BASE_REG = 0x70;
moel@195
    59
    private readonly byte[] FAN_TACHOMETER_REG = 
moel@195
    60
      new byte[] { 0xA0, 0xB0, 0xC0, 0xD0 };
moel@16
    61
    
moel@16
    62
    private byte ReadByte(byte register) {
moel@16
    63
      WinRing0.WriteIoPortByte(
moel@16
    64
        (ushort)(address + ADDRESS_REGISTER_OFFSET), register);
moel@16
    65
      return WinRing0.ReadIoPortByte((ushort)(address + DATA_REGISTER_OFFSET));
moel@132
    66
    }
moel@16
    67
moel@130
    68
    public F718XX(Chip chip, ushort address) {
moel@16
    69
      this.address = address;
moel@130
    70
      this.chip = chip;
moel@16
    71
moel@130
    72
      voltages = new float?[chip == Chip.F71858 ? 3 : 9];
moel@130
    73
      temperatures = new float?[3];
moel@130
    74
      fans = new float?[chip == Chip.F71882 || chip == Chip.F71858? 4 : 3];
moel@16
    75
    }
moel@16
    76
moel@130
    77
    public Chip Chip { get { return chip; } }
moel@130
    78
    public float?[] Voltages { get { return voltages; } }
moel@130
    79
    public float?[] Temperatures { get { return temperatures; } }
moel@130
    80
    public float?[] Fans { get { return fans; } }
moel@130
    81
moel@130
    82
    public string GetReport() {
moel@16
    83
      StringBuilder r = new StringBuilder();
moel@16
    84
moel@31
    85
      r.AppendLine("LPC " + this.GetType().Name);
moel@16
    86
      r.AppendLine();
moel@166
    87
      r.Append("Base Adress: 0x"); 
moel@166
    88
      r.AppendLine(address.ToString("X4", CultureInfo.InvariantCulture));
moel@16
    89
      r.AppendLine();
moel@162
    90
moel@163
    91
      if (!WinRing0.WaitIsaBusMutex(100))
moel@162
    92
        return r.ToString();
moel@162
    93
moel@16
    94
      r.AppendLine("Hardware Monitor Registers");
moel@16
    95
      r.AppendLine();
moel@16
    96
      r.AppendLine("      00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
moel@16
    97
      r.AppendLine();
moel@16
    98
      for (int i = 0; i <= 0xF; i++) {
moel@166
    99
        r.Append(" "); 
moel@166
   100
        r.Append((i << 4).ToString("X2", CultureInfo.InvariantCulture)); 
moel@166
   101
        r.Append("  ");
moel@16
   102
        for (int j = 0; j <= 0xF; j++) {
moel@16
   103
          r.Append(" ");
moel@166
   104
          r.Append(ReadByte((byte)((i << 4) | j)).ToString("X2", 
moel@166
   105
            CultureInfo.InvariantCulture));
moel@16
   106
        }
moel@16
   107
        r.AppendLine();
moel@16
   108
      }
moel@16
   109
      r.AppendLine();
moel@162
   110
moel@162
   111
      WinRing0.ReleaseIsaBusMutex();
moel@162
   112
moel@16
   113
      return r.ToString();
moel@16
   114
    }
moel@16
   115
moel@130
   116
    public void Update() {
moel@163
   117
      if (!WinRing0.WaitIsaBusMutex(10))
moel@162
   118
        return;
moel@16
   119
moel@130
   120
      for (int i = 0; i < voltages.Length; i++) {
moel@130
   121
        int value = ReadByte((byte)(VOLTAGE_BASE_REG + i));
moel@132
   122
        voltages[i] = 0.008f * value;
moel@16
   123
      }
moel@68
   124
     
moel@130
   125
      for (int i = 0; i < temperatures.Length; i++) {
moel@68
   126
        switch (chip) {
moel@68
   127
          case Chip.F71858: {
moel@195
   128
              int tableMode = 0x3 & ReadByte(TEMPERATURE_CONFIG_REG);
moel@68
   129
              int high = 
moel@130
   130
                ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * i));
moel@68
   131
              int low =
moel@130
   132
                ReadByte((byte)(TEMPERATURE_BASE_REG + 2 * i + 1));              
moel@68
   133
              if (high != 0xbb && high != 0xcc) {
moel@68
   134
                int bits = 0;
moel@68
   135
                switch (tableMode) {
moel@68
   136
                  case 0: bits = 0; break;
moel@68
   137
                  case 1: bits = 0; break;
moel@68
   138
                  case 2: bits = (high & 0x80) << 8; break;
moel@68
   139
                  case 3: bits = (low & 0x01) << 15; break;
moel@68
   140
                }
moel@68
   141
                bits |= high << 7;
moel@68
   142
                bits |= (low & 0xe0) >> 1;
moel@68
   143
                short value = (short)(bits & 0xfff0);
moel@130
   144
                temperatures[i] = value / 128.0f;
moel@68
   145
              } else {
moel@130
   146
                temperatures[i] = null;
moel@68
   147
              }
moel@68
   148
          } break;
moel@68
   149
          default: {
moel@68
   150
            sbyte value = (sbyte)ReadByte((byte)(
moel@130
   151
              TEMPERATURE_BASE_REG + 2 * (i + 1)));            
moel@68
   152
            if (value < sbyte.MaxValue && value > 0)
moel@130
   153
              temperatures[i] = value;
moel@130
   154
            else
moel@130
   155
              temperatures[i] = null;
moel@68
   156
          } break;
moel@68
   157
        }
moel@16
   158
      }
moel@16
   159
moel@130
   160
      for (int i = 0; i < fans.Length; i++) {
moel@130
   161
        int value = ReadByte(FAN_TACHOMETER_REG[i]) << 8;
moel@130
   162
        value |= ReadByte((byte)(FAN_TACHOMETER_REG[i] + 1));
moel@16
   163
moel@130
   164
        if (value > 0) 
moel@130
   165
          fans[i] = (value < 0x0fff) ? 1.5e6f / value : 0;
moel@130
   166
        else 
moel@130
   167
          fans[i] = null;        
moel@162
   168
      }
moel@162
   169
moel@162
   170
      WinRing0.ReleaseIsaBusMutex();
moel@16
   171
    }
moel@16
   172
  }
moel@16
   173
}