📄 ca6004.c
字号:
/* ca6004.c - ca6004 hardware access functions,called by main program */
/* ------- Copyright 2000-2003 AllOptic NetWorking Co.,Ltd --------- */
/***************************************************
DESCRIPTION:
GetCa6004State():读寄存器
SetCa6004Laser():设激光器状态
SetCa6004Switch():设交换端口状态
2003/3/20 ESTABLISHED BY TANG.
***************************************************/
#include "ca6004.h"
unsigned Pow1AlmLast=0,Pow2AlmLast=0,FibreAlmLast=0,OscAlmLast=0;
unsigned AlosAlmLast1=0,DlosAlmLast1=0,AfauAlmLast1=0,DfauAlmLast1=0;
unsigned AlosAlmLast2=0,DlosAlmLast2=0,AfauAlmLast2=0,DfauAlmLast2=0;
unsigned AlosAlmLast3=0,DlosAlmLast3=0,AfauAlmLast3=0,DfauAlmLast3=0;
unsigned AlosAlmLast4=0,DlosAlmLast4=0,AfauAlmLast4=0,DfauAlmLast4=0;
unsigned GetCa6004State(unsigned short RegNum) /* RegNum为寄存器号 */
{
unsigned Value=0,RetValue=0; /* RetValue低8位为寄存器值 */
unsigned BodInfo=0;
if((RegNum>=0)&(RegNum<=14))
{
switch( RegNum )
{
case CA6004_REG_BOD_INF:
RetValue = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
break;
case CA6004_REG_OT1_TYP:
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x80)
RetValue = ((*CA6004_POI_OT1_TYP&0xFF000000) >> 24);
else
RetValue = 0;
break;
case CA6004_REG_OT2_TYP:
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x40)
RetValue = ((*CA6004_POI_OT2_TYP&0xFF000000) >> 24);
else
RetValue = 0;
break;
case CA6004_REG_OT3_TYP:
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x20)
RetValue = ((*CA6004_POI_OT3_TYP&0xFF000000) >> 24);
else
RetValue = 0;
break;
case CA6004_REG_OT4_TYP:
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x10)
RetValue = ((*CA6004_POI_OT4_TYP&0xFF000000) >> 24);
else
RetValue = 0;
break;
case CA6004_REG_SYS_ALM:
Value = ((*CA6004_POI_SYS_ALM&0xFF000000) >> 24);
RetValue = Value;
if(((Value&0x80)^Pow1AlmLast)&Pow1AlmLast) RetValue |= 0x40;
if(((Value&0x20)^Pow2AlmLast)&Pow2AlmLast) RetValue |= 0x10;
if(((Value&0x08)^FibreAlmLast)&FibreAlmLast) RetValue |= 0x04;
Pow1AlmLast = (Value & 0x80);
Pow2AlmLast = (Value & 0x20);
FibreAlmLast = (Value & 0x08);
break;
case CA6004_REG_OT1_ALM:
Value = ((*CA6004_POI_OT1_ALM&0xFF000000) >> 24);
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x80)
{
RetValue = Value;
if(((Value&0x80)^AlosAlmLast1)&AlosAlmLast1) RetValue |= 0x08;
if(((Value&0x40)^DlosAlmLast1)&DlosAlmLast1) RetValue |= 0x04;
if(((Value&0x20)^AfauAlmLast1)&AfauAlmLast1) RetValue |= 0x02;
if(((Value&0x10)^DfauAlmLast1)&DfauAlmLast1) RetValue |= 0x01;
AlosAlmLast1 = (Value & 0x80);
DlosAlmLast1 = (Value & 0x40);
AfauAlmLast1 = (Value & 0x20);
DfauAlmLast1 = (Value & 0x10);
}
else RetValue = 0;
break;
case CA6004_REG_OT2_ALM:
Value = ((*CA6004_POI_OT2_ALM&0xFF000000) >> 24);
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x40)
{
RetValue = Value;
if(((Value&0x80)^AlosAlmLast2)&AlosAlmLast2) RetValue |= 0x08;
if(((Value&0x40)^DlosAlmLast2)&DlosAlmLast2) RetValue |= 0x04;
if(((Value&0x20)^AfauAlmLast2)&AfauAlmLast2) RetValue |= 0x02;
if(((Value&0x10)^DfauAlmLast2)&DfauAlmLast2) RetValue |= 0x01;
AlosAlmLast2 = (Value & 0x80);
DlosAlmLast2 = (Value & 0x40);
AfauAlmLast2 = (Value & 0x20);
DfauAlmLast2 = (Value & 0x10);
}
else RetValue = 0;
break;
case CA6004_REG_OT3_ALM:
Value = ((*CA6004_POI_OT3_ALM&0xFF000000) >> 24);
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x20)
{
RetValue = Value;
if(((Value&0x80)^AlosAlmLast3)&AlosAlmLast3) RetValue |= 0x08;
if(((Value&0x40)^DlosAlmLast3)&DlosAlmLast3) RetValue |= 0x04;
if(((Value&0x20)^AfauAlmLast3)&AfauAlmLast3) RetValue |= 0x02;
if(((Value&0x10)^DfauAlmLast3)&DfauAlmLast3) RetValue |= 0x01;
AlosAlmLast3 = (Value & 0x80);
DlosAlmLast3 = (Value & 0x40);
AfauAlmLast3 = (Value & 0x20);
DfauAlmLast3 = (Value & 0x10);
}
else RetValue = 0;
break;
case CA6004_REG_OT4_ALM:
Value = ((*CA6004_POI_OT4_ALM&0xFF000000) >> 24);
BodInfo = ((*CA6004_POI_BOD_INF&0xFF000000) >> 24);
if(BodInfo&0x10)
{
RetValue = Value;
if(((Value&0x80)^AlosAlmLast4)&AlosAlmLast4) RetValue |= 0x08;
if(((Value&0x40)^DlosAlmLast4)&DlosAlmLast4) RetValue |= 0x04;
if(((Value&0x20)^AfauAlmLast4)&AfauAlmLast4) RetValue |= 0x02;
if(((Value&0x10)^DfauAlmLast4)&DfauAlmLast4) RetValue |= 0x01;
AlosAlmLast4 = (Value & 0x80);
DlosAlmLast4 = (Value & 0x40);
AfauAlmLast4 = (Value & 0x20);
DfauAlmLast4 = (Value & 0x10);
}
else RetValue = 0;
break;
case CA6004_REG_OSC_ALM:
Value = ((*CA6004_POI_OSC_ALM&0xFF000000) >> 24);
RetValue = Value;
if(((Value&0x80)^OscAlmLast)&OscAlmLast) RetValue |= 0x40;
OscAlmLast = (Value & 0x80);
break;
case CA6004_REG_LAS_STA:
RetValue = ((*CA6004_POI_LAS_STA&0xFF000000) >> 24);
break;
case CA6004_REG_SWI_STA:
RetValue = ((*CA6004_POI_SWI_STA&0xFF000000) >> 24);
break;
case CA6004_REG_SYS_LED:
RetValue = ((*CA6004_POI_SYS_LED&0xFF000000) >> 24);
break;
case CA6004_REG_OTU_LED:
RetValue = ((*CA6004_POI_OTU_LED&0xFF000000) >> 24);
break;
}
}
else RetValue = 0xFF; /* 若出错,返回全1 */
return ( RetValue );
}
unsigned short SetCa6004Laser( unsigned short LASER_NUM,unsigned short STATE )
{
unsigned Buffer=0,Value=0;
if((LASER_NUM < 1)|(LASER_NUM > 4)|(STATE < 0)|(STATE > 1))
return( FALS );
switch( LASER_NUM ) /* 选择操作激光器 */
{
case 1:if(STATE == 0) /* 设为打开时 */
{
Buffer = (*CA6004_POI_LAS_STA & 0x7f000000); /* 将控制位设为0 */
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else /* 设为关断时 */
{
Buffer = (*CA6004_POI_LAS_STA | 0x80000000); /* 将控制位设为1 */
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
case 2:if(STATE == 0)
{
Buffer = (*CA6004_POI_LAS_STA & 0xbf000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else
{
Buffer = (*CA6004_POI_LAS_STA | 0x40000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
case 3:if(STATE == 0)
{
Buffer = (*CA6004_POI_LAS_STA & 0xdf000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else
{
Buffer = (*CA6004_POI_LAS_STA | 0x20000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
case 4:if(STATE == 0)
{
Buffer = (*CA6004_POI_LAS_STA & 0xef000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else
{
Buffer = (*CA6004_POI_LAS_STA | 0x10000000);
*CA6004_POI_LAS_STA = Buffer;
Value = *CA6004_POI_LAS_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
}
}
unsigned short SetCa6004Switch( unsigned short PORT_NUM,unsigned short STATE )
{
unsigned Buffer=0,Value=0;
if((PORT_NUM < 1)|(PORT_NUM > 3)|(STATE < 0)|(STATE > 1))
return( FALS );
switch( PORT_NUM ) /* 选择交换机端口 */
{
case 1:if(STATE == 0) /* 设为打开时 */
{
Buffer = (*CA6004_POI_SWI_STA & 0x7f000000); /* 将控制位设为0 */
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else /* 设为关断时 */
{
Buffer = (*CA6004_POI_SWI_STA | 0x80000000); /* 将控制位设为1 */
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
case 2:if(STATE == 0)
{
Buffer = (*CA6004_POI_SWI_STA & 0xbf000000);
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else
{
Buffer = (*CA6004_POI_SWI_STA | 0x40000000);
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
case 3:if(STATE == 0)
{
Buffer = (*CA6004_POI_SWI_STA & 0xdf000000);
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
else
{
Buffer = (*CA6004_POI_SWI_STA | 0x20000000);
*CA6004_POI_SWI_STA = Buffer;
Value = *CA6004_POI_SWI_STA;
if((Value&0xff000000) == (Buffer&0xff000000)) return( TRUE );else return( FALS );
}
break;
}
}
/***********AllOptic Networking***********/
/*
DESCRIPTION:
MPC860 parallel I/O application for OpticPower read,Eeprom read/write and GBIC read.
FUNCTIONS(these functions are shared by ca6004.c and ca6002.c):
I2CREAD() : 读KS8999'EERPROM
I2CWRITE() : 写KS8999'EERPROM
GbicRead() : 读GBIC'EEPROM
GetOptiPower() : 返回光功率A/D转换结果
GetGbicTemp() : 返回GBIC激光器工作温度
GetGbicCurrent() : 返回GBIC激光器偏置电流
GetGbicTxPower() : 返回GBIC激光器发送光功率
GetGbicRxPower() : 返回GBIC接收光功率
RST8999() : 复位KS8999
ConfigEE() : 配置KS8999的EERPROM
DogFeed() : 看门沟计数器清零
established by TANG in 6/25/2003
*/
/*#include <shareReg.h>*/
#include <math.h>
/*
Ks8999 eeprom read/write functions.
Read function:I2CREAD(),write function:I2CWRITE()
Hardware connection:I2CSDA -- PC8, I2CSCL -- PC7
*/
int immr,ack;
void I2Cinit(void)
{
immr = vxImmrGet();
*PCPAR(immr) &= 0xfe7f;
*PCDIR(immr) |= 0x0180;
*PCSO(immr) &= 0xfe7f;
*PCINT(immr) &= 0xfe7f;
*CIMR(immr) &= 0xfffff9ff;
/*
printf("Initial I2C line over.\n");
*/
}
void I2Cdisa(void)
{
immr = vxImmrGet();
*PCPAR(immr) &= 0xfe7f;
*PCDIR(immr) &= 0xfe7f;
*PCSO(immr) &= 0xfe7f;
*PCINT(immr) &= 0xfe7f;
*CIMR(immr) &= 0xfffff9ff;
/*
printf("Disable I2C line over.\n");
*/
}
void I2Cnop(cycle)
int cycle;
{
int i,j;
for(j=0;j<cycle;j++)
{
for(i=0;i<0x100;i++);
}
}
void I2Cstart(void)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -