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

📄 iic.c

📁 driver wdk
💻 C
字号:
#include "ave2k.h"
#include "iic.h"
#include "ave2kregs.h"
#include "ave2kutil.h"
#define MCSETBIT(a) (((long)(a))<<16)|(a)
#define MCCLRBIT(a) ((long)(a))

int bIICError;
#define RETRYTIME	5
void OpenIIC(PDEVICE_EXTENSION pDE)
{
  Ave2kWriteRegister(pDE,MC1,MCSETBIT(EI2C));
  Ave2kWriteRegister(pDE,I2C_STATUS, 0x00); //Init. IIC's clock
}

void CloseIIC(PDEVICE_EXTENSION pDE)
{
  Ave2kWriteRegister(pDE,MC1,MCCLRBIT(EI2C));
}

void UploadI2c(PDEVICE_EXTENSION pDE)
{
  Ave2kWriteRegister(pDE,MC2,MCSETBIT(UPLD_IIC));
}

#define IIC_ATT_START 3
#define IIC_ATT_CONT  2
#define IIC_ATT_STOP  1
#define IIC_ATT_NOP   0
#define BUSY 1
#define MAKE_IIC_TRF(by2,by1,by0,at2,at1,at0) \
(((long)by2)<<24)|(((long)by1)<<16)|(((long)by0)<<8)|((at2)<<6)|((at1)<<4)|((at0)<<2)
int IICWrite(PDEVICE_EXTENSION pDE, unsigned char uAddr, unsigned char uSubAddr, unsigned char nByte)
{
	int i;
	for(i=0; i<RETRYTIME; i++){
		if(_IICWrite(pDE, uAddr, uSubAddr, nByte))
			return 1;
	}
	return 0;
}

int _IICWrite(PDEVICE_EXTENSION pDE, unsigned char uAddr, unsigned char uSubAddr, unsigned char nByte)
{
   unsigned char BYTE2,BYTE1,BYTE0;
   unsigned char ATTR2,ATTR1,ATTR0;
   ULONG dw;
   int i;
   bIICError=FALSE;
   BYTE2=uAddr;
   ATTR2=IIC_ATT_START;
   BYTE1=uSubAddr;
   ATTR1=IIC_ATT_CONT;
   BYTE0=nByte;
   ATTR0=IIC_ATT_STOP;
   dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
   Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
   UploadI2c(pDE);
   return WaitIICAck(pDE);
}
unsigned char IICRead(PDEVICE_EXTENSION pDE,unsigned char uAddr, unsigned char uSubAddr)
{
	int i;
	unsigned char cResult;
	for(i=0; i<RETRYTIME; i++){
		cResult=_IICRead(pDE, uAddr, uSubAddr);
		if(!bIICError)
			return cResult;
	}
	return 0xff;
}
unsigned char _IICRead(PDEVICE_EXTENSION pDE,unsigned char uAddr, unsigned char uSubAddr)
{
   unsigned char BYTE2,BYTE1,BYTE0;
   unsigned char ATTR2,ATTR1,ATTR0;
   ULONG dw;
   int i=0;
   bIICError=FALSE;
   BYTE2=uAddr;
   ATTR2=IIC_ATT_START;
   BYTE1=uSubAddr;
   ATTR1=IIC_ATT_CONT;
   BYTE0=uAddr|0x01;
   ATTR0=IIC_ATT_START;
   dw=Ave2kReadRegister(pDE,I2C_STATUS);
   dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
   Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
   UploadI2c(pDE);
   if(!WaitIICAck(pDE))
	   return 0xff;
   ATTR2=IIC_ATT_STOP;
   ATTR1=IIC_ATT_NOP;
   ATTR0=IIC_ATT_NOP;
   Ave2kWriteRegister(pDE,I2C_TRANSFER, (ATTR2<<6)|(ATTR1<<4)|(ATTR0<<2));
   UploadI2c(pDE);
   dw=WaitIICAck(pDE);
	if(!dw)
		return 0xff;
	else
   		return (unsigned char)((dw&0xff000000)>>24);
}
int WaitIICAck(PDEVICE_EXTENSION pDE)
{
	int i;
	ULONG dw;
	i=0;
	while(i<50){
		ave2kMicroDelay(pDE, 10);
		dw= Ave2kReadRegister(pDE,I2C_TRANSFER);
		if(!(dw&BUSY))
			break;
		if(dw&0x02){
			bIICError=TRUE;
			IICAbort(pDE);
			return 0;
		}
		i++;
	}
	if(i==50){
		bIICError=TRUE;
		IICAbort(pDE);
		return 0;
	}
	return dw;
}
int IICWriteEepromBlock(PDEVICE_EXTENSION pDE, int nOffset, int nWrite, PUCHAR pBuf)
{
	unsigned char buf[20];
	if(nWrite>16)
		return 0;
	buf[0]=(unsigned char)nOffset;
	memcpy(buf+1, pBuf, nWrite);
	return IICWriteBytes(pDE, IIC_SUB_EEP, nWrite+1, buf);
/*
	unsigned char BYTE2,BYTE1,BYTE0;
	unsigned char ATTR2,ATTR1,ATTR0;
	ULONG dw;
	int i;
	bIICError=FALSE;
	BYTE2=IIC_SUB_EEP;
	ATTR2=IIC_ATT_START;
	BYTE1=(unsigned char)nOffset;
	ATTR1=IIC_ATT_CONT;
	BYTE0=*pBuf++;
	if(nWrite==1)
		ATTR0=IIC_ATT_STOP;
	else
		ATTR0=IIC_ATT_CONT;
	dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
	Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
	UploadI2c(pDE);
	if(!WaitIICAck(pDE))
		return 0;
	nWrite--;
	while(nWrite>=3){
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_CONT;
		BYTE1=*pBuf++;
		ATTR1=IIC_ATT_CONT;
		BYTE0=*pBuf++;
		if(nWrite==3)
			ATTR0=IIC_ATT_STOP;
		else
			ATTR0=IIC_ATT_CONT;
		dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
		Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
		UploadI2c(pDE);
		if(!WaitIICAck(pDE))
			return 0;
		nWrite-=3;
	}
	if(nWrite==0)
		return 1;
	if(nWrite==2){
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_CONT;
		BYTE1=*pBuf++;
		ATTR1=IIC_ATT_STOP;
	}
	else{
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_STOP;
		BYTE1=0;
		ATTR1=IIC_ATT_NOP;
	}
	BYTE0=0;
	ATTR0=IIC_ATT_NOP;
	dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
	Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
	UploadI2c(pDE);
	if(!WaitIICAck(pDE))
		return 0;
	return 1;
	*/
}
int IICWriteBytes(PDEVICE_EXTENSION pDE, unsigned char bySub, int nWrite, unsigned char *pBuf)
{
	unsigned char BYTE2,BYTE1,BYTE0;
	unsigned char ATTR2,ATTR1,ATTR0;
	ULONG dw;
	int nRetry;
	BYTE2=bySub;
	ATTR2=IIC_ATT_START;
	BYTE1=*pBuf++;
	ATTR1=IIC_ATT_CONT;
	BYTE0=*pBuf++;
	if(nWrite<=2)
		ATTR0=IIC_ATT_STOP;
	else
		ATTR0=IIC_ATT_CONT;
	dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
	nRetry=RETRYTIME;
	while(1){
		Ave2kWriteRegister(pDE, I2C_TRANSFER, dw);
		UploadI2c(pDE);
		if(WaitIICAck(pDE))
			break;
		nRetry--;
		if(!nRetry)
			return 0;
	}
	nWrite-=2;
	while(nWrite>=3){
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_CONT;
		BYTE1=*pBuf++;
		ATTR1=IIC_ATT_CONT;
		BYTE0=*pBuf++;
		if(nWrite==3)
			ATTR0=IIC_ATT_STOP;
		else
			ATTR0=IIC_ATT_CONT;
		dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
		nRetry=RETRYTIME;
		while(1){
			Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
			UploadI2c(pDE);
			if(WaitIICAck(pDE))
				break;
			nRetry--;
			if(!nRetry)
				return 0;
		}
		nWrite-=3;
	}
	if(nWrite==0)
		return 1;
	if(nWrite==2){
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_CONT;
		BYTE1=*pBuf++;
		ATTR1=IIC_ATT_STOP;
	}
	else{
		BYTE2=*pBuf++;
		ATTR2=IIC_ATT_STOP;
		BYTE1=0;
		ATTR1=IIC_ATT_NOP;
	}
	BYTE0=0;
	ATTR0=IIC_ATT_NOP;
	dw=MAKE_IIC_TRF(BYTE2,BYTE1,BYTE0,ATTR2,ATTR1,ATTR0);
	nRetry=RETRYTIME;
	while(1){
		Ave2kWriteRegister(pDE,I2C_TRANSFER, dw);
		UploadI2c(pDE);
		if(WaitIICAck(pDE))
			break;
		nRetry--;
		if(!nRetry)
			return 0;
	}
	return 1;
}
void IICAbort(PDEVICE_EXTENSION pDE)
{
  unsigned long dw;
  dw= Ave2kReadRegister(pDE,I2C_STATUS);
  Ave2kWriteRegister(pDE,I2C_STATUS, 0x80);
  UploadI2c(pDE);
  dw= Ave2kReadRegister(pDE,I2C_STATUS);
  Ave2kWriteRegister(pDE,I2C_STATUS, 0x0);
  UploadI2c(pDE);
  dw= Ave2kReadRegister(pDE,I2C_STATUS);
  Ave2kWriteRegister(pDE,I2C_STATUS, 0x0);
  UploadI2c(pDE);
  dw= Ave2kReadRegister(pDE,I2C_STATUS);
}

void GetBoardInformation(PDEVICE_EXTENSION pDE)
{
	int i;
	ULONG SerialsNo=0;
	unsigned char vol;
	/*
	not support any more
	if(pDE->BoardVersion == REVA0){
		pDE->SerialsNo = 2000040000;
		pDE->VolumeControl = VOL_NONE;
		pDE->Compress = 1;
		pDE->Double = 0;
		pDE->VideoSourceSelect=1;
		return;
	}*/
	//else{//REVA1 and above
	vol = IICRead(pDE, IIC_SUB_EEP, EEPOFF_VOLUME);
	pDE->VolumeControl = vol&0x07;
	for(i=EEPOFF_SERIALNO; i<EEPOFF_SERIALNO+4; i++){
		SerialsNo <<= 8;
		SerialsNo |= IICRead(pDE, IIC_SUB_EEP, (UCHAR)i);
	}
	pDE->SerialsNo = SerialsNo;
	//}
	
	//single or double?
	if(pDE->BoardVersion < REVB2 || pDE->BoardVersion == REVD1)
		pDE->Double = 0;
	else
		pDE->Double = 1;
	//video source selectable?
	if(pDE->BoardVersion < REVB2)
		pDE->VideoSourceSelect=1;
	else
		pDE->VideoSourceSelect=0;
	//compress?
	if(pDE->BoardVersion == REVC2)
		pDE->Compress = 0;
	else
		pDE->Compress = 1;
	//Extra Functions: Audio monitor, mic/line select, alarm head?
	if(pDE->BoardVersion >= REVD1)
		pDE->ExtraFunctions = 1;
	else
		pDE->ExtraFunctions = 0;
	if(vol&0x80)
		pDE->ExtraFunctions |= 2;
}
int WriteUserInformation(PDEVICE_EXTENSION pDE, int nOffset, int nLength, char *pBuf)
{
	int nWrite;
	nOffset+=32;
	while(nLength>0){
		nWrite=16-nOffset%16;
		if(nLength<nWrite)
			nWrite=nLength;
		if(!IICWriteEepromBlock(pDE, nOffset, nWrite, pBuf))
			return 0;
		ave2kDelay(20000);
		nOffset+=nWrite;
		pBuf+=nWrite;
		nLength-=nWrite;
	}
	return 1;
}
int ReadUserInformation(PDEVICE_EXTENSION pDE, int nOffset, int nLength, char *pBuf)
{
	nOffset+=32;
	while(nLength>0){
		*pBuf++=IICRead(pDE, IIC_SUB_EEP, (UCHAR)nOffset++);
		nLength--;
	}
	return 1;
}

⌨️ 快捷键说明

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