Fixed the temperature reading and improved the report for the Nuvoton NCT6771F super I/O chip.

This commit is contained in:
Michael Möller
2010-12-08 19:23:13 +00:00
parent 55e808987c
commit 667b36a431
2 changed files with 40 additions and 35 deletions
+11 -12
View File
@@ -39,22 +39,21 @@ using System;
using System.Collections.Generic;
namespace OpenHardwareMonitor.Hardware {
internal class HexStringArray {
internal static class HexStringArray {
private readonly byte[] array;
public static byte Read(string s, ushort address) {
string[] lines = s.Split(new[] { '\r', '\n' },
StringSplitOptions.RemoveEmptyEntries);
public HexStringArray(string input) {
List<byte> list = new List<byte>();
foreach (string str in input.Split(' ')) {
string s = str.Trim();
if (s.Length > 0)
list.Add(Convert.ToByte(s, 16));
foreach (string line in lines) {
string[] array = line.Split(new[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);
if (Convert.ToInt32(array[0], 16) == (address & 0xFFF0))
return Convert.ToByte(array[(address & 0x0F) + 1], 16);
}
array = list.ToArray();
}
public byte this[int i] {
get { return array[i]; }
throw new ArgumentException();
}
}
}
+29 -23
View File
@@ -62,7 +62,7 @@ namespace OpenHardwareMonitor.Hardware.LPC {
Ring0.WriteIoPort(port + DATA_REGISTER_OFFSET, bank);
Ring0.WriteIoPort(port + ADDRESS_REGISTER_OFFSET, register);
return Ring0.ReadIoPort(port + DATA_REGISTER_OFFSET);
}
}
// Consts
private const ushort NUVOTON_VENDOR_ID = 0x5CA3;
@@ -147,19 +147,23 @@ namespace OpenHardwareMonitor.Hardware.LPC {
}
for (int i = 0; i < TEMPERATURE_REG.Length; i++) {
float value = ReadByte(TEMPERATURE_REG[i]);
int value = ((sbyte)ReadByte(TEMPERATURE_REG[i])) << 1;
if (TEMPERATURE_HALF_BIT[i] > 0) {
value += 0.5f * ((ReadByte(TEMPERATURE_HALF_REG[i]) >>
value |= ((ReadByte(TEMPERATURE_HALF_REG[i]) >>
TEMPERATURE_HALF_BIT[i]) & 0x1);
}
TemperatureSource source = (TemperatureSource)
ReadByte(TEMPERATURE_SRC_REG[i]);
float? temperature = 0.5f * value;
if (temperature > 125 || temperature < -55)
temperature = null;
switch (source) {
case TemperatureSource.CPUTIN: temperatures[0] = value; break;
case TemperatureSource.AUXTIN: temperatures[1] = value; break;
case TemperatureSource.SYSTIN: temperatures[2] = value; break;
case TemperatureSource.CPUTIN: temperatures[0] = temperature; break;
case TemperatureSource.AUXTIN: temperatures[1] = temperature; break;
case TemperatureSource.SYSTIN: temperatures[2] = temperature; break;
}
}
@@ -187,33 +191,35 @@ namespace OpenHardwareMonitor.Hardware.LPC {
if (!Ring0.WaitIsaBusMutex(100))
return r.ToString();
ushort[] addresses = new ushort[] {
0x000, 0x010, 0x020, 0x030, 0x040, 0x050, 0x060, 0x070,
0x100, 0x110, 0x120, 0x130, 0x140, 0x150,
0x200, 0x220, 0x230, 0x240, 0x250,
0x300, 0x320, 0x330, 0x340,
0x400, 0x410, 0x420, 0x440, 0x450, 0x460,
0x500, 0x550,
0x600, 0x610 ,0x620, 0x630, 0x640, 0x650, 0x660, 0x670,
0xA00, 0xA10, 0xA20, 0xA30, 0xA50, 0xA60, 0xA70,
0xB00, 0xB10, 0xB20, 0xB30, 0xB50, 0xB60, 0xB70,
0xC00, 0xC10, 0xC20, 0xC30, 0xC50, 0xC60, 0xC70,
0xD00, 0xD10, 0xD20, 0xD30, 0xD50, 0xD60,
0xE00, 0xE10, 0xE20, 0xE30,
0xF00, 0xF10, 0xF20, 0xF30};
r.AppendLine("Hardware Monitor Registers");
r.AppendLine();
r.AppendLine(" 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
r.AppendLine();
for (int i = 0; i <= 0x7; i++) {
r.Append(" ");
r.Append((i << 4).ToString("X3", CultureInfo.InvariantCulture));
r.Append(" ");
for (int j = 0; j <= 0xF; j++) {
foreach (ushort address in addresses) {
r.Append(" ");
r.Append(ReadByte((ushort)((i << 4) | j)).ToString(
"X2", CultureInfo.InvariantCulture));
}
r.AppendLine();
}
for (int bank = 1; bank <= 15; bank++) {
for (int i = 0x5; i < 0x6; i++) {
r.Append(" ");
r.Append((i << 4).ToString("X3", CultureInfo.InvariantCulture));
r.Append(address.ToString("X3", CultureInfo.InvariantCulture));
r.Append(" ");
for (int j = 0; j <= 0xF; j++) {
for (ushort j = 0; j <= 0xF; j++) {
r.Append(" ");
r.Append(ReadByte((ushort)((bank << 8) | (i << 4) | j)).ToString(
r.Append(ReadByte((ushort)(address | j)).ToString(
"X2", CultureInfo.InvariantCulture));
}
r.AppendLine();
}
}
r.AppendLine();