Added experimental support for AMD family 15h model 1Xh and family 16h CPUs.
3 This Source Code Form is subject to the terms of the Mozilla Public
4 License, v. 2.0. If a copy of the MPL was not distributed with this
5 file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 Copyright (C) 2009-2013 Michael Möller <mmoeller@openhardwaremonitor.org>
11 using System.Collections.Generic;
12 using System.Globalization;
16 namespace OpenHardwareMonitor.Hardware.LPC {
18 internal class LMSensors {
20 private readonly List<LMChip> lmChips = new List<LMChip>();
23 string[] basePaths = Directory.GetDirectories("/sys/class/hwmon/");
24 foreach (string basePath in basePaths) {
25 foreach (string devicePath in new[] { "/device", "" }) {
26 string path = basePath + devicePath;
30 using (StreamReader reader = new StreamReader(path + "/name"))
31 name = reader.ReadLine();
32 } catch (IOException) { }
36 lmChips.Add(new LMChip(Chip.ATK0110, path)); break;
39 lmChips.Add(new LMChip(Chip.F71858, path)); break;
41 lmChips.Add(new LMChip(Chip.F71862, path)); break;
43 lmChips.Add(new LMChip(Chip.F71869, path)); break;
45 lmChips.Add(new LMChip(Chip.F71882, path)); break;
47 lmChips.Add(new LMChip(Chip.F71889AD, path)); break;
49 lmChips.Add(new LMChip(Chip.F71889ED, path)); break;
51 lmChips.Add(new LMChip(Chip.F71889F, path)); break;
53 lmChips.Add(new LMChip(Chip.F71808E, path)); break;
56 lmChips.Add(new LMChip(Chip.IT8705F, path)); break;
58 lmChips.Add(new LMChip(Chip.IT8712F, path)); break;
60 lmChips.Add(new LMChip(Chip.IT8716F, path)); break;
62 lmChips.Add(new LMChip(Chip.IT8718F, path)); break;
64 lmChips.Add(new LMChip(Chip.IT8720F, path)); break;
67 lmChips.Add(new LMChip(Chip.NCT6771F, path)); break;
69 lmChips.Add(new LMChip(Chip.NCT6776F, path)); break;
72 lmChips.Add(new LMChip(Chip.W83627EHF, path)); break;
74 lmChips.Add(new LMChip(Chip.W83627DHG, path)); break;
76 lmChips.Add(new LMChip(Chip.W83667HG, path)); break;
78 lmChips.Add(new LMChip(Chip.W83627HF, path)); break;
80 lmChips.Add(new LMChip(Chip.W83627THF, path)); break;
82 lmChips.Add(new LMChip(Chip.W83687THF, path)); break;
89 foreach (LMChip lmChip in lmChips)
93 public ISuperIO[] SuperIO {
95 return lmChips.ToArray();
99 private class LMChip : ISuperIO {
102 private readonly Chip chip;
104 private readonly float?[] voltages;
105 private readonly float?[] temperatures;
106 private readonly float?[] fans;
107 private readonly float?[] controls;
109 private readonly FileStream[] voltageStreams;
110 private readonly FileStream[] temperatureStreams;
111 private readonly FileStream[] fanStreams;
113 public Chip Chip { get { return chip; } }
114 public float?[] Voltages { get { return voltages; } }
115 public float?[] Temperatures { get { return temperatures; } }
116 public float?[] Fans { get { return fans; } }
117 public float?[] Controls { get { return controls; } }
119 public LMChip(Chip chip, string path) {
123 string[] voltagePaths = Directory.GetFiles(path, "in*_input");
124 this.voltages = new float?[voltagePaths.Length];
125 this.voltageStreams = new FileStream[voltagePaths.Length];
126 for (int i = 0; i < voltagePaths.Length; i++)
127 voltageStreams[i] = new FileStream(voltagePaths[i],
128 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
130 string[] temperaturePaths = Directory.GetFiles(path, "temp*_input");
131 this.temperatures = new float?[temperaturePaths.Length];
132 this.temperatureStreams = new FileStream[temperaturePaths.Length];
133 for (int i = 0; i < temperaturePaths.Length; i++)
134 temperatureStreams[i] = new FileStream(temperaturePaths[i],
135 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
137 string[] fanPaths = Directory.GetFiles(path, "fan*_input");
138 this.fans = new float?[fanPaths.Length];
139 this.fanStreams = new FileStream[fanPaths.Length];
140 for (int i = 0; i < fanPaths.Length; i++)
141 fanStreams[i] = new FileStream(fanPaths[i],
142 FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
144 this.controls = new float?[0];
147 public byte? ReadGPIO(int index) {
151 public void WriteGPIO(int index, byte value) { }
153 public string GetReport() {
157 public void SetControl(int index, byte? value) { }
159 private string ReadFirstLine(Stream stream) {
160 StringBuilder sb = new StringBuilder();
162 stream.Seek(0, SeekOrigin.Begin);
163 int b = stream.ReadByte();
164 while (b != -1 && b != 10) {
166 b = stream.ReadByte();
169 return sb.ToString();
172 public void Update() {
173 for (int i = 0; i < voltages.Length; i++) {
174 string s = ReadFirstLine(voltageStreams[i]);
176 voltages[i] = 0.001f *
177 long.Parse(s, CultureInfo.InvariantCulture);
183 for (int i = 0; i < temperatures.Length; i++) {
184 string s = ReadFirstLine(temperatureStreams[i]);
186 temperatures[i] = 0.001f *
187 long.Parse(s, CultureInfo.InvariantCulture);
189 temperatures[i] = null;
193 for (int i = 0; i < fans.Length; i++) {
194 string s = ReadFirstLine(fanStreams[i]);
196 fans[i] = long.Parse(s, CultureInfo.InvariantCulture);
203 public void Close() {
204 foreach (FileStream stream in voltageStreams)
206 foreach (FileStream stream in temperatureStreams)
208 foreach (FileStream stream in fanStreams)