/* * waits for a completion of an I2C transfer * * Returns * Nothing */ void SkI2cWaitIrq( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC) /* I/O Context */ { SK_SENSOR *pSen; SK_U64 StartTime; SK_U32 IrqSrc; pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; if (pSen->SenState == SK_SEN_IDLE) { return; } 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_E016, SKERR_I2C_E016MSG); #endif /* !SK_DIAG */ return; } SK_IN32(IoC, B0_ISRC, &IrqSrc); } while ((IrqSrc & IS_I2C_READY) == 0); pSen->SenState = SK_SEN_IDLE; return; } /* SkI2cWaitIrq */
/* * 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 */
/* * The only Event to be served is the timeout event * */ int SkI2cEvent( SK_AC *pAC, /* Adapter Context */ SK_IOC IoC, /* I/O Context */ SK_U32 Event, /* Module specific Event */ SK_EVPARA Para) /* Event specific Parameter */ { int ReadComplete; SK_SENSOR *pSen; SK_U32 Time; SK_EVPARA ParaLocal; int i; /* New case: no sensors */ if (pAC->I2c.MaxSens == 0) { return(0); } switch (Event) { case SK_I2CEV_IRQ: pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); if (ReadComplete) { /* Check sensor against defined thresholds */ SkI2cCheckSensor(pAC, pSen); /* Increment Current sensor and set appropriate Timeout */ pAC->I2c.CurrSens++; if (pAC->I2c.CurrSens >= pAC->I2c.MaxSens) { pAC->I2c.CurrSens = 0; Time = SK_I2C_TIM_LONG; } else { Time = SK_I2C_TIM_SHORT; } /* Start Timer */ ParaLocal.Para64 = (SK_U64)0; pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, SKGE_I2C, SK_I2CEV_TIM, ParaLocal); } else { /* Start Timer */ ParaLocal.Para64 = (SK_U64)0; pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, SK_I2C_TIM_WATCH, SKGE_I2C, SK_I2CEV_TIM, ParaLocal); } break; case SK_I2CEV_TIM: if (pAC->I2c.TimerMode == SK_TIMER_NEW_GAUGING) { ParaLocal.Para64 = (SK_U64)0; SkTimerStop(pAC, IoC, &pAC->I2c.SenTimer); pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); if (ReadComplete) { /* Check sensor against defined thresholds */ SkI2cCheckSensor(pAC, pSen); /* Increment Current sensor and set appropriate Timeout */ pAC->I2c.CurrSens++; if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { pAC->I2c.CurrSens = 0; Time = SK_I2C_TIM_LONG; } else { Time = SK_I2C_TIM_SHORT; } /* Start Timer */ ParaLocal.Para64 = (SK_U64)0; pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, SKGE_I2C, SK_I2CEV_TIM, ParaLocal); } } else { pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; pSen->SenErrFlag = SK_SEN_ERR_FAULTY; SK_I2C_STOP(IoC); /* Increment Current sensor and set appropriate Timeout */ pAC->I2c.CurrSens++; if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) { pAC->I2c.CurrSens = 0; Time = SK_I2C_TIM_LONG; } else { Time = SK_I2C_TIM_SHORT; } /* Start Timer */ ParaLocal.Para64 = (SK_U64)0; pAC->I2c.TimerMode = SK_TIMER_NEW_GAUGING; SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time, SKGE_I2C, SK_I2CEV_TIM, ParaLocal); } break; case SK_I2CEV_CLEAR: for (i = 0; i < SK_MAX_SENSORS; i++) { pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK; pAC->I2c.SenTable[i].SenErrCts = 0; pAC->I2c.SenTable[i].SenWarnCts = 0; pAC->I2c.SenTable[i].SenBegErrTS = 0; pAC->I2c.SenTable[i].SenBegWarnTS = 0; pAC->I2c.SenTable[i].SenLastErrTrapTS = (SK_U64)0; pAC->I2c.SenTable[i].SenLastErrLogTS = (SK_U64)0; pAC->I2c.SenTable[i].SenLastWarnTrapTS = (SK_U64)0; pAC->I2c.SenTable[i].SenLastWarnLogTS = (SK_U64)0; } break; default: SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG); } return(0); } /* SkI2cEvent*/