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

📄 hw_api.c

📁 在freescale 的ne64上开发的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
 *   hwSetPortStat()
 * Purpose:
 *   Set port status
 * Parameters:
 *   port   -- port number,1-2
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwSetPortStat(UINT8 port, UINT8 enable)
{
	UINT8 portTmp;
	UINT16 regVal;
	
	if(portInvalid(port,&portTmp))
		return ERROR;

	if(locPortStat[port-1] == enable)
		return OK;
	
	locPortStat[port-1] = enable;
		
	if(localDTEType == OL100CR_X4X_V5)
	{
		if(portTmp == PORT_NUM_TP)
		{
			disPPU(SWITCH_GLOBAL1_ADDRESS);			
			MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, &regVal);
			if(enable)
				regVal &= (~MII_CTRL_PD);
			else				
				regVal |= MII_CTRL_PD;
			MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);			
			enPPU(SWITCH_GLOBAL1_ADDRESS);
			
			return OK;
		}
	}
	if(enable)
	{
		if(port==1)
			PWR_DOWN_FX1 = PWR_UP;
		else
			PWR_DOWN_FX2 = PWR_UP;
	}
	else
	{
		if(port==1)
			PWR_DOWN_FX1 = PWR_DOWN;
		else
			PWR_DOWN_FX2 = PWR_DOWN;
	}				
	return OK;
}

/*
 * Function:
 *   hwLfpSetPortStat()
 * Purpose:
 *   Set port LFP status
 * Parameters:
 *   port   -- port number,1-2
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwLfpSetPortStat(UINT8 port, UINT8 enable)
{
	UINT8 portTmp;
	UINT16 regVal;

	if(portInvalid(port,&portTmp))
		return ERROR;

	if(localDTEType == OL100CR_X4X_V5)
	{
		if(portTmp == PORT_NUM_TP)
		{
			disPPU(SWITCH_GLOBAL1_ADDRESS);			
			MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, &regVal);
			if(enable)
				regVal &= (~MII_CTRL_PD);
			else				
				regVal |= MII_CTRL_PD;
			MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);			
			enPPU(SWITCH_GLOBAL1_ADDRESS);
			
			return OK;
		}
	}
	if(enable)
	{
		if(port==1)
			PWR_DOWN_FX1 = PWR_UP;
		else
			PWR_DOWN_FX2 = PWR_UP;
	}
	else
	{
		if(port==1)
			PWR_DOWN_FX1 = PWR_DOWN;
		else
			PWR_DOWN_FX2 = PWR_DOWN;
	}				
	return OK;
}

/*
 * Function:
 *   hwGetPortStat()
 * Purpose:
 *   Get port status
 * Parameters:
 *   port   -- port number,1-2
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwGetPortStat(UINT8 port, UINT8 *enable)
{
	UINT8 portTmp;
 	if(portInvalid(port,&portTmp))
		return ERROR;
#if 1
	*enable = locPortStat[port-1];
	return OK;
#else
	if(localDTEType == OL100CR_X4X_V5)
	{
		if(portTmp == PORT_NUM_TP)
		{
			disPPU(SWITCH_GLOBAL1_ADDRESS);			
			MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, &regVal);
			if(regVal & MII_CTRL_PD)
				*enable = 0;
			else
				*enable = 1;
			MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);			
			enPPU(SWITCH_GLOBAL1_ADDRESS);
			
			return OK;
		}
	}

	if(port == 1)
	{
		if(PWR_DOWN_FX1 == PWR_UP)
			*enable = 1;
		else
			*enable = 0;
	}
	else
	{
		if(PWR_DOWN_FX2 == PWR_UP)
			*enable = 1;
		else
			*enable = 0;
	}
			
	return OK;
#endif
}

/*
 * Function:
 *   hwSetLfp()
 * Purpose:
 *   Set LFP config
 * Parameters:
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwSetLfp(UINT8 enable)
{
	if(enable)
		locLFPen = 1;
	else
		locLFPen = 0;
	return OK;
}

/*
 * Function:
 *   hwGetLfp()
 * Purpose:
 *   Get LFP config
 * Parameters:
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwGetLfp(UINT8 *enable)
{
	*enable = locLFPen;	
	return OK;
}

/*
 * Function:
 *   hwSetFef()
 * Purpose:
 *   Set FEF config
 * Parameters:
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwSetFef(UINT8 enable)
{
	UINT8 fefTmp;

	fefTmp = locFEFen;
	if(enable)
		locFEFen = 1;
	else
		locFEFen = 0;

	if(fefTmp!=locFEFen)
		hwLfpRecover();
		
	return OK;
}

/*
 * Function:
 *   hwGetFef()
 * Purpose:
 *   Get FEF config
 * Parameters:
 *   enable -- 1-enable;0-disable
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwGetFef(UINT8 *enable)
{
	*enable = locFEFen;
	return OK;
}

/*
 * Function:
 *   hwReboot()
 * Purpose:
 *   reboot
 * Parameters:
 *   None.
 * Returns:
 *   None.
 * Notes:
 *   None.
 */
void hwReboot()
{ 
	UINT16 temp,temp1; 
	for(temp=100;temp>0;temp--) 
	{
		MCU_RST_OUT = 1;
		for(temp1=30000;temp1>0;temp1--);
		MCU_RST_OUT = 1;
		for(temp1=30000;temp1>0;temp1--);
	} 
	__asm JMP 0xE800/*0x4000*/;
}

/*
 * Function:
 *   snmpTrapMonitor()
 * Purpose:
 *   monitor status
 * Parameters:
 *   None.
 * Returns:
 *   None.
 * Notes:
 *   None.
 */
 void snmpColdStartTrap(void)
{
	OBJ_ID_T trapOid;
	trapOid.component_list[0]=1;
   	trapOid.component_list[1]=3;
   	trapOid.component_list[2]=6;
	trapOid.component_list[3]=1;
   	trapOid.component_list[4]=4;
   	trapOid.component_list[5]=1;
  	trapOid.component_list[6]=3807;
   	trapOid.component_list[7]=1;
	trapOid.component_list[8]=100;
	trapOid.component_list[9]=100;
	trapOid.num_components=10;
	snmpSendTrap(&trapOid,1);
	
}
void snmpTrapMonitor()
{
	/*
		trap1----link up
		trap2----link down
		trap3----remote device found
		trap4----remote device lost
	*/
	OBJ_ID_T trapOid;
	trapOid.component_list[0]=1;
   	trapOid.component_list[1]=3;
   	trapOid.component_list[2]=6;
	trapOid.component_list[3]=1;
   	trapOid.component_list[4]=4;
   	trapOid.component_list[5]=1;
  	trapOid.component_list[6]=3807;
   	trapOid.component_list[7]=1;
	trapOid.component_list[8]=100;
	trapOid.component_list[9]=100;
	trapOid.num_components=10;
	if(trapPort1LinkUp==1)
	{
		snmpSendTrap(&trapOid,2);
		trapPort1LinkUp=0;
	}
	else if(trapPort1LinkDown==1) 
	{
		snmpSendTrap(&trapOid,3);
		trapPort1LinkDown=0;
	}
	else if(trapPort2LinkUp==1) 
	{	
		snmpSendTrap(&trapOid,4);
		trapPort2LinkUp=0;
	}
	else if(trapPort2LinkDown==1) 
	{
		snmpSendTrap(&trapOid,5);
		trapPort2LinkDown=0;
	}

}
/*
 * Function:
 *   hwGetPortLink()
 * Purpose:
 *   Get the port link status
 * Parameters:
 *   port -- port number,1-2
 *   link -- 1-link up;0-link down
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwGetPortLink(UINT8 port, UINT8 *link)
{
	UINT8 phyAddr,portTmp;
	UINT16 regVal;

	if(portInvalid(port,&portTmp))
		return ERROR;
#if 0	
	if(localDTEType == OL100CR_X4X_V5)
	{
		if(port == PORT_NUM_TP)
		{
			disPPU(SWITCH_GLOBAL1_ADDRESS);
			MIIread(EXTL_PHY_ADDRESS, PHY_REG_PSR, &regVal);
			enPPU(SWITCH_GLOBAL1_ADDRESS);
			if(regVal & 0x0400)
				*link = 1;
			else
				*link = 0;
		}
		else
		{
			phyAddr = port + 10;
			MIIread(phyAddr, QD_REG_PORT_STATUS, &regVal);		
			if(regVal & 0x0800)
				*link = 1;
			else
				*link = 0;
		}
	}
	else
	{
		phyAddr = port + 10;
		MIIread(phyAddr, QD_REG_PORT_STATUS, &regVal);
		if(regVal & 0x0800)
			*link = 1;
		else
			*link = 0;
	}
#else
	phyAddr = portTmp + 0x10;
	MIIread(phyAddr, QD_REG_PORT_STATUS, &regVal);
	if(regVal & QD_PORT_LINK_UP)
		*link = 1;
	else
		*link = 0;	
#endif
	return OK;
}

/*
 * Function:
 *   hwGetPortDplxSpd()
 * Purpose:
 *   Get the port duplex and speed status
 * Parameters:
 *   port -- port number,1-2
 *   dplx -- 1-full;0-half
 *   spd  -- 10/100/1000
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwGetPortDplxSpd(UINT8 port, UINT8 *dplx, UINT16 *spd)
{
	UINT8 phyAddr,portTmp;
	UINT16 regVal;

	if(portInvalid(port,&portTmp))
		return ERROR;

	phyAddr = portTmp + 0x10;
	MIIread(phyAddr, QD_REG_PORT_STATUS, &regVal);
	if(regVal & QD_PORT_DPLX_FULL)
		*dplx = 1;
	else
		*dplx = 0;

	switch(regVal & QD_PORT_SPDf)
	{
		case QD_PORT_SPD_1000:
			*spd = 1000;
			break;
		case QD_PORT_SPD_100:
			*spd = 100;
			break;
		default:
			*spd = 10;
			break;
	}	
	
	return OK;
}

void sysLogSet(UINT8 port, UINT8 stat)
{
	if(stat==1)
		sprintf(&sysLog[sysLogCurrent][0], "%dY%03dD%02dH%02dM%02dS-P%d UP", sysRunYear,sysRunDay,sysRunHour,sysRunMin,sysRunSec,port);
	else
		sprintf(&sysLog[sysLogCurrent][0], "%dY%03dD%02dH%02dM%02dS-P%d DOWN", sysRunYear,sysRunDay,sysRunHour,sysRunMin,sysRunSec,port);
	if(sysLogCurrent < (SYS_LOG_MAX-1))
		sysLogCurrent ++;
	else
		sysLogCurrent = 0;
}

/*
 * Function:
 *   hwGetLocStatus()
 * Purpose:
 *   Get the port status
 * Parameters:
 *   None.
 * Returns:
 *   None.
 * Notes:
 *   None.
 */
void hwGetLocStatus(void)
{
	UINT8 u8val;
	UINT16 u16val;

	if(gSnmpRebootFlag==1)
		hwReboot();
	if(gSnmpPort1Flag == 1)
	{
		hwSetPortCfg(1,locAutoCfg[0],locDuplexCfg[0],locSpeedCfg[0]);
		gSnmpPort1Flag = 0;
	}
	if(gSnmpPort2Flag == 1)
	{
		hwSetPortCfg(2,locAutoCfg[1],locDuplexCfg[1],locSpeedCfg[1]);
		gSnmpPort2Flag = 0;
	}
	if(gSnmpFlowCtrlFlag1 == 1)
	{
		hwSetPortFlowCtrl(1,bSnmpFlowCtrl1);
		gSnmpFlowCtrlFlag1 = 0;
	}
	if(gSnmpFlowCtrlFlag2 == 1)
	{
		hwSetPortFlowCtrl(2,bSnmpFlowCtrl2);
		gSnmpFlowCtrlFlag2 = 0;
	}
	/*get TP port status*/
	if(hwGetPortLink(1, &u8val)==OK)
	{
		if(localOAMPort==10/*TP or FX1*/)
			localOamPortLnkFault = (!u8val);
		else
			localNoamPortLnkStat = u8val;
		if(locLink[0]!=u8val)
		{
			if(u8val==1)
			{
				trapPort1LinkUp=1;
				sysLogSet(1, 1);
			}
			else
			{
				trapPort1LinkDown=1;
				sysLogSet(1, 0);
			}
		}
		locLink[0] = u8val;
		
	}	
	if(hwGetPortDplxSpd(1, &u8val, &u16val)==OK)
	{
		locDuplexStat[0] = u8val;
		locSpeedStat[0] = u16val;
	}
	
	/*get FX port status*/
	if(hwGetPortLink(2, &u8val)==OK)
	{
		if(localOAMPort==10/*TP or FX1*/)
			localNoamPortLnkStat = u8val;
		else
			localOamPortLnkFault = (!u8val);
		if(locLink[1]!=u8val)
		{
			if(u8val==1)
			{
				trapPort2LinkUp=1;
				sysLogSet(2, 1);
			}
			else
			{
				trapPort2LinkDown=1;
				sysLogSet(2, 0);
			}
		}
		locLink[1] = u8val;
	}
	if(hwGetPortDplxSpd(2, &u8val, &u16val)==OK)
	{
		locDuplexStat[1] = u8val;

⌨️ 快捷键说明

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