📄 fruid.c
字号:
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 + -