/* * Start a high level software timer */ void SkTimerStart( SK_AC *pAC, /* Adapters context */ SK_IOC Ioc, /* IoContext */ SK_TIMER *pTimer, /* Timer Pointer to be started */ SK_U32 Time, /* Time Value (in microsec.) */ SK_U32 Class, /* Event Class for this timer */ SK_U32 Event, /* Event Value for this timer */ SK_EVPARA Para) /* Event Parameter for this timer */ { SK_TIMER **ppTimPrev; SK_TIMER *pTm; SK_U32 Delta; SkTimerStop(pAC, Ioc, pTimer); pTimer->TmClass = Class; pTimer->TmEvent = Event; pTimer->TmPara = Para; pTimer->TmActive = SK_TRUE; if (!pAC->Tim.StQueue) { /* first Timer to be started */ pAC->Tim.StQueue = pTimer; pTimer->TmNext = 0; pTimer->TmDelta = Time; SkHwtStart(pAC, Ioc, Time); return; } /* timer correction */ timer_done(pAC, Ioc, 0); /* find position in queue */ Delta = 0; for (ppTimPrev = &pAC->Tim.StQueue; (pTm = *ppTimPrev); ppTimPrev = &pTm->TmNext ) { if (Delta + pTm->TmDelta > Time) { /* the timer needs to be inserted here */ break; } Delta += pTm->TmDelta; } /* insert in queue */ *ppTimPrev = pTimer; pTimer->TmNext = pTm; pTimer->TmDelta = Time - Delta; if (pTm) { /* there is a next timer: correct its Delta value */ pTm->TmDelta -= pTimer->TmDelta; } /* restart with first */ SkHwtStart(pAC, Ioc, pAC->Tim.StQueue->TmDelta); }
/* * Start a high level software timer */ void SkTimerStart( SK_AC *pAC, /* Adapters context */ SK_IOC Ioc, /* IoContext */ SK_TIMER *pTimer, /* Timer Pointer to be started */ SK_U32 Time, /* Time value */ SK_U32 Class, /* Event Class for this timer */ SK_U32 Event, /* Event Value for this timer */ SK_EVPARA Para) /* Event Parameter for this timer */ { SK_TIMER **ppTimPrev ; SK_TIMER *pTm ; SK_U32 Delta ; Time /= 16 ; /* input is uS, clock ticks are 16uS */ if (!Time) Time = 1 ; SkTimerStop(pAC,Ioc,pTimer) ; pTimer->TmClass = Class ; pTimer->TmEvent = Event ; pTimer->TmPara = Para ; pTimer->TmActive = SK_TRUE ; if (!pAC->Tim.StQueue) { /* First Timer to be started */ pAC->Tim.StQueue = pTimer ; pTimer->TmNext = 0 ; pTimer->TmDelta = Time ; SkHwtStart(pAC,Ioc,Time) ; return ; } /* * timer correction */ timer_done(pAC,Ioc,0) ; /* * find position in queue */ Delta = 0 ; for (ppTimPrev = &pAC->Tim.StQueue ; (pTm = *ppTimPrev) ; ppTimPrev = &pTm->TmNext ) { if (Delta + pTm->TmDelta > Time) { /* Position found */ /* Here the timer needs to be inserted. */ break ; } Delta += pTm->TmDelta ; } /* insert in queue */ *ppTimPrev = pTimer ; pTimer->TmNext = pTm ; pTimer->TmDelta = Time - Delta ; if (pTm) { /* There is a next timer * -> correct its Delta value. */ pTm->TmDelta -= pTimer->TmDelta ; } /* * start new with first */ SkHwtStart(pAC,Ioc,pAC->Tim.StQueue->TmDelta) ; }
/* * 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*/