📄 iic.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 + -