/* * waits for a completion of an I2C transfer * * returns 0: success, transfer completes * 1: error, transfer does not complete, I2C transfer * killed, wait loop terminated. */ int SkI2cWait( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ { SK_U64 StartTime; SK_U32 I2cCtrl; StartTime = SkOsGetTime(pAC); do { if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) { SK_I2C_STOP(IoC); #ifndef SK_DIAG SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG); #endif /* !SK_DIAG */ return(1); } SK_I2C_GET_CTL(IoC, &I2cCtrl); } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31); return(0); } /* SkI2cWait */
/* * waits for a completion of a TWSI transfer * * returns 0: success, transfer completes * 1: error, transfer does not complete, TWSI transfer * killed, wait loop terminated. */ int SkI2cWait( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */ { SK_U64 StartTime; SK_U64 CurrentTime; SK_U32 I2cCtrl; StartTime = SkOsGetTime(pAC); do { CurrentTime = SkOsGetTime(pAC); if (CurrentTime - StartTime > SK_TICKS_PER_SEC / 8) { SK_I2C_STOP(IoC); #ifndef SK_DIAG if (pAC->I2c.InitLevel > SK_INIT_DATA) { SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG); } #endif /* !SK_DIAG */ return(1); } SK_I2C_GET_CTL(IoC, &I2cCtrl); #ifdef xYUKON_DBG printf("StartTime=%lu, CurrentTime=%lu\n", StartTime, CurrentTime); if (kbhit()) { return(1); } #endif /* YUKON_DBG */ } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31); return(0); } /* SkI2cWait */