1 |
62 |
marcus.erl |
Kernel driver fscher
|
2 |
|
|
====================
|
3 |
|
|
|
4 |
|
|
Supported chips:
|
5 |
|
|
* Fujitsu-Siemens Hermes chip
|
6 |
|
|
Prefix: 'fscher'
|
7 |
|
|
Addresses scanned: I2C 0x73
|
8 |
|
|
|
9 |
|
|
Authors:
|
10 |
|
|
Reinhard Nissl based on work
|
11 |
|
|
from Hermann Jung ,
|
12 |
|
|
Frodo Looijaard ,
|
13 |
|
|
Philip Edelbrock
|
14 |
|
|
|
15 |
|
|
Description
|
16 |
|
|
-----------
|
17 |
|
|
|
18 |
|
|
This driver implements support for the Fujitsu-Siemens Hermes chip. It is
|
19 |
|
|
described in the 'Register Set Specification BMC Hermes based Systemboard'
|
20 |
|
|
from Fujitsu-Siemens.
|
21 |
|
|
|
22 |
|
|
The Hermes chip implements a hardware-based system management, e.g. for
|
23 |
|
|
controlling fan speed and core voltage. There is also a watchdog counter on
|
24 |
|
|
the chip which can trigger an alarm and even shut the system down.
|
25 |
|
|
|
26 |
|
|
The chip provides three temperature values (CPU, motherboard and
|
27 |
|
|
auxiliary), three voltage values (+12V, +5V and battery) and three fans
|
28 |
|
|
(power supply, CPU and auxiliary).
|
29 |
|
|
|
30 |
|
|
Temperatures are measured in degrees Celsius. The resolution is 1 degree.
|
31 |
|
|
|
32 |
|
|
Fan rotation speeds are reported in RPM (rotations per minute). The value
|
33 |
|
|
can be divided by a programmable divider (1, 2 or 4) which is stored on
|
34 |
|
|
the chip.
|
35 |
|
|
|
36 |
|
|
Voltage sensors (also known as "in" sensors) report their values in volts.
|
37 |
|
|
|
38 |
|
|
All values are reported as final values from the driver. There is no need
|
39 |
|
|
for further calculations.
|
40 |
|
|
|
41 |
|
|
|
42 |
|
|
Detailed description
|
43 |
|
|
--------------------
|
44 |
|
|
|
45 |
|
|
Below you'll find a single line description of all the bit values. With
|
46 |
|
|
this information, you're able to decode e. g. alarms, wdog, etc. To make
|
47 |
|
|
use of the watchdog, you'll need to set the watchdog time and enable the
|
48 |
|
|
watchdog. After that it is necessary to restart the watchdog time within
|
49 |
|
|
the specified period of time, or a system reset will occur.
|
50 |
|
|
|
51 |
|
|
* revision
|
52 |
|
|
READING & 0xff = 0x??: HERMES revision identification
|
53 |
|
|
|
54 |
|
|
* alarms
|
55 |
|
|
READING & 0x80 = 0x80: CPU throttling active
|
56 |
|
|
READING & 0x80 = 0x00: CPU running at full speed
|
57 |
|
|
|
58 |
|
|
READING & 0x10 = 0x10: software event (see control:1)
|
59 |
|
|
READING & 0x10 = 0x00: no software event
|
60 |
|
|
|
61 |
|
|
READING & 0x08 = 0x08: watchdog event (see wdog:2)
|
62 |
|
|
READING & 0x08 = 0x00: no watchdog event
|
63 |
|
|
|
64 |
|
|
READING & 0x02 = 0x02: thermal event (see temp*:1)
|
65 |
|
|
READING & 0x02 = 0x00: no thermal event
|
66 |
|
|
|
67 |
|
|
READING & 0x01 = 0x01: fan event (see fan*:1)
|
68 |
|
|
READING & 0x01 = 0x00: no fan event
|
69 |
|
|
|
70 |
|
|
READING & 0x13 ! 0x00: ALERT LED is flashing
|
71 |
|
|
|
72 |
|
|
* control
|
73 |
|
|
READING & 0x01 = 0x01: software event
|
74 |
|
|
READING & 0x01 = 0x00: no software event
|
75 |
|
|
|
76 |
|
|
WRITING & 0x01 = 0x01: set software event
|
77 |
|
|
WRITING & 0x01 = 0x00: clear software event
|
78 |
|
|
|
79 |
|
|
* watchdog_control
|
80 |
|
|
READING & 0x80 = 0x80: power off on watchdog event while thermal event
|
81 |
|
|
READING & 0x80 = 0x00: watchdog power off disabled (just system reset enabled)
|
82 |
|
|
|
83 |
|
|
READING & 0x40 = 0x40: watchdog timebase 60 seconds (see also wdog:1)
|
84 |
|
|
READING & 0x40 = 0x00: watchdog timebase 2 seconds
|
85 |
|
|
|
86 |
|
|
READING & 0x10 = 0x10: watchdog enabled
|
87 |
|
|
READING & 0x10 = 0x00: watchdog disabled
|
88 |
|
|
|
89 |
|
|
WRITING & 0x80 = 0x80: enable "power off on watchdog event while thermal event"
|
90 |
|
|
WRITING & 0x80 = 0x00: disable "power off on watchdog event while thermal event"
|
91 |
|
|
|
92 |
|
|
WRITING & 0x40 = 0x40: set watchdog timebase to 60 seconds
|
93 |
|
|
WRITING & 0x40 = 0x00: set watchdog timebase to 2 seconds
|
94 |
|
|
|
95 |
|
|
WRITING & 0x20 = 0x20: disable watchdog
|
96 |
|
|
|
97 |
|
|
WRITING & 0x10 = 0x10: enable watchdog / restart watchdog time
|
98 |
|
|
|
99 |
|
|
* watchdog_state
|
100 |
|
|
READING & 0x02 = 0x02: watchdog system reset occurred
|
101 |
|
|
READING & 0x02 = 0x00: no watchdog system reset occurred
|
102 |
|
|
|
103 |
|
|
WRITING & 0x02 = 0x02: clear watchdog event
|
104 |
|
|
|
105 |
|
|
* watchdog_preset
|
106 |
|
|
READING & 0xff = 0x??: configured watch dog time in units (see wdog:3 0x40)
|
107 |
|
|
|
108 |
|
|
WRITING & 0xff = 0x??: configure watch dog time in units
|
109 |
|
|
|
110 |
|
|
* in* (0: +5V, 1: +12V, 2: onboard 3V battery)
|
111 |
|
|
READING: actual voltage value
|
112 |
|
|
|
113 |
|
|
* temp*_status (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor)
|
114 |
|
|
READING & 0x02 = 0x02: thermal event (overtemperature)
|
115 |
|
|
READING & 0x02 = 0x00: no thermal event
|
116 |
|
|
|
117 |
|
|
READING & 0x01 = 0x01: sensor is working
|
118 |
|
|
READING & 0x01 = 0x00: sensor is faulty
|
119 |
|
|
|
120 |
|
|
WRITING & 0x02 = 0x02: clear thermal event
|
121 |
|
|
|
122 |
|
|
* temp*_input (1: CPU sensor, 2: onboard sensor, 3: auxiliary sensor)
|
123 |
|
|
READING: actual temperature value
|
124 |
|
|
|
125 |
|
|
* fan*_status (1: power supply fan, 2: CPU fan, 3: auxiliary fan)
|
126 |
|
|
READING & 0x04 = 0x04: fan event (fan fault)
|
127 |
|
|
READING & 0x04 = 0x00: no fan event
|
128 |
|
|
|
129 |
|
|
WRITING & 0x04 = 0x04: clear fan event
|
130 |
|
|
|
131 |
|
|
* fan*_div (1: power supply fan, 2: CPU fan, 3: auxiliary fan)
|
132 |
|
|
Divisors 2,4 and 8 are supported, both for reading and writing
|
133 |
|
|
|
134 |
|
|
* fan*_pwm (1: power supply fan, 2: CPU fan, 3: auxiliary fan)
|
135 |
|
|
READING & 0xff = 0x00: fan may be switched off
|
136 |
|
|
READING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V)
|
137 |
|
|
READING & 0xff = 0xff: fan must run at maximum speed (supply: 12V)
|
138 |
|
|
READING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V)
|
139 |
|
|
|
140 |
|
|
WRITING & 0xff = 0x00: fan may be switched off
|
141 |
|
|
WRITING & 0xff = 0x01: fan must run at least at minimum speed (supply: 6V)
|
142 |
|
|
WRITING & 0xff = 0xff: fan must run at maximum speed (supply: 12V)
|
143 |
|
|
WRITING & 0xff = 0x??: fan must run at least at given speed (supply: 6V..12V)
|
144 |
|
|
|
145 |
|
|
* fan*_input (1: power supply fan, 2: CPU fan, 3: auxiliary fan)
|
146 |
|
|
READING: actual RPM value
|
147 |
|
|
|
148 |
|
|
|
149 |
|
|
Limitations
|
150 |
|
|
-----------
|
151 |
|
|
|
152 |
|
|
* Measuring fan speed
|
153 |
|
|
It seems that the chip counts "ripples" (typical fans produce 2 ripples per
|
154 |
|
|
rotation while VERAX fans produce 18) in a 9-bit register. This register is
|
155 |
|
|
read out every second, then the ripple prescaler (2, 4 or 8) is applied and
|
156 |
|
|
the result is stored in the 8 bit output register. Due to the limitation of
|
157 |
|
|
the counting register to 9 bits, it is impossible to measure a VERAX fan
|
158 |
|
|
properly (even with a prescaler of 8). At its maximum speed of 3500 RPM the
|
159 |
|
|
fan produces 1080 ripples per second which causes the counting register to
|
160 |
|
|
overflow twice, leading to only 186 RPM.
|
161 |
|
|
|
162 |
|
|
* Measuring input voltages
|
163 |
|
|
in2 ("battery") reports the voltage of the onboard lithium battery and not
|
164 |
|
|
+3.3V from the power supply.
|
165 |
|
|
|
166 |
|
|
* Undocumented features
|
167 |
|
|
Fujitsu-Siemens Computers has not documented all features of the chip so
|
168 |
|
|
far. Their software, System Guard, shows that there are a still some
|
169 |
|
|
features which cannot be controlled by this implementation.
|