moredelay();
for (i = 0; i <= 0x100; i++)
{
newiodelay();//longerdelay
}
chk_smbus_ready(); //wheater SMBUS is ready
}
/////////////////////////////////////////////////////////////////////
int
chk_smbus_ready()
// To decide whether SMBUS is ready or has completed the action, you
should wait for a long time to check whether SMBUS has successfully
transmitted the command.
Since error may rarely occurs, BIOS code does not make judgement on
the return value of this function in read and write of SUMBUS byte.
{
int i, result = 1;
BYTE data;
for (i = 0; i <= 0x800; i++)
{
//SMB_BASE + 0 is the value of SMBUS status
data = inportb(SMBUS_PORT);//Read SMBUS status value once
data = check_data(SMBUS_PORT);//Read SMBUS status value
several time
outportb(SMBUS_PORT, data); // Write back SMBUS status
value which will clear status value (Write 1 to the corresponding bit
means clearing status
if (data & 0x02)
{
// If bit 1 is set (which means the command is
completed), SMBUS is ready
result = 0;//SMBUS ready
break;
}
if (!(data & 0xBF))
{
// If all bits are 0 except bit 2 (which means error
occurs on SMBUS), SMBUS is ready
result = 0;
break;
//longerdelay
//SMBUS ready
69
ITA-5231 User Manual