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

📄 eth_ctl.c

📁 华为 HI3510 BOOTLOADER HIBOOT 源码包
💻 C
📖 第 1 页 / 共 5 页
字号:
		return 0;	}	pu32Filter = (UINT32 *) ETH_FLT_TAB(u32Index);	*pu32Filter++ = u32MACLow;	*pu32Filter++ = u32MACMiddle;	*pu32Filter++ = u32MACHigh;	return 1;}/*======================================================================= *  函数名称:UINT32 ETH_ReadMACFiltFormContent(In UINT32 u32Index, In UINT32 u32MACLow, In UINT32 u32MACMiddle, In UINT32 u32MACHigh)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:读MAC过滤表内容 *  输入参数:u32Index->添加内容索引,u32MACLow->MAC低16位,u32MACMiddle->MAC中16位,u32MACHigh->MAC高16位 *  输出参数: *  返回类型:  return 0->reset fail; return 1->reset success. *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/UINT32 ETH_ReadMACFiltFormContent(In UINT32 u32Index, Out UINT32 *pu32MACLow, Out UINT32 *pu32MACMiddle, Out UINT32 *pu32MACHigh)  {	UINT32  *pu32Filter;	if (u32Index > 20)	{		return 0;	}	pu32Filter = (UINT32 *) ETH_FLT_TAB(u32Index);	*pu32MACLow = *pu32Filter++;	*pu32MACMiddle = *pu32Filter++;	*pu32MACHigh = *pu32Filter;	return 1;}/*======================================================================= *  函数名称:void ETH_SetMACInFiltCtrl(In UINT32 u32ReceiveCtrl)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:MAC过滤表表内过滤控制。0-20表示对应的21个表项,1表示接收,0表示丢弃 *  输入参数: *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/void ETH_SetInMACFiltCtrl(In UINT32 u32ReceiveCtrl)  {	Set_FrameFilt_U MACFiltCtrl;	MACFiltCtrl.w32 = *(UINT32 *) ETH_GLB_REG(5);	MACFiltCtrl.bits.intab_ctrl = u32ReceiveCtrl;	*(UINT32 *) ETH_GLB_REG(5) = MACFiltCtrl.w32;}/*======================================================================= *  函数名称:void ETH_SetMACFiltCtrlGroup(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:目的MAC组播帧接收控制 *  输入参数:u32CtrlEnable:控制使能;1->控制有效,0->控制无效;u32ReceiveCtrl:1->接收、0->丢弃控制 *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/void ETH_SetMACFiltCtrlGroup(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)  {	Set_FrameFilt_U MACFiltCtrl;	MACFiltCtrl.w32 = *(UINT32 *) ETH_GLB_REG(5);	MACFiltCtrl.bits.multi_en = u32CtrlEnable;	MACFiltCtrl.bits.multi_ctrl = u32ReceiveCtrl;	*(UINT32 *) ETH_GLB_REG(5) = MACFiltCtrl.w32;}/*======================================================================= *  函数名称:void ETH_SetMACFiltCtrlSingle(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:目的MAC单播帧接收控制 *  输入参数:u32CtrlEnable:控制使能;1->控制有效,0->控制无效;u32ReceiveCtrl:1->接收、0->丢弃控制 *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/void ETH_SetMACFiltCtrlSingle(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)  {	Set_FrameFilt_U MACFiltCtrl;	MACFiltCtrl.w32 = *(UINT32 *) ETH_GLB_REG(5);	MACFiltCtrl.bits.uni_en = u32CtrlEnable;	MACFiltCtrl.bits.uni_ctrl = u32ReceiveCtrl;	*(UINT32 *) ETH_GLB_REG(5) = MACFiltCtrl.w32;}/*======================================================================= *  函数名称:void ETH_SetMACFiltCtrlBroadcast(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:目的MAC广播帧接收控制 *  输入参数:u32CtrlEnable:控制使能;1->控制有效,0->控制无效;u32ReceiveCtrl:1->接收、0->丢弃控制 *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/void ETH_SetMACFiltCtrlBroadcast(In UINT32 u32CtrlEnable,In UINT32 u32ReceiveCtrl)  {	Set_FrameFilt_U MACFiltCtrl;	MACFiltCtrl.w32 = *(UINT32 *) ETH_GLB_REG(5);	MACFiltCtrl.bits.broad_en = u32CtrlEnable;	MACFiltCtrl.bits.broad_ctrl = u32ReceiveCtrl;	*(UINT32 *) ETH_GLB_REG(5) = MACFiltCtrl.w32;}/*=======================================================================*							Receive and Transmit Frame*=======================================================================*//*======================================================================= *  函数名称:void ETH_ReadResendFrameDescribe(Out UINT32 *pu32ResendFrameDescribe)   *  初稿完成:2005/1/7    *  作    者:   *  函数功能:读取重传的帧描述子 *  输入参数: *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/void ETH_ReadResendFrameDescribe(Out UINT32 *pu32ResendFrameDescribe)  {	*pu32ResendFrameDescribe = *(UINT32 *) ETH_GLB_REG(17);}/*======================================================================= *  函数名称:UINT32 ETH_FrameReceive (Out UINT8 *pu8FrameReceiveData , Out UINT16 *pu16Length)  *  初稿完成:2005/1/8    *  作    者:   *  函数功能:完成的工作是CPU的收包功能。 *  输入参数:数据保存地址,一次接收的帧的个数 *  输出参数:返回1表示有包接收,返回0表示没有包接收 *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/UINT32 ETH_FrameReceive (Out UINT8 *pu8FrameReceiveData ,Out UINT16 *pu16Length) {	Frame_Describe_U ReadDescribEnInf;		UINT8 *pu8ReceiveFrameAddr;	UINT16 u16ReceiveFrameLength;	UINT16 i, u32Cnt = 1;	UINT32 u32ClearTheInterrupt = 0;		for (i = u32Cnt; i > 0; i --)	{	  	if (*(UINT32 *) ETH_GLB_REG(13) != 0)	    	{/*receive frame describe available*/			ReadDescribEnInf.w32 = *(UINT32 *) ETH_GLB_REG(12);			pu8ReceiveFrameAddr = (UINT8 *)(ReadDescribEnInf.w32 & 0xFFFFF800);			*pu16Length = (UINT16)ReadDescribEnInf.bits.fm_len;			u16ReceiveFrameLength = *pu16Length;			//dbg_info("Enter Frame Normal Receive.\r\n");			for(i=0;i<(u16ReceiveFrameLength + 3)/4;i++)			{				*(UINT32 *)(pu8FrameReceiveData+i*4) = *(UINT32 *)(pu8ReceiveFrameAddr+i*4);				//dbg_info("0x%8lx, ",*(UINT32 *)(pu8FrameReceiveData+i*4));			}	       		/*receive finish, set bit 0 as 1*/			*(UINT32 *) ETH_GLB_REG(13) = 0;	       		/*clear the interrupt status for not enter again*/			u32ClearTheInterrupt = *(UINT32 *) ETH_GLB_REG(0);			*((volatile UINT32 *) ETH_GLB_REG(0)) = (u32ClearTheInterrupt & (0xFFFFFFFF));	       					#ifdef ETHTest				dbg_info("Enter Frame Normal Receive.\r\n");			#endif			return 1;		}	}	return 0;	}/*======================================================================= *  函数名称:UINT32 ETH_FrameTransmit (In UINT32 u32FrameLen, In UINT32 *pu32FrameTransmitData)  *  初稿完成:2005/1/25    *  作    者:   *  函数功能:完成的工作是CPU的发包功能 *  输入参数:等待发送的帧。 *	 		 发送的形式,包括(发给下行口――1,上行口――2,广播帧――3) *			 待发送帧描述子 *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/UINT32 ETH_FrameTransmit (In UINT16 u16FrameLen, In UINT8 *pu8FrameTransmitData) {		Frame_Describe_U TransFrameDescribe;	Frame_OutAddr_U FrameOutTailAddr;		UINT8 *pu8TransmitFrameAddr;	UINT16 u16TransmitFrameLength;	UINT32 i, u32Count = 0;	TransFrameDescribe.bits.fm_len = u16FrameLen + 4;	FrameOutTailAddr.w32 = *(UINT32 *) ETH_GLB_REG(11);	dbg_info("Enter frame transmit!\n");	u32Count = 0;	while (u32Count < 10000)	{		FrameOutTailAddr.w32 = *(UINT32 *) ETH_GLB_REG(11);		if (FrameOutTailAddr.bits.tail_vld_out == 1)		{			TransFrameDescribe.bits.fm_head_addr = (*(UINT32 *) ETH_GLB_REG(15) + (FrameOutTailAddr.bits.tail_addr_out << 11)) >> 11;			pu8TransmitFrameAddr =(UINT8 *) ((UINT32) TransFrameDescribe.bits.fm_head_addr << 11);			u16TransmitFrameLength = u16FrameLen;				dbg_info("\nthe length is %d\n",u16FrameLen);						for (i = 0 ; i < u16TransmitFrameLength ; i++)			{				*(pu8TransmitFrameAddr+i) = *(pu8FrameTransmitData+ i);				dbg_info("0x%2x;",*(pu8TransmitFrameAddr + i));			}			//*(UINT32 *) ETH_GLB_REG( 8 ) = 1;			//dbg_info("the  FrameDescribe.w32 is 0x%8lx\r\n", TransFrameDescribe.w32);			//dbg_info("the glb reg 8 add is 0x%8x\r\n",(UINT32 *) ETH_GLB_REG( 8 ));			*(UINT32 *) ETH_GLB_REG( 8 ) = TransFrameDescribe.w32;			*(UINT32 *) ETH_GLB_REG( 9 ) = 1;			//*(UINT32 *)(0xA0020220) = FrameDescribe.w32;			//*((UINT32 *)(0xA0020224)) = 1;			break;		}		u32Count++;	}	dbg_info("the transmit ok!\r\n");	return 1;}/*test cpu continute add by tbb 20050609*/void TestCpuSentFrame(In UINT32 u32SendNumber,In UINT16 u16FrameLen, In UINT8 *pu8FrameTransmitData){	UINT32 i;	for (i = 0; i < u32SendNumber; i++)	{		ETH_FrameTransmit (u16FrameLen, pu8FrameTransmitData) ;	}}/*======================================================================= *  函数名称:UINT32 ETH_Interrupt_Init()  *  初稿完成:2005/1/18    *  作    者:   *  函数功能:定义ETH中断服务入口,以及可以打开中断使能 *  输入参数:无 *  输出参数: *  返回类型:  无 *  其他说明:  *  调用函数:  建议  *  主调函数:  建议 *========================================================================*/UINT32 ETH_Init(void){	ETH_SoftResetPort(1);	/*set endian: in small endian, out small endian*/	ETH_SetEndian(0x1,0x1);		/*set the phy chip extern address as 1*/	ETH_SetPHYExternAddress(0x1C);	/*set input and output queue extern address(input addr, output addr)*///	ETH_SetQueueAddress (0x2800000,0x2900000) ;	//ETH_SetQueueAddress (0xF7F00000,0xF7F80000) ;	ETH_SetQueueAddress ((_bss_end+0x1000-1)&(~0xFFF), ((_bss_end+0x1000-1)&(~0xFFF)) + 0x80000) ;	/*set the port mdio fetch from which root*/	/*set port mode fetch from cpu*/	ETH_SetPortStatusMode(0x2);	/*set port work mode as 10mbps, link enable,full duplex*/	ETH_SetSpeedLinkDuplexMode(0, 1, 0);		/*half duplex work mode, 10M work mode the first par must be 0*/	ETH_SetFrameConfiguration(0x0,96,0x1FFF);		/*full duplex work mode, 100M work mode the first par must be 0x3*/	//ETH_SetFrameConfiguration(0x3,96,0x1FFF);		ETH_ClearFrameQueue(1);	ETH_SetInterruptEnable(0x0);	ETH_ClearFrameQueue(1);	/*enable the receive frame interrupt*/	//ETH_SetInterruptEnable(0x1);	ETH_SetInterruptEnable(0x0);//	ETH_PhyWrite(0, 0x1200);	ETH_PhyWrite(0, 0x10);#if 0	    	semId_Nor	= semBCreate (SEM_Q_PRIORITY, SEM_EMPTY );	semId_Test = semBCreate (SEM_Q_PRIORITY, SEM_EMPTY );	/* spawn child tasks to exercise kernel routines */    	RecvTask = taskSpawn ("tRecvPacket", HIGH_PRI, VX_SUPERVISOR_MODE, 4000, 			   (FUNCPTR) ETH_RecvPacketTask, 0,0,0,0,0,0,0,0,0,0);	TESTTask = taskSpawn ("tTESTTask", HIGH_PRI_DIV, VX_SUPERVISOR_MODE, 4000, 			   (FUNCPTR) ETH_TestFrameTask, 0,0,0,0,0,0,0,0,0,0);	SendTask = taskSpawn ("tSendPacket", HIGH_PRI_DIV_AGE, VX_SUPERVISOR_MODE, 4000, 			   (F

⌨️ 快捷键说明

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