📄 hwmodiag.c
字号:
//*************************************************************
//* This utility is to test MarrakechII Hardware Monitor *
//*************************************************************
//* Create date: 2006/2/9
//* Auther: MiTAC Shanghai ESBU/SW Yuanjie Xu
//*
//* Chipset: NVDIA MCP55
//* HWmonitor: ADT7476
//****************************************************
//* Rev. Date By Description *
//****************************************************
//* 0.1 2006/2/9 Yuanjie Xu Initial version
//* 0.2 2006/3/24 Yuanjie Xu VCCP max = 1.35, not 1.5
//* 0.3 2006/4/5 Yuanjie Xu CPU Temperature should be modified by a
//* Thermtrip Status Register
//* 0.4 2006/5/10 Yuanjie Xu (1)delete fan4
//* (2)modify CPU temperature diode
//* 0.5 2006/6/14 Yuanjie Xu BIOS has modified CPU temp diode, so no need to minus
//* 0.6 2006/7/17 Yuanjie Xu Modify CPU VCCP voltage stand value from 1.30 to 1.35
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <mem.h>
#include <conio.h>
#pragma inline
typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;
typedef unsigned long long u64;
static unsigned long smbus_base_addr = 0;
static unsigned long smbus_base_offset = 0;
static unsigned long smbus_value_bit = 0;
struct smbus_controller
{
unsigned long pci_id;
unsigned long base_offset;
unsigned long value_bit;
};
static struct smbus_controller smbus_controller_list[] =
{
{ 0x25a48086, 0x20, 0xffe0}, //Hance Rapids ICH SMBus Controller
{ 0x24838086, 0x20, 0xffe0}, //ICH3 SMBus Controller
{ 0x005210de, 0x24, 0xffff}, //CK804 SMBus Controller, NVDIA
{ 0x036810de, 0x24, 0xffff}, //MCP55 SMBus Controller, NVDIA
{ 0, 0, 0},
};
struct hwmo_chip
{
int device_id;
int company_id;
}chip_id = {0,0};
/*Hardware Monitor Define*/
#define slaveadd 0x2E
/*NVDIA MCP55 SMBus address offsets */
#define PRTCL (smbus_base_addr + 0)
#define STS (smbus_base_addr + 1)
#define ADDR (smbus_base_addr + 2)
#define CMD (smbus_base_addr + 3)
#define DATA0 (smbus_base_addr + 4)
/*ADT7476 start monitor register*/
#define config_reg 0x40
enum TEST_TYPE
{
enum_V25 = 0,
enum_VCCP,
enum_VCC,
enum_V5,
enum_V12,
enum_VID,
enum_Fan1,
enum_Fan2,
enum_Fan3,
// enum_Fan4,
enum_R1Temp,
enum_LTemp,
enum_R2Temp
};
struct hwm_item
{
char name[15];
unsigned char slave_addr;
unsigned char addr;
union
{
int ival;
double fval;
} get_val, get_min, get_max;
double p;
int min;
int max;
float stand_value;
char start[5];
};
#define Ext_Reg1 0x76
#define Ext_Reg2 0x77
//vol
#define V2_5 0x20
#define VCCP 0x21
#define VCC 0x22
#define V5 0x23
#define V12 0x24
#define VID 0x43
//fan
#define FANTACH1_L 0x28
#define FANTACH1_H 0x29
#define FANTACH2_L 0x2A
#define FANTACH2_H 0x2B
#define FANTACH3_L 0x2C
#define FANTACH3_H 0x2D
#define FANTACH4_L 0x2E
#define FANTACH4_H 0x2F
//temperature
#define R1_Temp 0x25
#define L_Temp 0x26
#define R2_Temp 0x27
static struct hwm_item tests[] =
{
{"2.5V", slaveadd, V2_5, {0.0}, {0.0}, {0.0}, 0.0032, 95, 105, 2.5, "YES"},
{"VCCP 1.35V", slaveadd, VCCP, {0.0}, {0.0}, {0.0}, 0.00293, 95, 105, 1.35, "YES"},
{"VCC 3.3V", slaveadd, VCC, {0.0}, {0.0}, {0.0}, 0.0042, 95, 105, 3.3, "YES"},
{"V5", slaveadd, V5, {0.0}, {0.0}, {0.0}, 0.0065, 95, 105, 5.0, "YES"},
{"12V", slaveadd, V12, {0.0}, {0.0}, {0.0}, 0.0156, 95, 105, 12.0, "YES"},
{"VID 1.35V", slaveadd, VID, {0.0}, {0.0}, {0.0}, 1.0, 95, 105, 1.35, "YES"},
{"Fan1", slaveadd, FANTACH1_L, {0.0}, {0.0}, {0.0}, 5400000.0, 2500, 14000, 0.0, "YES"},
{"Fan2", slaveadd, FANTACH2_L, {0.0}, {0.0}, {0.0}, 5400000.0, 2500, 14000, 0.0, "YES"},
{"Fan3", slaveadd, FANTACH3_L, {0.0}, {0.0}, {0.0}, 5400000.0, 2500, 14000, 0.0, "YES"},
// {"Fan4", slaveadd, FANTACH4_L, {0.0}, {0.0}, {0.0}, 5400000.0, 2500, 14000, 0.0, "YES"},
{"CPU Temp", slaveadd, R1_Temp, {0}, {0}, {0}, 1.0, 10, 60, 0.0, "YES"},
{"Local Temp", slaveadd, L_Temp, {0}, {0}, {0}, 1.0, 10, 60, 0.0, "YES"},
{"System Temp", slaveadd, R2_Temp, {0}, {0}, {0}, 1.0, 10, 60, 0.0, "YES"},
{"", 0, 0, {0}, {0}, {0}, 0.0, 0, 0, 0.0, ""}
};
/*Function Define*/
void outb_p(int value, int addr);
u16 inb_p(int addr);
//#define inp(p) inportb(p)
//#define outp(v,p) outportb(v,p)
u32 pcibios_read_config_u32(u32 busnum, u32 devnum, u32 funnum, u32 regnum);
int probe_smbus (u32 pci_id);
int get_smbus_addr (void);
int i2c_read_u8(int sa, u8 offset);
void i2c_write_u8(int sa, u8 offset, u8 data);
int read_chip_id (void);
void hwmtest_start(void);
u32 ReadThermState(int cpunode);
int test_vol(void)
{
int i, type;
int temp = 0, temp1 = 0, temp2 = 0, vol = 0;
printf("\nBegin Voltage Test ......\n");
for (i=0; i<6; i++)
{
if ((strncmp(tests[i].start, "YES", 3)) && (strncmp(tests[i].start, "NO", 2)))
{
printf("Config file Error: Parameter \"Start\" should be set to \"YES\" or \"NO\"\n");
return 1;
}
else if (!(strncmp(tests[i].start, "NO", 2)))
printf("%-15s : Not test\n", tests[i].name);
//YES
else
{
temp1 = i2c_read_u8 (tests[i].slave_addr, Ext_Reg1);
temp2 = i2c_read_u8 (tests[i].slave_addr, Ext_Reg2);
temp = i2c_read_u8 (tests[i].slave_addr, tests[i].addr);
if(temp == 0xff)
{
printf("%-15s : Function Error\n", tests[i].name);
return 1;
}
type = i;
switch(type)
{
case enum_V25:
vol = (temp << 2) + (temp1 & 0x03);
break;
case enum_VCCP:
vol = (temp << 2) + ((temp1 & 0x0C) >> 2);
break;
case enum_VCC:
vol = (temp << 2) + ((temp1 & 0x30) >> 4);
break;
case enum_V5:
vol = (temp << 2) + ((temp1 & 0xC0) >> 6);
break;
case enum_V12:
vol = (temp << 2) + (temp2 & 0x03);
break;
}
tests[i].get_val.fval = (float)vol * (tests[i].p);
tests[5].get_val.fval = 0.800 + (0x1E - (temp & 0x1F)) * 0.025; //VID
tests[i].get_min.fval = (tests[i].stand_value) * (tests[i].min)/100;
tests[i].get_max.fval = (tests[i].stand_value) * (tests[i].max)/100;
if (((tests[i].get_val.fval) < (tests[i].get_min.fval)) || ((tests[i].get_val.fval) > (tests[i].get_max.fval)))
{
printf("%s Error: %4.3f V, min %4.3f V, max %4.3f V\n",
tests[i].name, tests[i].get_val.fval, tests[i].get_min.fval, tests[i].get_max.fval);
return 1;
}
printf("%-15s : %4.3f V\n", tests[i].name, tests[i].get_val.fval);
}
}
return 0;
}
int test_fan(void)
{
int i;
int l = 0, m = 0, speed = 0;
printf("\nBegin System FAN Test ......\n");
for (i=6; i<9; i++)
{
if ((strncmp(tests[i].start, "YES", 3)) && (strncmp(tests[i].start, "NO", 2)))
{
printf("Config file Error: Parameter \"Start\" should be set to \"YES\" or \"NO\"\n");
return 1;
}
else if (!(strncmp(tests[i].start, "NO", 2)))
printf("%-15s : Not test\n", tests[i].name);
else
{
l = i2c_read_u8 (tests[i].slave_addr, tests[i].addr);
m = i2c_read_u8 (tests[i].slave_addr, (tests[i].addr)+1);
if((l == 0xff) && (m == 0xff))
{
printf("%-15s : Function Error\n", tests[i].name);
return 1;
}
speed = (m << 8) + l;
tests[i].get_val.fval = (tests[i].p)/speed;
if ((tests[i].get_val.fval) < (tests[i].min) || (tests[i].get_val.fval) > (tests[i].max))
{
printf("%s speed Error: %d RPM, min %d RPM, max %d RPM\n",
tests[i].name, (int)(tests[i].get_val.fval), tests[i].min, tests[i].max);
return 1;
}
printf("%-15s : %d RPM\n", tests[i].name, (int)tests[i].get_val.fval);
}
}
return 0;
}
int test_tem(void)
{
int i, type;
// int diode_val=0;
int temp=0;
printf("\nBegin Temperature Test ......\n");
for (i=9; i<12; i++)
{
if ((strncmp(tests[i].start, "YES", 3)) && (strncmp(tests[i].start, "NO", 2)))
{
printf("Config file Error: Parameter \"Start\" should be set to \"YES\" or \"NO\"\n");
return 1;
}
else if (!(strncmp(tests[i].start, "NO", 2)))
printf("%-15s : Not test\n", tests[i].name);
else
{
temp = i2c_read_u8 (tests[i].slave_addr, tests[i].addr);
if((temp == 0xff) || (temp == 0x80))
{
printf("%-15s : Function Error\n", tests[i].name);
return 1;
}
/* if (i == 9)
{
diode_val = (ReadThermState(0) >> 8) & 0x3F;
printf("diode_val: %d, temp: %d\n", diode_val, temp);
if(diode_val!=0)
tests[i].get_val.ival = temp + (11 - diode_val);
else
tests[i].get_val.ival = temp;
}
else */
tests[i].get_val.ival = temp;
if ((tests[i].get_val.ival) < (tests[i].min) || (tests[i].get_val.ival) > (tests[i].max))
{
printf("%s Error: %d, min %d, max %d\n",
tests[i].name, tests[i].get_val.ival, tests[i].min, tests[i].max);
return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -