2
0
mirror of https://github.com/lm-sensors/lm-sensors synced 2025-08-29 13:28:01 +00:00

Additional sensor fields decoded

git-svn-id: http://lm-sensors.org/svn/lm-sensors/trunk@1481 7894878c-1315-0410-8ee3-d5d059ff63e0
This commit is contained in:
Mark D. Studebaker 2002-08-03 20:18:35 +00:00
parent cc489acb76
commit b30e01d7a9

View File

@ -6,6 +6,8 @@
* 2-July-2001 Matt Domsch <Matt_Domsch@dell.com> * 2-July-2001 Matt Domsch <Matt_Domsch@dell.com>
* Additional structures displayed per SMBIOS 2.3.1 spec * Additional structures displayed per SMBIOS 2.3.1 spec
* *
* 8/3/02 Enhanced and incorporated in lm_sensors 2.6.5
*
* Licensed under the GNU Public license. If you want to use it in with * Licensed under the GNU Public license. If you want to use it in with
* another license just ask. * another license just ask.
*/ */
@ -29,6 +31,7 @@ dump_raw_data(void *data, unsigned int length)
unsigned int length_printed = 0; unsigned int length_printed = 0;
const unsigned char maxcolumn = 16; const unsigned char maxcolumn = 16;
while (length_printed < length) { while (length_printed < length) {
printf("\t");
b1 = buffer1; b1 = buffer1;
b2 = buffer2; b2 = buffer2;
for (column = 0; for (column = 0;
@ -427,6 +430,179 @@ static char *dmi_onboard_type(u8 code)
return onboard_type[code]; return onboard_type[code];
} }
static char *dmi_mgmt_dev_type(u8 code)
{
static char *type[]={
"",
"Other",
"Unknown",
"LM75",
"LM78",
"LM79",
"LM80",
"LM81",
"ADM9240",
"DS1780",
"MAX1617",
"GL518SM",
"W83781D",
"HT82H791",
};
code &= 0x80;
if (code > 0x0d)
return "";
return type[code];
}
static char *dmi_mgmt_addr_type(u8 code)
{
static char *type[]={
"",
"Other",
"Unknown",
"I/O",
"Memory",
"SMBus",
};
code &= 0x80;
if (code > 5)
return "";
return type[code];
}
static char *dmi_fan_type(u8 code)
{
static char *type[]={
"",
"Other",
"Unknown",
"Fan",
"Centrifugal Blower",
"Chip Fan",
"Cabinet Fan",
"Power Supply Fan",
"Heat Pipe",
"Integrated Refrigeration",
"",
"",
"",
"",
"",
"",
"Active Cooling",
"Passive Cooling",
};
code &= 0x80;
if (code > 0x11)
return "";
return type[code];
}
static char *dmi_volt_loc(u8 code)
{
static char *type[]={
"",
"Other",
"Unknown",
"Processor",
"Disk",
"Peripheral Bay",
"System Management Module",
"Motherboard",
"Memory Module",
"Processor Module",
"Power Unit",
"Add-in Card",
};
code &= 0x80;
if (code > 0x0b)
return "";
return type[code];
}
static char *dmi_temp_loc(u8 code)
{
static char *type[]={
"Front Panel Board",
"Back Panel Board",
"Power System Board",
"Drive Back Plane",
};
code &= 0x80;
if (code <= 0x0b)
return dmi_volt_loc(code);
return type[code - 0x0c];
}
static char *dmi_status(u8 code)
{
static char *type[]={
"",
"Other",
"Unknown",
"OK",
"Non-critical",
"Critical",
"Non-recoverable",
};
code &= 0x80;
if (code > 6)
return "";
return type[code];
}
/* 3 dec. places */
static char *dmi_millivolt(u8 *data, int index)
{
static char buffer[20];
short int d;
if (data[index+1] == 0x80 && data[index] == 0)
return "Unknown";
d = data[index+1] << 8 | data[index];
sprintf(buffer, "%0.3f", d / 1000.0);
return buffer;
}
/* 2 dec. places */
static char *dmi_accuracy(u8 *data, int index)
{
static char buffer[20];
short int d;
if (data[index+1] == 0x80 && data[index] == 0)
return "Unknown";
d = data[index+1] << 8 | data[index];
sprintf(buffer, "%0.2f", d / 100.0);
return buffer;
}
/* 1 dec. place */
static char *dmi_temp(u8 *data, int index)
{
static char buffer[20];
short int d;
if (data[index+1] == 0x80 && data[index] == 0)
return "Unknown";
d = data[index+1] << 8 | data[index];
sprintf(buffer, "%0.1f", d / 10.0);
return buffer;
}
/* 0 dec. place */
static char *dmi_speed(u8 *data, int index)
{
static char buffer[20];
short int d;
if (data[index+1] == 0x80 && data[index] == 0)
return "Unknown";
d = data[index+1] << 8 | data[index];
sprintf(buffer, "%d", d);
return buffer;
}
static void dmi_table(int fd, u32 base, int len, int num) static void dmi_table(int fd, u32 base, int len, int num)
{ {
@ -706,21 +882,21 @@ static void dmi_table(int fd, u32 base, int len, int num)
break; break;
case 15: case 15:
printf("\tEvent Log\n"); printf("\tEvent Log\n");
printf("\t\tLog Area: %d bytes.\n", printf("\t\tLog Area: %d bytes.\n",
data[5]<<8|data[4]); data[5]<<8|data[4]);
printf("\t\tLog Header At: %d.\n", printf("\t\tLog Header At: %d.\n",
data[7]<<8|data[6]); data[7]<<8|data[6]);
printf("\t\tLog Data At: %d.\n", printf("\t\tLog Data At: %d.\n",
data[9]<<8|data[8]); data[9]<<8|data[8]);
printf("\t\tLog Type: %d.\n", printf("\t\tLog Type: %d.\n",
data[10]); data[10]);
if(data[11]&(1<<0)) if(data[11]&(1<<0))
printf("\t\tLog Valid: Yes.\n"); printf("\t\tLog Valid: Yes.\n");
if(data[11]&(1<<1)) if(data[11]&(1<<1))
printf("\t\t**Log Is Full**.\n"); printf("\t\t**Log Is Full**.\n");
break; break;
case 16: case 16:
printf("\tPhysical Memory Array\n"); printf("\tPhysical Memory Array\n");
@ -737,15 +913,158 @@ static void dmi_table(int fd, u32 base, int len, int num)
case 20: case 20:
printf("\tMemory Device Mapped Address\n"); printf("\tMemory Device Mapped Address\n");
break; break;
case 21:
printf("\tBuilt-In Pointing Device\n");
break;
case 22:
printf("\tPortable Battery\n");
printf("\t\tLocation: %s\n",
dmi_string(dm, data[4]));
printf("\t\tManufacturer: %s\n",
dmi_string(dm, data[5]));
printf("\t\tManufacture Date: %s\n",
dmi_string(dm, data[6]));
printf("\t\tSerial Number: %s\n",
dmi_string(dm, data[7]));
printf("\t\tName: %s\n",
dmi_string(dm, data[8]));
break;
case 23:
printf("\tSystem Reset\n");
break;
case 24: case 24:
printf("\tHardware Security\n"); printf("\tHardware Security\n");
break; break;
case 25: case 25:
printf("\tSystem Power Controls\n"); printf("\tSystem Power Controls\n");
break; break;
case 26:
printf("\tVoltage Sensor\n");
printf("\t\tDescription: %s\n",
dmi_string(dm, data[4]));
printf("\t\tDevice Location: %s\n",
dmi_volt_loc(data[5] & 0x1f));
printf("\t\tDevice Status: %s\n",
dmi_status(data[5] >> 5));
printf("\t\tMaximum Value: %s\n",
dmi_millivolt(data, 6));
printf("\t\tMinimum Value: %s\n",
dmi_millivolt(data, 8));
printf("\t\tResolution: %s\n",
dmi_millivolt(data, 10));
printf("\t\tTolerance: %s\n",
dmi_millivolt(data, 12));
printf("\t\tAccuracy: %s\n",
dmi_accuracy(data, 14));
if(dm->length > 0x14)
printf("\t\tNominal Value: %s\n",
dmi_millivolt(data, 0x14));
break;
case 27:
printf("\tCooling Device\n");
printf("\t\tDevice Type: %s\n",
dmi_fan_type(data[5] & 0x1f));
printf("\t\tDevice Status: %s\n",
dmi_status(data[5] >> 5));
if(dm->length > 0x0c)
printf("\t\tNominal Speed: %s\n",
dmi_speed(data, 0x0c));
break;
case 28:
printf("\tTemperature Sensor\n");
printf("\t\tDescription: %s\n",
dmi_string(dm, data[4]));
printf("\t\tDevice Location: %s\n",
dmi_temp_loc(data[5] & 0x1f));
printf("\t\tDevice Status: %s\n",
dmi_status(data[5] >> 5));
printf("\t\tMaximum Value: %s\n",
dmi_temp(data, 6));
printf("\t\tMinimum Value: %s\n",
dmi_temp(data, 8));
printf("\t\tResolution: %s\n",
dmi_temp(data, 10));
printf("\t\tTolerance: %s\n",
dmi_temp(data, 12));
printf("\t\tAccuracy: %s\n",
dmi_accuracy(data, 14));
if(dm->length > 0x14)
printf("\t\tNominal Value: %s\n",
dmi_temp(data, 0x14));
break;
case 29:
printf("\tCurrent Sensor\n");
printf("\t\tDescription: %s\n",
dmi_string(dm, data[4]));
printf("\t\tDevice Location: %s\n",
dmi_volt_loc(data[5] & 0x1f));
printf("\t\tDevice Status: %s\n",
dmi_status(data[5] >> 5));
printf("\t\tMaximum Value: %s\n",
dmi_millivolt(data, 6));
printf("\t\tMinimum Value: %s\n",
dmi_millivolt(data, 8));
printf("\t\tResolution: %s\n",
dmi_millivolt(data, 10));
printf("\t\tTolerance: %s\n",
dmi_millivolt(data, 12));
printf("\t\tAccuracy: %s\n",
dmi_accuracy(data, 14));
if(dm->length > 0x14)
printf("\t\tNominal Value: %s\n",
dmi_millivolt(data, 0x14));
break;
case 30:
printf("\tOut-of-Band Remote Access\n");
break;
case 31:
printf("\tBoot Integrity Services Entry Point\n");
break;
case 32: case 32:
printf("\tSystem Boot Information\n"); printf("\tSystem Boot Information\n");
break; break;
case 33:
printf("\t64-bit Memory Error Information\n");
break;
case 34:
printf("\tManagement Device\n");
printf("\t\tDescription: %s\n",
dmi_string(dm, data[4]));
printf("\t\tDevice Type: %s\n",
dmi_mgmt_dev_type(data[5]));
printf("\t\tAddress Type: %s\n",
dmi_mgmt_addr_type(data[6]));
break;
case 35:
printf("\tManagement Device Component\n");
printf("\t\tDescription: %s\n",
dmi_string(dm, data[4]));
printf("\t\tDevice Handle : 0x%02x%02x\n",
data[6], data[5]);
printf("\t\tComponent Handle: 0x%02x%02x\n",
data[8], data[7]);
printf("\t\tThreshold Handle: 0x%02x%02x\n",
data[10], data[9]);
break;
case 36:
printf("\tManagement Device Threshold Data\n");
if (dm->length > 4)
dump_raw_data(data+4, dm->length-4);
break;
case 37:
printf("\tMemory Channeln");
break;
case 38:
printf("\tIPMI Device\n");
if (dm->length > 4)
dump_raw_data(data+4, dm->length-4);
break;
case 39:
printf("\tPower Supply\n");
if (dm->length > 4)
dump_raw_data(data+4, dm->length-4);
break;
case 126: case 126:
printf("\tInactive\n"); printf("\tInactive\n");
break; break;