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

📄 hw_api.c

📁 在freescale 的ne64上开发的源代码
💻 C
📖 第 1 页 / 共 4 页
字号:
		locSpeedStat[1] = u16val;
	}	
}

void hwLfpRecover(void)
{
	if(locLFPChkDone == 1)
	{
		locLFPChkDone = 0;
		if(locPortStat[0] == 1)
			hwLfpSetPortStat(1, 1);
		if(locPortStat[1] == 1)
			hwLfpSetPortStat(2, 1);	
		LED_FEF = LED_OFF;
		init_timer(locLfpTimer,800);
	}
}

/*
 * Function:
 *   hwLfpMonitor()
 * Purpose:
 *   Monitor the local and remote link
 *   status and do the LFP config
 * Parameters:
 *   None.
 * Returns:
 *   None.
 * Notes:
 *   None.
 */
void hwLfpMonitor(void)
{	
	if(check_timer(locLfpTimer) != 0)
		return;

	/*if no LFP done, check LFP*/
	if(locLFPChkDone==0)
	{			
		if(locLFPen==1)
		{
			if(localOAMPort==8/*FX or FX2 port*/)
			{
				/*local FX link down-->Power down local TP*/
				if(locLink[1]==0)
				{
					/*Power down local TP-ethernet*/
					hwLfpSetPortStat(1, 0);
					locLFPChkDone = 1;
					locLFPChkPoint = 0;
					if(locFEFen==1)
						LED_FEF = LED_ON;
				}
				/*local TP link down*/
				else if(locLink[0]==0)
				{
					if(locFEFen==1)				
						hwLfpSetPortStat(2, 0);						
					locLFPChkPoint = 1;
					locLFPChkDone = 1;
				}
				/*remote TP link down && remote device exist*/
				else if((remoteDTEExist==1)&&(remoteTPLink==0))
				{
					/*Power down TP-ethernet*/
					hwLfpSetPortStat(1, 0);
					locLFPChkPoint = 2;
					locLFPChkDone = 1;
				}				
			}
			else
			{
				/*local FX2 link down-->Power down local FX1*/
				if(locLink[1]==0)
				{
					if(locFEFen==1)					
						hwLfpSetPortStat(1, 0);
					locLFPChkPoint = 0;
					locLFPChkDone = 1;
				}
				/*local FX1 link down*/
				else if(locLink[0]==0)
				{
					hwLfpSetPortStat(2, 0);
					locLFPChkPoint = 1;
					locLFPChkDone = 1;
					if(locFEFen==1)
						LED_FEF = LED_ON;
				}
				/*remote TP link down && remote device exist*/
				else if((remoteDTEExist==1)&&(remoteTPLink==0))
				{
					/*Power down TP-ethernet*/
					hwLfpSetPortStat(2, 0);
					locLFPChkPoint = 2;
					locLFPChkDone = 1;
				}
			}					
		}
	}
	/*check LFP done, recover LFP*/
	else
	{
		if(localOAMPort==8/*FX or FX2 port*/)
		{
			/*fault point:local FX*/
			if(locLFPChkPoint==0)
			{
				/*local FX link up,or LFP disable*/
				if((locLink[1]==1) || (locLFPen==0))
				{
					if(locPortStat[0]==1)
						hwLfpSetPortStat(1, 1);
					locLFPChkDone = 0;
					if(locFEFen==1)
						LED_FEF = LED_OFF;
				}
			}
			/*fault point:local TP*/
			else if(locLFPChkPoint==1)
			{
				/*FEF disable,or LFP disable,or local TP link up*/
				if((locLFPen==0)||(locLink[0]==1))
				{
					if(locFEFen==1)
					{
						if(locPortStat[1]==1)
							hwLfpSetPortStat(2, 1);
					}
					locLFPChkDone = 0;
				}
			}
			/*fault point:remote TP*/
			else if(locLFPChkPoint==2)
			{
				/*remote TP link up,or remote not exist,or remote FEF enable,or LFP disable*/
				if((remoteTPLink==1)||(remoteDTEExist==0)||(locLFPen==0))
				{
					if(locPortStat[0]==1)
						hwLfpSetPortStat(1, 1);
					locLFPChkDone = 0;
				}
			}
		}
		else
		{
			/*fault point:local FX2*/
			if(locLFPChkPoint==0)
			{
				/*local FX2 link up,or LFP disable*/
				if((locLink[1]==1) || (locLFPen==0))
				{
					if(locFEFen==1)
					{
						if(locPortStat[0]==1)
							hwLfpSetPortStat(1, 1);
					}
					locLFPChkDone = 0;
				}
			}
			/*fault point:local TP*/
			else if(locLFPChkPoint==1)
			{
				/*FEF disable,or LFP disable,or local TP link up*/
				if((locLFPen==0)||(locLink[0]==1))
				{
					if(locPortStat[1]==1)
						hwLfpSetPortStat(2, 1);
					locLFPChkDone = 0;
					if(locFEFen==1)
						LED_FEF = LED_OFF;
				}
			}
			/*fault point:remote TP*/
			else if(locLFPChkPoint==2)
			{
				/*remote TP link up,or remote not exist,or remote FEF enable,or LFP disable*/
				if((remoteTPLink==1)||(remoteDTEExist==0)||(locLFPen==0))
				{
					if(locPortStat[1]==1)
						hwLfpSetPortStat(2, 1);
					locLFPChkDone = 0;
				}
			}
		}
		if(locLFPChkDone==0)
			init_timer(locLfpTimer,800);
	}
}

/*
 * Function:
 *   hwMacAdd()
 * Purpose:
 *   Add a mac address to switch chip
 * Parameters:
 *   pbm  -- port bit map
 *   mac  -- mac address
 *   prio -- mac address priority
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwMacAdd(UINT16 pbm, UINT8 *mac, UINT8 prio)
{
	UINT16 regVal;
	UINT8 entryState,i;
	
	/*Wait until ATU is not BUSY*/
	regVal = 0x8000;
	while(regVal & 0x8000)
		MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, &regVal); 
	
	entryState = 0x0F; /*add static mac*/
	regVal = (entryState&0x0F) | ((pbm&0x07FF)<<4);
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_DATA_REG, regVal);
	for(i=0; i<3; i++)
	{
		regVal = ((*(mac+2*i)<<8) | (*(mac+2*i+1)));		
		MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_MAC_BASE+i, regVal);
	}
	MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, &regVal);
	regVal &= 0x0FFF;
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, regVal);

	MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, &regVal);
	regVal &= 0x08F0;
	regVal |= (0xB000 | ((prio&0x7)<<8));
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, regVal);

	return OK;
}

/*
 * Function:
 *   hwChipReset()
 * Purpose:
 *   Reset the 88E6095 and 88E1111
 * Parameters: 
 *   None. 
 * Returns:
 *   None.
 * Notes:
 *   None.
 */
void hwChipReset(void)
{
	UINT8 tmpTimer;

	tmpTimer = get_timer();
	init_timer(tmpTimer, 40);
	MCU_RST_OUT = 0;
	while(check_timer(tmpTimer) != 0);
	MCU_RST_OUT = 1;
	init_timer(tmpTimer, 40);
	while(check_timer(tmpTimer) != 0);
	free_timer(tmpTimer);
}

/*
 * Function:
 *   hwMacDel()
 * Purpose:
 *   Del a mac address from switch chip
 * Parameters: 
 *   mac  -- mac address 
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwMacDel(UINT8 *mac)
{
	UINT16 regVal;
	UINT8 entryState,i;
	
	/*wait until ATU is not busy*/
	regVal = 0x8000;
	while(regVal & 0x8000)
		MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, &regVal); 
	
	entryState = 0x0; /*del static mac*/
	regVal = (entryState & 0x0F);
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_DATA_REG, regVal);
	for(i=0;i<3;i++)
	{
		regVal = ((*(mac+2*i)<<8) | (*(mac+2*i+1)));		
		MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_MAC_BASE+i, regVal);
	}
	MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, &regVal);
	regVal &= 0x0FFF;
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_CONTROL, regVal);

	MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, &regVal);
	regVal &= 0x08F0;
	regVal |= 0xB000;
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_ATU_OPERATION, regVal);

	return OK;
}

void hwRunLedFlash(void)
{
	if(check_timer(locRunLedTimer) != 0)
		return;
	init_timer(locRunLedTimer, 66);
	locRunLedStat ^= 1;
	LED_FX_FX_RUN = locRunLedStat;
}

UINT8 hwIoInit(void)
{
	/*Enable digital input buffer to PTADx*/
	/*
	 *PAD0-1: hardware version
	 *PAD2: 1-TP<->FX converter; 0-FX<->FX
	 *PAD3: 1-TP auto enable; 0-diable
	 *PAD4: 1-TP full; 0-half
	 *PAD6-5: 11-TP 1000M; 01-100M; 10-10M
	 *PAD7: 1-LFP disable; 0-enable	
	 */
    ATDDIEN = 0xFF;
    
    /*FEF LED(Far end fault)*/
	DDRL_DDRL2 = 1; /*output*/
	PTL_PTL2 = 1;   /*turn off*/

	/*TP 1000M LED (RUN LED when two FX ports used)*/
	DDRL_DDRL4 = 1; /*output*/
	PTL_PTL4 = 1;   /*turn off*/
	
	/*FX1 powerdown control*/
	DDRL_DDRL1 = 1; /*output*/
	PTL_PTL1 = 1;   /*PowerUp*/
	
	/*FX2 powerdown control*/
	DDRL_DDRL3 = 1; /*output*/
	PTL_PTL3 = 1;   /*PowerUp*/
	
	/*MCU reset output*/
	DDRS_DDRS4 = 1; /*output*/
	PTS_PTS4 = 1;   /*normal state*/
   	
	/*DIP-switch input*/
	/*
	 *PT5: 1-FEF disable; 0-enable
	 *PT6: 1-FlowCtrl diable; 0-enable
	 *PT7: 1-FX port auto enable; 0-disable
	 */
	DDRT_DDRT5 = 0;   
	DDRT_DDRT6 = 0;   
	DDRT_DDRT7 = 0; 
}

/*
 * Function:
 *   hwInit()
 * Purpose:
 *   Init the hardware
 * Parameters: 
 *   None. 
 * Returns:
 *   OK or ERROR.
 * Notes:
 *   None.
 */
UINT8 hwInit(void)
{
	UINT16 regVal,index;
	UINT32 val;

	/*read the device type info*/

	if(DEVICE_TYPE == 1)
		localDTEType = OL100CR_X4X_V5; /*TP-FX converter*/
	else
		localDTEType = OL100CR_GE_V5;  /*FX-FX converter*/

	memset(locAutoCfg,1,sizeof(locAutoCfg));
	memset(locDuplexCfg,1,sizeof(locDuplexCfg));
	memset(locSpeedCfg,1000,sizeof(locSpeedCfg));
	memset(locLink,0,sizeof(locLink));
	memset(locDuplexStat,0,sizeof(locDuplexStat));
	memset(locSpeedStat,10,sizeof(locSpeedStat));
	memset(locPortStat,1,sizeof(locPortStat));
	memset(sysLog,0,SYS_LOG_MAX*24);
	
	localNoamPortLnkStat = 0;      
	localOamPortLnkFault = 1;
	localHWVersion = HW_VERSION;
		
	hwChipReset();
	
	/*read the 88E6095 Identifier, be sure it is up*/ 
	index=0;
	MIIread(SWITCH_PORT10_ADDRESS, QD_REG_SWITCH_ID, &regVal);
	while((regVal&0xFFF0)!=0x0950)
	{
		MIIread(SWITCH_PORT8_ADDRESS, QD_REG_SWITCH_ID, &regVal);
		index++;
		if(index > 60000)
			return ERROR;
	}

	/*read the 88E1111 Identifier, be sure it is up*/
	index=0;
	if(localDTEType == OL100CR_X4X_V5) 
	{   		
		disPPU(SWITCH_GLOBAL1_ADDRESS);
		MIIread(EXTL_PHY_ADDRESS, MII_PHY_ID0_REG, &regVal);
		while(regVal != 0x0141)
		{			
			MIIread(EXTL_PHY_ADDRESS, MII_PHY_ID0_REG, &regVal);
			index++;
			if(index > 60000)	
				return ERROR;
		}
		enPPU(SWITCH_GLOBAL1_ADDRESS);
	}

	/*set max packet len to 1632 bytes*/ 
	MIIread(SWITCH_GLOBAL1_ADDRESS, QD_REG_GLOBAL_CONTROL, &regVal);
	regVal |= 0x0400;
	MIIwrite(SWITCH_GLOBAL1_ADDRESS, QD_REG_GLOBAL_CONTROL, regVal);

	/*power down port 0-7 to save power*/
	disPPU(SWITCH_GLOBAL1_ADDRESS);
	for(index=0; index<8; index++)
	{
		MIIread(index, QD_PHY_CONTROL_REG, &regVal);
		regVal = (regVal | 0x0800);
		MIIwrite(index, QD_PHY_CONTROL_REG, regVal);
	}
	enPPU(SWITCH_GLOBAL1_ADDRESS);

	/*get port statistic to avoid 64_127 count tx pakts*/
	hwGetPortCounter(1,0,&val);
	hwGetPortCounter(2,0,&val);
		
	/*init MII port(port 9)*/
	/*set PHYDetect*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_STATUS, &regVal);
	regVal = (regVal | 0x1000);
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_STATUS, regVal);
	/*set forwarding*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, &regVal);
	regVal = (regVal | 0x0003);
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
	/*force link up,full duplex,100M*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PCS_CONTROL, &regVal);
	regVal |= (0x00FF);
	regVal &= (~0x0002);
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PCS_CONTROL, regVal);
	/*set Marvell_TAG*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, &regVal);
	regVal |= 0x0100;
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
	/*set CPU port*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, &regVal);
	regVal &=0xFFF0;
	regVal |= 0x0009;
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
	#if 1
	/*set vlan */
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, &regVal);
	regVal |= 0x0400;
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
	#endif
	/*set no forward unknown unicast pkts*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, &regVal);
	regVal &= (~0x0004);	
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL, regVal);
	
	/*set no forward unknown multicast pkts*/
	MIIread(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, &regVal);
	regVal &= (~0x0040);	
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
	
	/*set bcast egress broacast rate limit to 64k*/
	MIIwrite(SWITCH_PORT9_ADDRESS, QD_REG_EGRESS_RATE_CTRL, 0xffff);
	
	/*init FX or FX2 port(port 8)*/
	/*set PHYDetect*/
	MIIread(SWITCH_PORT8_ADDRESS, QD_REG_PORT_STATUS, &regVal);
	regVal = (regVal | 0x1000);
	MIIwrite(SWITCH_PORT8_ADDRESS, QD_REG_PORT_STATUS, regVal);
	/*set forwarding*/
	MIIread(SWITCH_PORT8_ADDRESS, QD_REG_PORT_CONTROL, &regVal);
	regVal = (regVal | 0x0003);
	MIIwrite(SWITCH_PORT8_ADDRESS, QD_REG_PORT_CONTROL, regVal);
	

	/*init TP or FX1 Port(port 10)*/
	/*set PHYDetect*/
	MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_STATUS, &regVal);
	regVal = (regVal | 0x1000);
	MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_STATUS, regVal);
	/*set forwarding*/
	MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL, &regVal);
	regVal = (regVal | 0x0003);
	MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL, regVal);
	#if 0
	/*set vlan */
	MIIread(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL2, &regVal);
	regVal |= 0x0400;
	MIIwrite(SWITCH_PORT10_ADDRESS, QD_REG_PORT_CONTROL2, regVal);
	#endif
	if(localDTEType == OL100CR_X4X_V5) 
	{
		/*init external phy 88E1111*/	  
		disPPU(SWITCH_GLOBAL1_ADDRESS);
		/*set PHY(88E1111) LED mode*/
		regVal = 0x2201;
		MIIwrite(EXTL_PHY_ADDRESS, MII_AUX_REG, regVal);
		/*disable phy copper/fiber auto-selection*/
		MIIread(EXTL_PHY_ADDRESS, MII_EXTN_STAT_REG, &regVal);
		regVal |= 0x8000;
		MIIwrite(EXTL_PHY_ADDRESS, MII_EXTN_STAT_REG, regVal);
		/*reset phy to update config*/
		MIIread(EXTL_PHY_ADDRESS, MII_CTRL_REG, &regVal);
		regVal |= MII_CTRL_RESET;
		MIIwrite(EXTL_PHY_ADDRESS, MII_CTRL_REG, regVal);
		enPPU(SWITCH_GLOBAL1_ADDRESS);
		delay(100);
   	}

	/*do dip-switch config*/
	if(localDTEType == OL100CR_X4X_V5)
	{
		if(DIP_TP_SPEED_CFG == DIP_TP_SPEED_1000)
			hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 1000);
		else if(DIP_TP_SPEED_CFG == DIP_TP_SPEED_100)
			hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 100);
		else
			hwSetPortCfg(1, DIP_TP_AUTO_EN, DIP_TP_DUPLEX_FULL, 10);

		localOAMPort = 8;
	}
	else
	{
		hwSetPortCfg(1, DIP_TP_AUTO_EN, 1, 1000);
		if(DIP_DOT3AH_FX2_PORT) 
			localOAMPort = 8;
		else
			localOAMPort = 10;

		LED_FX_FX_RUN = LED_ON;
	}
	hwSetPortCfg(2, DIP_FX_AUTO_EN, 1, 1000);
	hwSetPortFlowCtrl(1, !DIP_FLOW_CTRL_DISABLE);
	hwSetPortFlowCtrl(2, !DIP_FLOW_CTRL_DISABLE);
	hwSetLfp(!DIP_LFP_DISABLE);
	hwSetFef(!DIP_FEF_DISABLE);
	locLfpTimer = get_timer();
	init_timer(locLfpTimer, 100);
	locRunLedTimer = get_timer();
	init_timer(locRunLedTimer, 66);

	return OK;
}

⌨️ 快捷键说明

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