⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hwmodiag.c

📁 hwmodiag for mcp55 chipset
💻 C
📖 第 1 页 / 共 2 页
字号:
//*************************************************************
//*    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 + -