⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ski2c.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 3 页
字号:
	return(0);}	/* SkI2cWait *//* * 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 *//* * writes a single byte or 4 bytes into the I2C device * * returns	0:	success *			1:	error */int SkI2cWrite(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* I/O Context */SK_U32	I2cData,	/* I2C Data to write */int		I2cDev,		/* I2C Device Address */int		I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */int		I2cReg,		/* I2C Device Register Address */int		I2cBurst)	/* I2C 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 I2C device * * returns	the word read */SK_U32 SkI2cRead(SK_AC	*pAC,		/* Adapter Context */SK_IOC	IoC,		/* I/O Context */int		I2cDev,		/* I2C Device Address */int		I2cDevSize, /* I2C Device Size (e.g. I2C_025K_DEV or I2C_2K_DEV) */int		I2cReg,		/* I2C Device Register Address */int		I2cBurst)	/* I2C 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 I2C 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 (I2C 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));    }	else {        return(0); /* no success */	}}	/* SkI2cReadSensor *//* * Do the Init state 0 initialization */static int SkI2cInit0(SK_AC	*pAC)	/* Adapter Context */{	int	i;	/* 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	for (i = 0; i < SK_MAX_SENSORS; i++) {		pAC->I2c.SenTable[i].SenDesc = "unknown";		pAC->I2c.SenTable[i].SenType = SK_SEN_UNKNOWN;		pAC->I2c.SenTable[i].SenThreErrHigh = 0;		pAC->I2c.SenTable[i].SenThreErrLow = 0;		pAC->I2c.SenTable[i].SenThreWarnHigh = 0;		pAC->I2c.SenTable[i].SenThreWarnLow = 0;		pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN;		pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_NONE;		pAC->I2c.SenTable[i].SenValue = 0;		pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_NOT_PRESENT;		pAC->I2c.SenTable[i].SenErrCts = 0;		pAC->I2c.SenTable[i].SenBegErrTS = 0;		pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE;		pAC->I2c.SenTable[i].SenRead = NULL;		pAC->I2c.SenTable[i].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_GEPORT *pPrt;	/* GIni Port struct pointer */	if (pAC->I2c.InitLevel != SK_INIT_DATA) {		/* ReInit not needed in I2C module */		return(0);	}    /* Set the Direction of I2C-Data Pin to IN */    SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR | I2C_DATA);    /* Check for 32-Bit Yukon with Low at I2C-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 = 5;		pPrt = &pAC->GIni.GP[0];		if (pAC->GIni.GIGenesis) {		if (pPrt->PhyType == SK_PHY_BCOM) {			if (pAC->GIni.GIMacsFound == 1) {				pAC->I2c.MaxSens += 1;			}			else {				pAC->I2c.MaxSens += 3;			}		}	}	else {		pAC->I2c.MaxSens += 3;	}		for (i = 0; i < pAC->I2c.MaxSens; i++) {		switch (i) {		case 0:			pAC->I2c.SenTable[i].SenDesc = "Temperature";			pAC->I2c.SenTable[i].SenType = SK_SEN_TEMP;			pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_TEMP_HIGH_ERR;			pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_TEMP_HIGH_WARN;			pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_TEMP_LOW_WARN;			pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_TEMP_LOW_ERR;			pAC->I2c.SenTable[i].SenReg = LM80_TEMP_IN;			break;		case 1:			pAC->I2c.SenTable[i].SenDesc = "Voltage PCI";			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_5V_HIGH_ERR;			pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_5V_HIGH_WARN;			pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_5V_LOW_WARN;			pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_5V_LOW_ERR;			pAC->I2c.SenTable[i].SenReg = LM80_VT0_IN;			break;		case 2:			pAC->I2c.SenTable[i].SenDesc = "Voltage PCI-IO";			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PCI_IO_5V_HIGH_ERR;			pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PCI_IO_5V_HIGH_WARN;			pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PCI_IO_3V3_LOW_WARN;			pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PCI_IO_3V3_LOW_ERR;			pAC->I2c.SenTable[i].SenReg = LM80_VT1_IN;			pAC->I2c.SenTable[i].SenInit = SK_SEN_DYN_INIT_PCI_IO;			break;		case 3:			pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC";			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VDD_HIGH_ERR;			pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VDD_HIGH_WARN;			pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VDD_LOW_WARN;			pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VDD_LOW_ERR;			pAC->I2c.SenTable[i].SenReg = LM80_VT2_IN;			break;		case 4:			if (pAC->GIni.GIGenesis) {				if (pPrt->PhyType == SK_PHY_BCOM) {					pAC->I2c.SenTable[i].SenDesc = "Voltage PHY A PLL";					pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;					pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;					pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;					pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;				}				else {					pAC->I2c.SenTable[i].SenDesc = "Voltage PMA";					pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;					pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;					pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;					pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;				}			}			else {				pAC->I2c.SenTable[i].SenDesc = "Voltage VAUX";				pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_VAUX_3V3_HIGH_ERR;				pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_VAUX_3V3_HIGH_WARN;				if (pAC->GIni.GIVauxAvail) {					pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_3V3_LOW_WARN;					pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_3V3_LOW_ERR;				}				else {					pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_VAUX_0V_WARN_ERR;					pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_VAUX_0V_WARN_ERR;				}			}			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenReg = LM80_VT3_IN;			break;		case 5:			if (pAC->GIni.GIGenesis) {				pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5";				pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;				pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;				pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;				pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;			}			else {				pAC->I2c.SenTable[i].SenDesc = "Voltage Core 1V5";				pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_CORE_1V5_HIGH_ERR;				pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_CORE_1V5_HIGH_WARN;				pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_CORE_1V5_LOW_WARN;				pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_CORE_1V5_LOW_ERR;			}			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenReg = LM80_VT4_IN;			break;		case 6:			if (pAC->GIni.GIGenesis) {				pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL";			}			else {				pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 3V3";			}			pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;			pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PLL_3V3_HIGH_ERR;			pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PLL_3V3_HIGH_WARN;			pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PLL_3V3_LOW_WARN;			pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PLL_3V3_LOW_ERR;			pAC->I2c.SenTable[i].SenReg = LM80_VT5_IN;			break;		case 7:			if (pAC->GIni.GIGenesis) {				pAC->I2c.SenTable[i].SenDesc = "Speed Fan";				pAC->I2c.SenTable[i].SenType = SK_SEN_FAN;				pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_FAN_HIGH_ERR;				pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_FAN_HIGH_WARN;				pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_FAN_LOW_WARN;				pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_FAN_LOW_ERR;				pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN;			}			else {				pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5";				pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;				pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_PHY_2V5_HIGH_ERR;				pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_PHY_2V5_HIGH_WARN;				pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_PHY_2V5_LOW_WARN;				pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_PHY_2V5_LOW_ERR;				pAC->I2c.SenTable[i].SenReg = LM80_VT6_IN;			}			break;		default:			SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW,				SKERR_I2C_E001, SKERR_I2C_E001MSG);			break;		}		pAC->I2c.SenTable[i].SenValue = 0;		pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK;		pAC->I2c.SenTable[i].SenErrCts = 0;		pAC->I2c.SenTable[i].SenBegErrTS = 0;		pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE;		pAC->I2c.SenTable[i].SenRead = SkLm80ReadSensor;		pAC->I2c.SenTable[i].SenDev = LM80_ADDR;	}#ifndef SK_DIAG	pAC->I2c.DummyReads = pAC->I2c.MaxSens;#endif /* !SK_DIAG */		/* Clear I2C 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 I2C 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);}	/* SkI2cInit2*//* * Initialize I2C devices *

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -