📄 sktwsi.c
字号:
} while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31); return(0);} /* SkI2cWait *//* * waits for a completion of a TWSI 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; SK_U32 IsTwsiReadyBit; pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; if (pSen->SenState == SK_SEN_IDLE) { return; } IsTwsiReadyBit = CHIP_ID_YUKON_2(pAC) ? Y2_IS_TWSI_RDY : IS_I2C_READY; 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 & IsTwsiReadyBit) == 0); pSen->SenState = SK_SEN_IDLE; return;} /* SkI2cWaitIrq *//* * writes a single byte or 4 bytes into the TWSI device * * returns 0: success * 1: error */int SkI2cWrite(SK_AC *pAC, /* Adapter Context */SK_IOC IoC, /* I/O Context */SK_U32 I2cData, /* TWSI Data to write */int I2cDev, /* TWSI Device Address */int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */int I2cReg, /* TWSI Device Register Address */int I2cBurst) /* TWSI Burst Flag */{ SK_OUT32(IoC, B2_I2C_DATA, I2cData); SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cDevSize, I2cReg, I2cBurst); return(SkI2cWait(pAC, IoC, I2C_WRITE));} /* SkI2cWrite*/#ifdef SK_DIAG/* * reads a single byte or 4 bytes from the TWSI device * * returns the word read */SK_U32 SkI2cRead(SK_AC *pAC, /* Adapter Context */SK_IOC IoC, /* I/O Context */int I2cDev, /* TWSI Device Address */int I2cDevSize, /* TWSI Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */int I2cReg, /* TWSI Device Register Address */int I2cBurst) /* TWSI Burst Flag */{ SK_U32 Data; SK_OUT32(IoC, B2_I2C_DATA, 0); SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cDevSize, I2cReg, I2cBurst); if (SkI2cWait(pAC, IoC, I2C_READ) != 0) { w_print("%s\n", SKERR_I2C_E002MSG); } SK_IN32(IoC, B2_I2C_DATA, &Data); return(Data);} /* SkI2cRead */#endif /* SK_DIAG *//* * read a sensor's value * * This function reads a sensor's value from the TWSI sensor chip. The sensor * is defined by its index into the sensors database in the struct pAC points * to. * Returns * 1 if the read is completed * 0 if the read must be continued (TWSI Bus still allocated) */int SkI2cReadSensor(SK_AC *pAC, /* Adapter Context */SK_IOC IoC, /* I/O Context */SK_SENSOR *pSen) /* Sensor to be read */{ if (pSen->SenRead != NULL) { return((*pSen->SenRead)(pAC, IoC, pSen)); } return(0); /* no success */} /* SkI2cReadSensor *//* * Do the Init state 0 initialization */static int SkI2cInit0(SK_AC *pAC) /* Adapter Context */{ int i; SK_SENSOR *pSen; /* Begin with first sensor */ pAC->I2c.CurrSens = 0; /* Begin with timeout control for state machine */ pAC->I2c.TimerMode = SK_TIMER_WATCH_SM; /* Set sensor number to zero */ pAC->I2c.MaxSens = 0;#ifndef SK_DIAG /* Initialize Number of Dummy Reads */ pAC->I2c.DummyReads = SK_MAX_SENSORS;#endif /* !SK_DIAG */ for (i = 0; i < SK_MAX_SENSORS; i++) { pSen = &pAC->I2c.SenTable[i]; pSen->SenDesc = "unknown"; pSen->SenType = SK_SEN_UNKNOWN; pSen->SenThreErrHigh = 0; pSen->SenThreErrLow = 0; pSen->SenThreWarnHigh = 0; pSen->SenThreWarnLow = 0; pSen->SenReg = LM80_FAN2_IN; pSen->SenInit = SK_SEN_DYN_INIT_NONE; pSen->SenValue = 0; pSen->SenErrFlag = SK_SEN_ERR_NOT_PRESENT; pSen->SenErrCts = 0; pSen->SenBegErrTS = 0; pSen->SenState = SK_SEN_IDLE; pSen->SenRead = NULL; pSen->SenDev = 0; } /* Now we are "INIT data"ed */ pAC->I2c.InitLevel = SK_INIT_DATA; return(0);} /* SkI2cInit0*//* * Do the init state 1 initialization * * initialize the following register of the LM80: * Configuration register: * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT * * Interrupt Mask Register 1: * - all interrupts are Disabled (0xff) * * Interrupt Mask Register 2: * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter. * * Fan Divisor/RST_OUT register: * - Divisors set to 1 (bits 00), all others 0s. * * OS# Configuration/Temperature resolution Register: * - all 0s * */static int SkI2cInit1(SK_AC *pAC, /* Adapter Context */SK_IOC IoC) /* I/O Context */{ int i; SK_U8 I2cSwCtrl; SK_SENSOR *pSen; if (pAC->I2c.InitLevel != SK_INIT_DATA) { /* Re-init not needed in TWSI module */ return(0); } if (pAC->GIni.GIChipId >= CHIP_ID_YUKON_EC_U) { /* No sensors on Yukon-EC, -ECU, -EX, -Supreme, -FE, -FE+. */ return(0); } /* Set the Direction of TWSI-Data Pin to IN */ SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA); /* Check for 32-Bit Yukon with Low at TWSI-Data Pin */ SK_I2C_GET_SW(IoC, &I2cSwCtrl); if ((I2cSwCtrl & I2C_DATA) == 0) { /* this is a 32-Bit board */ pAC->GIni.GIYukon32Bit = SK_TRUE; return(0); } /* Check for 64 Bit Yukon without sensors */ if (SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0) != 0) { return(0); } (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_1, 0); (void)SkI2cWrite(pAC, IoC, 0xffUL, LM80_ADDR, I2C_025K_DEV, LM80_IMSK_2, 0); (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_FAN_CTRL, 0); (void)SkI2cWrite(pAC, IoC, 0, LM80_ADDR, I2C_025K_DEV, LM80_TEMP_CTRL, 0); (void)SkI2cWrite(pAC, IoC, (SK_U32)LM80_CFG_START, LM80_ADDR, I2C_025K_DEV, LM80_CFG, 0); /* * MaxSens has to be updated here, because PhyType is not * set when performing Init Level 0 */ pAC->I2c.MaxSens = 8; for (i = 0; i < pAC->I2c.MaxSens; i++) { pSen = &pAC->I2c.SenTable[i]; switch (i) { case 0: pSen->SenDesc = "Temperature"; pSen->SenType = SK_SEN_TEMP; pSen->SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_TEMP_LOW_WARN; pSen->SenThreErrLow = SK_SEN_TEMP_LOW_ERR; pSen->SenReg = LM80_TEMP_IN; break; case 1: pSen->SenDesc = "Voltage PCI"; pSen->SenType = SK_SEN_VOLT; pSen->SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN; if (pAC->GIni.GIPciBus != SK_PEX_BUS) { pSen->SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN; pSen->SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR; } else { pSen->SenThreWarnLow = 0; pSen->SenThreErrLow = 0; } pSen->SenReg = LM80_VT0_IN; break; case 2: pSen->SenDesc = "Voltage PCI-IO"; pSen->SenType = SK_SEN_VOLT; pSen->SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN; if (pAC->GIni.GIPciBus != SK_PEX_BUS) { pSen->SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN; pSen->SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR; } else { pSen->SenThreWarnLow = 0; pSen->SenThreErrLow = 0; } pSen->SenReg = LM80_VT1_IN; pSen->SenInit = SK_SEN_DYN_INIT_PCI_IO; break; case 3: pSen->SenDesc = "Voltage VMAIN"; pSen->SenType = SK_SEN_VOLT; pSen->SenThreErrHigh = SK_SEN_VDD_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_VDD_LOW_WARN; pSen->SenThreErrLow = SK_SEN_VDD_LOW_ERR; pSen->SenReg = LM80_VT2_IN; break; case 4: pSen->SenDesc = "Voltage VAUX"; pSen->SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN; if (pAC->GIni.GIVauxAvail) { pSen->SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN; pSen->SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR; } else { pSen->SenThreErrLow = 0; pSen->SenThreWarnLow = 0; } pSen->SenType = SK_SEN_VOLT; pSen->SenReg = LM80_VT3_IN; break; case 5: if (CHIP_ID_YUKON_2(pAC)) { if (pAC->GIni.GIChipRev == CHIP_REV_YU_XL_A0) { pSen->SenDesc = "Voltage Core 1V3"; pSen->SenThreErrHigh = SK_SEN_CORE_1V3_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_CORE_1V3_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_CORE_1V3_LOW_WARN; pSen->SenThreErrLow = SK_SEN_CORE_1V3_LOW_ERR; } else { pSen->SenDesc = "Voltage Core 1V2"; pSen->SenThreErrHigh = SK_SEN_CORE_1V2_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_CORE_1V2_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_CORE_1V2_LOW_WARN; pSen->SenThreErrLow = SK_SEN_CORE_1V2_LOW_ERR; } } else { pSen->SenDesc = "Voltage Core 1V5"; pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; } pSen->SenType = SK_SEN_VOLT; pSen->SenReg = LM80_VT4_IN; break; case 6: if (CHIP_ID_YUKON_2(pAC)) { pSen->SenDesc = "Voltage PHY 1V5"; pSen->SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN; if (pAC->GIni.GIPciBus == SK_PEX_BUS) { pSen->SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN; pSen->SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR; } else { pSen->SenThreWarnLow = 0; pSen->SenThreErrLow = 0; } } else { pSen->SenDesc = "Voltage PHY 3V3"; pSen->SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN; pSen->SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR; } pSen->SenType = SK_SEN_VOLT; pSen->SenReg = LM80_VT5_IN; break; case 7: pSen->SenDesc = "Voltage PHY 2V5"; pSen->SenType = SK_SEN_VOLT; pSen->SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR; pSen->SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN; pSen->SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN; pSen->SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR; pSen->SenReg = LM80_VT6_IN; break; default: SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW, SKERR_I2C_E001, SKERR_I2C_E001MSG); break; } pSen->SenValue = 0; pSen->SenErrFlag = SK_SEN_ERR_OK; pSen->SenErrCts = 0; pSen->SenBegErrTS = 0; pSen->SenState = SK_SEN_IDLE; if (pSen->SenThreWarnLow != 0) { pSen->SenRead = SkLm80ReadSensor; } pSen->SenDev = LM80_ADDR; }#ifndef SK_DIAG pAC->I2c.DummyReads = pAC->I2c.MaxSens;#endif /* !SK_DIAG */ /* Clear TWSI IRQ */ SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ); /* Now we are I/O initialized */ pAC->I2c.InitLevel = SK_INIT_IO; return(0);} /* SkI2cInit1 *//* * Init level 2: Start first sensor read. */static int SkI2cInit2(SK_AC *pAC, /* Adapter Context */SK_IOC IoC) /* I/O Context */{ int ReadComplete; SK_SENSOR *pSen; if (pAC->I2c.InitLevel != SK_INIT_IO) { /* ReInit not needed in TWSI module */ /* Init0 and Init2 not permitted */ return(0); } pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens]; ReadComplete = SkI2cReadSensor(pAC, IoC, pSen); if (ReadComplete) { SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG); } /* Now we are correctly initialized */ pAC->I2c.InitLevel = SK_INIT_RUN; return(0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -