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

📄 hwmodiag.c

📁 hwmodiag for mcp55 chipset
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
			printf("%-15s :  %d C Degree\n", tests[i].name, tests[i].get_val.ival);
		}
	}
	return 0;
}


void usage(void)
{
	gotoxy(1,6);
	printf("Usage:\n");
	printf("hwmodiag c [config file name]  --------  view config file\n");
	printf("hwmodiag t [config file name]  --------  start test\n");
	printf("hwmodiag -?                    --------  print this usage\n");

	return;
}

int main (int argc, char **argv)
{
	int i = 0, ret = 1, ch = 0;
	char *file = NULL;
//	char str;
	FILE *fp;
	char buf[80];
	char *vs;

	clrscr();

	gotoxy(8,1);
		printf("*********************************************************************\n");
	gotoxy(8,2);
		printf("*             Munich Hardware Monitor Testing Program               *\n");
	gotoxy(8,3);
		printf("*    Ver: 0.6    Date: 2006/07/17    By: MiTAC Shanghai ESBU/SW     *\n");
	gotoxy(8,4);
		printf("*********************************************************************\n");

	if((argc == 1) || !(strncmp(argv[1], "-?", 2)) || !(strncmp(argv[1], "-h", 2)) || !(strncmp(argv[1], "-H", 2)))
	{
	    usage();
	    return 0;
	}

	if (argc == 2)
	{
	    printf("Command error: Please inb_put your config file name!\n\n");
	    usage();
	    return 1;
	}
	else if (argc == 3)
	{
	    file = argv[2];
	    fp = fopen(file, "r");
	    if (fp)
	    {
	    	while (fgets(buf, sizeof(buf), fp))
	        {
		    for (i = 0; i<12; i++)
		    {
			if (strstr(buf, tests[i].name))
		    	{
			    vs = strstr(buf, "= ");
			    memset(tests[i].start, 0, 5);
			    sscanf(vs, "= %s %d, %d", tests[i].start, &tests[i].min, &tests[i].max);
			    tests[i].start[strlen(tests[i].start) - 1] = '\0';
//			    printf("%-25s= %-5s, %-9d, %d\n", tests[i].name, tests[i].start, tests[i].min, tests[i].max);
			}
		    }
	    	}
	    	fclose(fp);
	    }
	    else
	    {
	    	printf("%s: file open error!\n\n", file);
	    	return 1;
	    }
	}
	else
	{
	    printf("Command error\n\n");
	    usage();
            return 1;
	}

	ch = *argv[1];
	gotoxy(1,6);
	switch(ch)
	{
	    case 'c':
	    case 'C':
		printf("# Munich MB H/W Monitor Test Items\n");
		printf("# NO. Name        = Start, Value Min, Value Max\n");
		for (i = 0; i<12; i++)
		{
		    printf("%-3d%-15s= %-5s, %-9d, %d\n", i, tests[i].name, tests[i].start, tests[i].min, tests[i].max);
/*		    if (i == 15)
		    {
			printf("Please inb_put <Y> to continue: ");
			scanf("%s", &str);
		    }*/
		}
		break;
	    case 't':
	    case 'T':
		printf("Begin Test ......\n\n");
//		iopl(3);
		get_smbus_addr();
		ret = read_chip_id();
		if (ret)
		{
		    printf("\nHardware Monitor Chip error: wrong chip or bad chip\n");
		    printf("Hardware Monitor Chip ID: CompanyID = 0x%x,  DeviceID = 0x%x\n", chip_id.company_id, chip_id.device_id);
		    printf("1. Please check whether it is ADT7463\n");
		    printf("2. Please check whether it is broken\n");
//		    iopl(5);
		    return(ret);
		}
		hwmtest_start();
		ret = test_vol();
		if (ret)
		{
	            printf("..........Voltage test FAIL\n");
		    printf("\nMunich Hardware Monitor test FAIL\n");
//		    iopl(5);
		    return ret;
		}

		ret = test_fan();
	        if (ret)
		{
		    printf("..........CPU fan test FAIL\n");
		    printf("\nMunich Hardware Monitor test FAIL\n");
//		    iopl(5);
		    return ret;
		}
			
		ret = test_tem();
	        if (ret)
		{
		    printf("..........CPU temperature test FAIL\n");
		    printf("\nMunich Hardware Monitor test FAIL\n");
//		    iopl(5);
		    return ret;
		}

		if (ret == 0)
		    printf("\nMunich Hardware Monitor test PASS\n");
//		iopl(5);
		return ret;
	    
		default:
			usage();
			break;
	}
	return 0;
}

void outb_p(int value, int addr)
{
  asm{
	   mov	dx,addr
	   mov	al,value
	   out 	dx,al
     }
}

u16 inb_p(int addr)
{
   unsigned int value;
   asm{
           mov  dx, addr
           in   al, dx
           mov  value, al
      }
   return (value);
}


u32 pcibios_read_config_u32(u32 busnum, u32 devnum, u32 funnum, u32 regnum)
{
	unsigned long value=-1;
	unsigned long config;

//	iopl(3);
	config = (0x80000000|(busnum<<16)|(devnum<<11)|(funnum<<8)) + regnum;
	asm{
		.386
		mov  dx, 0cf8h
		mov  eax, config
		out  dx, eax
		mov  dx, 0cfch
		in   eax, dx
		mov  value, eax
		};

/*	outl(config, 0x0CF8);
	value = inl(0x0CFC);
        if(value == 0xFFFFFFFF)
		value = -1; */
	return value;
}

int probe_smbus (unsigned long pci_id)
{
	int i = 0, ret = 1;
 	while(smbus_controller_list[i].pci_id)
 	{ 
	    if ( smbus_controller_list[i].pci_id == pci_id)
	    {
		smbus_base_offset = smbus_controller_list[i].base_offset;
		smbus_value_bit = smbus_controller_list[i].value_bit;
		ret = 0;
		break;
	    }
	    i++;
 	}
 	return ret;
}

int get_smbus_addr (void)
{
	u32 pci_bus = 0, pci_dev = 0, pci_fn = 0, pci_id = 0;

	for(pci_bus=0; pci_bus<256; pci_bus++)
	    for(pci_dev=0; pci_dev<32; pci_dev++)
		for(pci_fn=0; pci_fn<8; pci_fn++)
		{
		    pci_id = pcibios_read_config_u32 (pci_bus, pci_dev, pci_fn, 0);
		    if (pci_id == 0xffffffff)
			continue;
		    if (probe_smbus(pci_id) != 0)
			continue;
		    else
		    {
//			printf("%x %x %x %x\n", pci_bus, pci_dev, pci_fn, smbus_base_offset);
	  		smbus_base_addr = pcibios_read_config_u32 (pci_bus, pci_dev, pci_fn, smbus_base_offset);
			smbus_base_addr &= 0xfffffffc;
//			printf("SMBus base address %8.8x\n", smbus_base_addr);
			return 0;
		    }
		}
	return 1;
}

int i2c_read_u8(int sa, u8 offset)
{
	outb_p(0, DATA0);
	outb_p(0, STS);

	outb_p(offset, CMD);
	outb_p(sa << 1, ADDR);
	outb_p(0x07, PRTCL);

	delay(500);

	return inb_p(DATA0);
}

void i2c_write_u8(int sa, u8 offset, u8 data)
{
	outb_p(0, DATA0);
	outb_p(0, STS);

	outb_p(offset, CMD);
	outb_p(sa << 1, ADDR);
	outb_p(data, DATA0);
	delay(100);
	outb_p(0x06, PRTCL);
	delay(100);
}

int read_chip_id (void)
{
	int result = 1;

	chip_id.device_id = i2c_read_u8(slaveadd, 0x3d);
	chip_id.company_id = i2c_read_u8(slaveadd, 0x3e);
//	printf("\ndevice_id = 0x%x,  company_id = 0x%x\n", chip_id.device_id, chip_id.company_id);

	if ((chip_id.device_id == 0x76) && (chip_id.company_id == 0x41))
	    result = 0;
	
	return (result);
}

void hwmtest_start(void)
{
	u8 value = i2c_read_u8(slaveadd, config_reg);
//	printf("0x40: 0x%x\n", value);
	i2c_write_u8(slaveadd, config_reg, (value | 0x1));
//	printf("0x40: 0x%x\n", i2c_read_u8(slaveadd, config_reg));
}

u32 ReadThermState(int cpunode)
{
    u32 busnum=0;
    u32 devnum=24;
    u32 funnum=3;
    u32 regnum=0xe4;
    u32 value=-1;

    devnum = devnum + cpunode;
    value = pcibios_read_config_u32(busnum, devnum, funnum, regnum);
    return value;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -