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

📄 ca6004.c

📁 miceteck_MPC860_BSP源码,基于VXWORK
💻 C
📖 第 1 页 / 共 3 页
字号:
/* 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 + -