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

📄 fruid.c

📁 Write Fruid in DOS system
💻 C
📖 第 1 页 / 共 2 页
字号:
	for(index = 0; index < fru[1].Length; index++)
		compare_info[index] = i2c_read_word(offset+index);
	printf("       Value:  %s\n", compare_info);
}

void Check_ManuLoc()
{
	WORD index;
	WORD offset = fru[2].Location;
	printf("0x%4X Field:  %s\n", offset, fru[2].Field_descript);

	memset(compare_ManuLoc, 0, 65);
	for(index = 0;index < fru[2].Length;index++)
		compare_ManuLoc[index] = i2c_read_word(offset+index);
	printf("       Value:  %s\n", compare_ManuLoc);
}

void Check_PN()
{
	WORD index;
	WORD offset = fru[3].Location;
	printf("0x%4X Field:  %s\n", offset, fru[3].Field_descript);
        
	memset(compare_pn, 0, 8);
	for(index = 0;index < fru[3].Length;index++)
		compare_pn[index] = i2c_read_word(offset+index);
	printf("       Value:  %s\n", compare_pn);
}


void Check_SN()
{
	WORD index;
	WORD offset = fru[4].Location;

	memset(compare_sn, 0, 7);
	for(index = 0;index < fru[4].Length;index++)
		compare_sn[index] = i2c_read_word(offset+index);
//	printf("0x%4X Field:  Sun_Serial_No\n", offset);
//	printf("       Value:  %s\n", compare_sn);
}

void Check_VendorName()
{
	WORD index;
	WORD offset = fru[5].Location;
	printf("0x%4X Field:  %s\n", offset, fru[5].Field_descript);
	printf("       Value:  0x%2.2X%2.2X\n", i2c_read_word(offset), i2c_read_word(offset + 1));
}

void Check_HW_Rev_Lev()
{
	WORD index;
	WORD offset = fru[6].Location;
	printf("0x%4X Field:  %s\n", offset, fru[6].Field_descript);

	memset(compare_hw, 0, 3);
	for(index = 0;index < fru[6].Length;index++)
		compare_hw[index] = i2c_read_word(offset+index);
	printf("       Value:  %s\n", compare_hw);
}

void Check_bin_info()
{
	WORD index;
	WORD offset = fru[7].Location;
	printf("0x%4X Field:  %s\n", offset, fru[7].Field_descript);

	memset(compare_bin_info, 0, 12);
	for(index = 0;index < fru[7].Length;index++)
		compare_bin_info[index] = i2c_read_word(offset+index);
	printf("       Value:  %s\n", compare_bin_info);
}


int Check_CRC32()
{
	u32 CRC32 = 0, CRC32_1 = 0, CRC32_2 = 0;
	WORD CRC32_h16, CRC32_l16;
	int i;
	BYTE crc1;
	BYTE crc2;
	BYTE crc3;
	BYTE crc4;

	printf("0x%4X Field:  CRC32 (Verified)\n", fru[9].Location);

	CRClength = fru[8].Length;
	for(i=0;i<CRClength;i++)
		FruBuffer[fru[8].Location+i] = i2c_read_word(fru[8].Location+i);
	CRC32=compute_crc32(&FruBuffer[fru[8].Location],CRClength);
	CRC32_2 = CRC32;
	CRC32_h16 = CRC32 >> 16;
	CRC32_l16 = CRC32 & 0xFFFF;

	for (i=0;i<=3;i++)
	{
		CRC32_1 += i2c_read_word(fru[9].Location+i);
		if (i<=2)
			CRC32_1*=256;
	}

	crc1 =  i2c_read_word(fru[9].Location);
	crc2 =  i2c_read_word(fru[9].Location+1);
	crc3 =  i2c_read_word(fru[9].Location+2);
	crc4 =  i2c_read_word(fru[9].Location+3);

	printf("    Expected:  0x%4.4X%4.4X\n", CRC32_h16, CRC32_l16);
	printf("        Read:  0x%2.2X%2.2X%2.2X%2.2X\n", crc1, crc2, crc3, crc4);

	if (CRC32_2 == CRC32_1)
	{
		printf("Check EEPROM Checksum32 Pass\n");
		return 0;
	}
	else
	{
		printf("Check EEPROM Checksum32 Error\n");
		return 1;
	}
}

void usage()
{
	gotoxy(1,6);
	printf("  FRUID Usage:\n");
	gotoxy(1,7);
/*	printf("  FRUID MB[FPB, SBP, CSBP] A xxx.bin  -- Update BIN file and UNIX_Timestamp32,\n");
	printf("                                         need input source BIN file name.\n");
	printf("  FRUID MB[FPB, SBP, CSBP] D          -- Dump All Context of EEPROM to a file,\n");
	printf("                                         neet input target file name.\n");
	printf("  FRUID MB[FPB, SBP, CSBP] WS         -- Write Serial Number.\n");
	printf("  FRUID MB[FPB, SBP, CSBP] T          -- Update UNIX_Timestamp32.\n");
	printf("  FRUID MB[FPB, SBP, CSBP] CS         -- Check static contents.\n");
	printf("  FRUID MB[FPB, SBP, CSBP] CD         -- Check dynamic contents.\n");
	printf("  FRUID -h                            -- Print this usage.\n\n");

	printf("  MB    ---  Motherbord\n");
	printf("  FPB   ---  Front Panel backplane\n");
	printf("  SPB   ---  Sirius | SATA backplane\n");
	printf("  CSPB  ---  Chicago | SATA backplane\n\n");

	printf("  Example: Update Motherboard BIN file.\n");
	printf("           FRUID MB A xxx.bin\n");
*/
	printf("  FRUID MB A xxx.bin     ----    Update BIN file and UNIX_Timestamp32,\n");
	printf("                                 need input source BIN file name.\n");
	printf("  FRUID MB D             ----    Dump All Context of EEPROM to a file,\n");
	printf("                                 neet input target file name.\n");
	printf("  FRUID MB WS            ----    Write Serial Number.\n");
	printf("  FRUID MB T             ----    Update UNIX_Timestamp32.\n");
	printf("  FRUID MB CS            ----    Check static contents.\n");
	printf("  FRUID MB CD            ----    Check dynamic contents.\n");
	printf("  FRUID -h               ----    Print this usage.\n\n");

	printf("  MB    ----    Motherbord\n");

	printf("  Example: Update Motherboard BIN file.\n");
	printf("           FRUID MB A xxx.bin\n");
}

int main(int argc,char *argv[])
{
	char str_s[7];
	FILE *file = NULL;
	int flag =0;
	int length=0;

	memset(SN_number,0,7);

	clrscr();
	gotoxy(8,1);
	printf("********************************************************************\n");
	gotoxy(8,2);
	printf("*                  Munich Update Motherboard FRU Tool              *\n");
	gotoxy(8,3);
	printf("*       By: MiTAC Shanghai ESBU/SW   Ver:0.1   Date:2006-06-19     *\n");
	gotoxy(8,4);
	printf("********************************************************************\n");

	if((argc == 2) || (argc == 3))
	{
		gotoxy(8, 6);
		if( (strncmp(argv[1], "MB", 2)) && (strncmp(argv[1], "mb", 2)) && 
//			(strncmp(argv[1], "FPB", 3)) && (strncmp(argv[1], "fpb", 3)) &&
//			(strncmp(argv[1], "SBP", 3)) && (strncmp(argv[1], "sbp", 3)) &&
//			(strncmp(argv[1], "CSBP", 4)) && (strncmp(argv[1], "csbp", 4)) &&
			(strncmp(argv[1], "-H", 2)) && (strncmp(argv[1], "-h", 2)) &&
			(strncmp(argv[2], "D", 1)) && (strncmp(argv[2], "d", 1)) &&
			(strncmp(argv[2], "A", 1)) && (strncmp(argv[2], "a", 1)) &&
			(strncmp(argv[2], "WS", 2)) && (strncmp(argv[2], "ws", 2)) &&
			(strncmp(argv[2], "T", 1)) && (strncmp(argv[2], "t", 1)) &&
			(strncmp(argv[2], "CS", 2)) && (strncmp(argv[2], "cs", 2)) &&
			(strncmp(argv[2], "CD", 2)) && (strncmp(argv[2], "cd", 2)) )
		{
			printf("Command Parameter Error\n");
			return 1;
		}
    }

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

    get_smbus_addr();

	if(!(strncmp(argv[1], "MB", 2)) || !(strncmp(argv[1], "mb", 2))){
		slave_addr = 0xA8;
		fru = FruTable_MFS;
    }
/*	if(!(strncmp(argv[1], "FPB", 3)) || !(strncmp(argv[1], "fpb", 3))){
		slave_addr = 0xA4;
		fru = FruTable_MFS;
    }
    if(!(strncmp(argv[1], "SBP", 3)) || !(strncmp(argv[1], "sbp", 2))){
		slave_addr = 0xA2;
		fru = FruTable_MFS;
    }
	if(!(strncmp(argv[1], "CSBP", 4)) || !(strncmp(argv[1], "csbp", 4))){
		slave_addr = 0xA6;
		fru = FruTable_CS;
    }
*/
	gotoxy(1, 10);

	if(!(strncmp(argv[2], "D", 1)) || !(strncmp(argv[2], "d", 1))) 
		flag = 0;
	if(!(strncmp(argv[2], "A", 1)) || !(strncmp(argv[2], "a", 1)))
		flag = 1;
	if(!(strncmp(argv[2], "WS", 2)) || !(strncmp(argv[2], "ws", 2)))
		flag = 2;
	if(!(strncmp(argv[2], "T", 1)) || !(strncmp(argv[2], "t", 1)))
		flag = 3;
	if(!(strncmp(argv[2], "CS", 2)) || !(strncmp(argv[2], "cs", 2)))
		flag = 4;
	if(!(strncmp(argv[2], "CD", 2)) || !(strncmp(argv[2], "cd", 2)))
		flag = 5;

	switch(flag)
	{
	case 0: //dump
		if(argc == 3){
			printf("Error: Please input Target file name\n");
			return 1;
		}
		strcpy(TSFileName,argv[3]);
		file = fopen(TSFileName,"wb+");   
		if(file == NULL){
			perror("fopen");
			return 1;
		}
		printf("Dump All Context of EEPROM to the target file %s......\n", TSFileName);
		Display_All_Context();
		if(fwrite(FruBuffer,sizeof(char), sizeof(FruBuffer), file)==0) {
			printf("Write %s error !!",TSFileName);
			fclose(file);
			return 1;
		}
		fclose(file);
		return 0;

	case 1: //update all bin file
		if(argc == 3){
			printf("Error: Please input BIN file name\n");
			return 1;
		}
		strcpy(SFileName,argv[3]);
		file = fopen(SFileName,"rb");   
		if(file == NULL){
			perror("fopen");
			return 1;
		}
		fclose(file);      

		printf("Begin to Update EEPROM with the bin file......\n");
		Update_Binfile();
		Update_time();

		printf("Update EEPROM Checksum32......\n");
		Update_CRC32();
		printf("Update EEPROM Checksum32 Success\n");
		printf("Double check EEPROM Checksum32......\n");
		DoubleCheck_CRC32();
		break;

	case 2: //write serial number
		printf("Please input Serial Number:\n");
		scanf("%s", str_s);
		length=strlen(str_s);
//		printf("total str: %s\n", str_s);
		memset(SN_number, 0, 7);
		strncpy(SN_number, (str_s+length-6), fru[4].Length);
		printf("Serial Number: %s\n", SN_number);
		printf("Write Serial Number......\n");
		Update_Serial_NO();
		printf("Write Serial Number \"%s\" Success\n", SN_number);

		Check_SN();
		printf("Read Serial Number Stored in EEPROM: %s\n", compare_sn);
		if(fru[4].Length != strlen(SN_number)){
			printf("Update Serial number error, length error\n");
			return 1;
		}
		if(strncmp(SN_number, compare_sn, fru[4].Length)){
			printf("Update Serial number error, string error\n");
			return 1;
		}
		printf("Compare Write/Read Serial Number pass\n");

		printf("Update EEPROM Checksum32......\n");
		Update_CRC32();
		printf("Update EEPROM Checksum32 Success\n");
		printf("Double check EEPROM Checksum32......\n");
		DoubleCheck_CRC32();
		break;

	case 3: //update time
		printf("Update time......\n");
		if (Update_time())
			return 1;
		Check_time();

		printf("Update EEPROM Checksum32......\n");
		Update_CRC32();
		printf("Update EEPROM Checksum32 Success\n");
		printf("Double check EEPROM Checksum32......\n");
		DoubleCheck_CRC32();
		break;

	case 4: //check static contents
		Check_Info();
		Check_ManuLoc();
		Check_PN();
		Check_VendorName();
		Check_HW_Rev_Lev();
		Check_bin_info();
		return 0;

	case 5: //check dynamic contents
		Check_time();
		printf("0x%4X Field:  %s\n", fru[4].Location, fru[4].Field_descript);
		Check_SN();
		printf("       Value:  %s\n", compare_sn);
		return Check_CRC32();

	default:
		usage();
		break;
	}
    return 0;
}

u32 pcibios_read_config_dword(u32 busnum, u32 devnum, u32 funnum, u32 regnum)
{
	u32 value=-1;
	u32 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
		};
	return value;
}

int probe_smbus (u32 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_dword (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_dword (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;
}

BYTE i2c_read_word(WORD offset1)
{
	BYTE value,msb_offset,lsb_offset;

	msb_offset = offset1 >> 8;
	lsb_offset = offset1 & 0xff;
     
	outb_p (0, STS);
	outb_p (0, DATA0);
	outb_p (0, DATA1);

	delay(8);

	outb_p (msb_offset, CMD);	// EEPROM MSB offest address to CMD
	outb_p (lsb_offset, DATA0);	// EEPROM LSB offest address to DATA 0
	outb_p (slave_addr, ADDR);	// write SMBus Host Address 
	outb_p (0x06, PRTCL);		// write Byte
	delay(8);
//	printf("Serial Number Address: 0x%x%x\n", inb_p(CMD), inb_p(DATA0)); 
 
	outb_p (0, STS);
	outb_p (0, DATA0);
	delay(8);
	outb_p(0x05, PRTCL);		//receive byte     
	delay(8);

	value = inb_p(DATA0);
//	printf("value: %x\n", inb_p(DATA0)); 
	return value;
}


void i2c_write_word(WORD offset,BYTE data)
{
	BYTE msb_offset,lsb_offset;

	msb_offset = offset >> 8;
	lsb_offset = offset & 0xff;

	outb_p (0, STS);
	outb_p (0, DATA0);
	outb_p (0, DATA1);

	outb_p(msb_offset, CMD);	// EEPROM MSB offest address to CMD
	outb_p(lsb_offset, DATA0);	// EEPROM LSB offest address to DATA 0
	outb_p(slave_addr, ADDR);	// write SMBus Host Address
	outb_p(data, DATA1);
	delay(10);
//	printf("Write data 0x%x\n", inb_p(DATA1));	
	outb_p(0x08, PRTCL);		// write WORD
	delay(10);
}

⌨️ 快捷键说明

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