* [lm-sensors] HECI QST utility
@ 2009-10-03 10:50 Andriy Gapon
0 siblings, 0 replies; only message in thread
From: Andriy Gapon @ 2009-10-03 10:50 UTC (permalink / raw)
To: lm-sensors
[-- Attachment #1: Type: text/plain, Size: 944 bytes --]
While Intel is still working on releasing public version of QST SDK for Linux,
I've stumbled upon one interesting page on the topic:
http://hecisys.narod.ru/
The most precious bit of information there is GUID of QST ME client.
Based on that work plus some additional experimentation and analysis, I've
created a small console program to report basic QST information.
The program is originally written for FreeBSD, so it might not compile/work as
is, but it should be trivially easy to adapt it.
I am attaching the source here.
It's BSD licensed.
I hope you find it useful.
Sample output:
$ heci-qst
TEMPCPU : -72.25
TEMPMB2 : 34.12
TEMPICH : 73.42
TEMPMCH : 66.70
FANCPU : 875
FANOUTL : 1409
V12P : +12.226
V50P : +5.089
V33 : +3.351
V15 : +1.238
VC0 : +1.136
P.S. you've got to have heci/mei driver, of course:
http://www.openamt.org/
--
Andriy Gapon
[-- Attachment #2: heci-qst.c --]
[-- Type: text/plain, Size: 4975 bytes --]
/*-
* Copyright (c) 2009 Andriy Gapon <avg@icyb.net.ua>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <sys/heci.h>
struct therm_sensor
{
int8_t valid;
int32_t value;
} __attribute__((packed));
struct volt_sensor
{
int8_t valid;
int32_t value;
} __attribute__((packed));
struct fan_sensor
{
int8_t valid;
int16_t value;
} __attribute__((packed));
#define THERM_SENSOR_COUNT 12
struct therm_data
{
int8_t status;
struct therm_sensor data[THERM_SENSOR_COUNT];
} __attribute__((packed));
#define VOLT_SENSOR_COUNT 8
struct volt_data
{
int8_t status;
struct volt_sensor data[VOLT_SENSOR_COUNT];
} __attribute__((packed));
#define FAN_SENSOR_COUNT 8
struct fan_data
{
int8_t status;
struct fan_sensor data[FAN_SENSOR_COUNT];
} __attribute__((packed));
struct qst_cmd
{
uint8_t cmd;
uint16_t in_len;
uint16_t out_len;
} __attribute__((packed));
#define QST_THERMAL_CMD 0x12
static const struct qst_cmd therm_cmd = { QST_THERMAL_CMD, 0, sizeof(struct therm_data) };
#define QST_VOLT_CMD 0x58
static const struct qst_cmd volt_cmd = { QST_VOLT_CMD, 0, sizeof(struct volt_data) };
#define QST_FAN_CMD 0x37
static const struct qst_cmd fan_cmd = { QST_FAN_CMD, 0, sizeof(struct fan_data) };
const char * const temp_names[THERM_SENSOR_COUNT] = {
"CPU",
"MB1",
NULL,
"MB2",
"ICH",
"MCH",
NULL,
NULL,
NULL,
NULL,
NULL,
NULL,
};
const char * const volt_names[VOLT_SENSOR_COUNT] = {
"12P",
"50P",
"33",
"15",
"C0",
NULL,
NULL,
NULL,
};
const char * const fan_names[FAN_SENSOR_COUNT] = {
"CPU",
"INL",
"OUTL",
"AUX",
NULL,
NULL,
NULL,
NULL,
};
static const struct heci_guid hwm_guid = {
0x6B5205B9,
0x8185,
0x4519,
{0xB8, 0x89, 0xD9, 0x87, 0x24, 0xB5, 0x86, 0x07}
};
int main()
{
int fd;
int rc;
int i;
fd = open("/dev/heci0", O_RDWR);
if (fd < 0) {
perror("/dev/heci0");
return 1;
}
rc = ioctl(fd, HECI_CONNECT, &hwm_guid);
if (rc < 0) {
perror("ioctl HECI_CONNECT");
return 1;
}
/* Request temp. */
struct therm_data therm_data;
rc = write(fd, &therm_cmd, sizeof(therm_cmd));
if (rc < 0) {
perror("therm write");
return 1;
}
rc = read(fd, &therm_data, sizeof(therm_data));
if (rc < 0) {
perror("therm read");
return 1;
}
for (i = 0; i < THERM_SENSOR_COUNT; i++) {
if (therm_data.data[i].valid) {
int32_t value = therm_data.data[i].value;
printf("TEMP");
if (temp_names[i])
printf("%s", temp_names[i]);
else
printf("%02d", i);
printf("\t:\t%d.%02d\n", value / 100, abs(value) % 100);
}
}
/* Request fans */
struct fan_data fan_data;
rc = write(fd, &fan_cmd, sizeof(fan_cmd));
if (rc < 0) {
perror("fan write");
return 1;
}
rc = read(fd, &fan_data, sizeof(fan_data));
if (rc < 0) {
perror("fan read");
return 1;
}
for (i = 0; i < FAN_SENSOR_COUNT; i++) {
if (fan_data.data[i].valid) {
int32_t value = fan_data.data[i].value;
printf("FAN");
if (fan_names[i])
printf("%s", fan_names[i]);
else
printf("%02d", i);
printf("\t:\t%d\n", value);
}
}
/* Request volts. */
struct volt_data volt_data;
rc = write(fd, &volt_cmd, sizeof(volt_cmd));
if (rc < 0) {
perror("volts write");
return 1;
}
rc = read(fd, &volt_data, sizeof(volt_data));
if (rc < 0) {
perror("volts read");
return 1;
}
for (i = 0; i < VOLT_SENSOR_COUNT; i++) {
if (volt_data.data[i].valid) {
int32_t value = volt_data.data[i].value;
printf("V");
if (volt_names[i])
printf("%s", volt_names[i]);
else
printf("%02d", i);
printf("\t:\t%+d.%03d\n", value / 1000, abs(value) % 1000);
}
}
close(fd);
return 0;
}
[-- Attachment #3: Type: text/plain, Size: 153 bytes --]
_______________________________________________
lm-sensors mailing list
lm-sensors@lm-sensors.org
http://lists.lm-sensors.org/mailman/listinfo/lm-sensors
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-10-03 10:50 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-10-03 10:50 [lm-sensors] HECI QST utility Andriy Gapon
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.