📄 eth_ctl.c
字号:
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 + -