📄 eth_ctl.c
字号:
/************************************************************************ * * * SF_CTL.C * * * * Project Code: SD592 SF * * Create Date: 2005/1/5 * * Author: tangbenbing * * Modify Date: 2005/5/5 * * Document: * * Function: * * Others: * *----------------------------------------------------------------------* * * * Copyright 2005-20** SD592 Team HuaWei Tech, Inc. * * ALL RIGHTS RESERVED * * * *----------------------------------------------------------------------* ************************************************************************///#include "stdio.h"//#include "stdlib.h"#include <config.h>#include "ETH_TypeDef.h"#include "ETH_Reg.h"#include "ETH_Struct.h"#ifdef Vxworks#include "vxWorks.h"#include "config.h"#include "intLib.h"#include "semLib.h"#include "taskLib.h"#include "logLib.h"#endif/*=======================================================================* GLB REG**=======================================================================*//*======================================================================= * 函数名称:void ETH_SetInterruptEnable(In UINT32 u32InterruptEn) * 初稿完成:2005/1/7 * 作 者: * 函数功能:通过配置寄存器,使能/禁止CPU的中断类型 * 输入参数:中断使能/禁止控制值 * 每个Bit代表一种中断类型的使能控制,0-中断禁止、1-中断使能)。 * bit0 : ETH有帧等待CPU接收 * bit1: ETH发送完来自CPU的一帧数据指示 * bit2: ETH有空间接收来自CPU的帧 * bit3: ETH连接状态变化中断 * bit4: ETH速度模式变化中断 * bit5: ETH双工模式变化中断 * bit6: MDIO完成CPU操作指示 * bit7: 总线操作出错指示中断信号 * bit8: 重传次数超限指示 * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/void ETH_SetInterruptEnable(In UINT32 u32InterruptEn){ //CPU_Int_U SetInterruptEn; //SetInterruptEn.w32 = (u32InterruptEn & 0x1FF); //*(UINT32 *) ETH_GLB_REG(1) = SetInterruptEn.w32; *(UINT32 *) ETH_GLB_REG(1) = (u32InterruptEn & 0x1FF);}/*======================================================================= * 函数名称:UINT32 ETH_ReadInterruptEnable(Out UINT32 *pu32InterruptEnAddr) * 初稿完成:2005/1/7 * 作 者: * 函数功能:读中断配置寄存器,获取使能/禁止CPU的中断信息 * 输入参数:中断使能/禁止控制值 * 每个Bit代表一种中断类型的使能控制,0-中断禁止、1-中断使能)。 * bit0 : ETH有帧等待CPU接收 * bit1: ETH发送完来自CPU的一帧数据指示 * bit2: ETH有空间接收来自CPU的帧 * bit3: ETH连接状态变化中断 * bit4: ETH速度模式变化中断 * bit5: ETH双工模式变化中断 * bit6: MDIO完成CPU操作指示 * bit7: 总线操作出错指示中断信号 * bit8: 重传次数超限指示 * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_ReadInterruptEnable(Out UINT32 *pu32InterruptEnAddr){ CPU_Int_U SetInterruptEn; SetInterruptEn.w32 = *(UINT32 *) ETH_GLB_REG(1); *pu32InterruptEnAddr = SetInterruptEn.w32; return *pu32InterruptEnAddr;}/*======================================================================= * 函数名称:UINT32 ETH_ReadInterruptStatus(Out UINT32 *pu32InterruptMode) * 初稿完成:2005/1/7 * 作 者: * 函数功能:通过读取CPU对应的中断向量表寄存器,可以判断和相应中断类型 * 输入参数:读取中断类型寄存器 * 每个Bit代表一种中断类型的使能控制,0-中断禁止、1-中断使能) * bit0 : ETH有帧等待CPU接收 * bit1: ETH发送完来自CPU的一帧数据指示 * bit2: ETH有空间接收来自CPU的帧 * bit3: ETH连接状态变化中断 * bit4: ETH速度模式变化中断 * bit5: ETH双工模式变化中断 * bit6: MDIO完成CPU操作指示 * bit7: 总线操作出错指示中断信号 * bit8: 重传次数超限指示 * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_ReadInterruptStatus(Out UINT32 *pu32InterruptMode){ CPU_Int_U ReadInterrupt; ReadInterrupt.w32 = *(UINT32 *) ETH_GLB_REG(0); *pu32InterruptMode = ReadInterrupt.w32; /*read clear the status*/ //*(UINT32 *) ETH_GLB_REG(0) = ((ReadInterrupt.w32) & (0x1FF)); return *pu32InterruptMode;}/*======================================================================= * 函数名称:UINT32 ETH_ClearInterruptStatus(Out UINT32 *pu32InterruptMode) * 初稿完成:2005/1/7 * 作 者: * 函数功能:通过读取CPU对应的中断向量表寄存器,可以判断和相应中断类型 * 输入参数:读取中断类型寄存器 * 每个Bit代表一种中断类型的使能控制,0-中断禁止、1-中断使能) * bit0 : ETH有帧等待CPU接收 * bit1: ETH发送完来自CPU的一帧数据指示 * bit2: ETH有空间接收来自CPU的帧 * bit3: ETH连接状态变化中断 * bit4: ETH速度模式变化中断 * bit5: ETH双工模式变化中断 * bit6: MDIO完成CPU操作指示 * bit7: 总线操作出错指示中断信号 * bit8: 重传次数超限指示 * 输出参数: * 返回类型: return 1->soft reset ok; return 0->soft reset fail. * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_ClearInterruptStatus(In UINT32 u32InterruptClear){ CPU_Int_U ReadInterrupt; ReadInterrupt.w32 = *(UINT32 *) ETH_GLB_REG(0); /*read clear the status*/ *(UINT32 *) ETH_GLB_REG(0) = ((ReadInterrupt.w32) & (u32InterruptClear)); if ((u32InterruptClear & (*(UINT32 *) ETH_GLB_REG(0))) == 0) { return 1; } return 0;}/*======================================================================= * 函数名称:void ETH_SetNormalInterruptStyle(In UINT32 u32InterruptNorChoi) * 初稿完成:2005/1/7 * 作 者: * 函数功能:配置CPU必须响应的普通中断类型 * 输入参数:配置值(每个Bit代表一种中断类型的使能控制,0-中断禁止、1-中断使能) * bit0 : ETH有帧等待CPU接收 * bit1: ETH发送完来自CPU的一帧数据指示 * bit2: ETH有空间接收来自CPU的帧 * bit3: ETH连接状态变化中断 * bit4: ETH速度模式变化中断 * bit5: ETH双工模式变化中断 * bit6: MDIO完成CPU操作指示 * bit7: 总线操作出错指示中断信号 * bit8: 重传次数超限指示 * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/void ETH_SetNormalInterruptStyle(In UINT32 u32InterruptNorChoi){// CPU_Int_U SetCPUInterrNor;// SetCPUInterrNor.w32 = u32InterruptNorChoi;// *(UINT32 *) ETH_GLB_REG(2) = SetCPUInterrNor.w32; *(UINT32 *) ETH_GLB_REG(2) = (u32InterruptNorChoi & 0x1FF);}/*======================================================================= * 函数名称:UINT32 ETH_ReadSoftResetFinishFlag (Out UINT32 *pu32ResetFiniInf) * 初稿完成:2005/1/8 * 作 者: * 函数功能:读取ETH软复位之后硬件初始化完成的指示标志位,以便于确定是否可以做相应操作 * 输入参数: * 输出参数:return 1->soft reset ok; return 0->soft reset fail. * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_ReadSoftResetFinishFlag (Out UINT32 *pu32ResetFiniInf){ Init_OnResetInf_U ReadResetFin; ReadResetFin.w32 = *(UINT32 *) ETH_GLB_REG(3); *pu32ResetFiniInf = ReadResetFin.w32; if ((ReadResetFin.w32 ^ 0x7) != 0) { return Failure; } else { return Success; }}/*======================================================================= * 函数名称:UINT32 ETH_SoftResetPort(In UINT32 u32PortReset) * 初稿完成:2005/1/6 * 作 者: * 函数功能:端口复位控制1-复位 * 输入参数: * 输出参数: * 返回类型: return 0->reset fail; return 1->reset success. * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_SoftResetPort(In UINT32 u32PortReset){ UINT16 u16Delay = 0; Port_Reset_U SoftReset; SoftReset.w32 = *(UINT32 *) ETH_MAC_REG(2); SoftReset.bits.reset_port = u32PortReset; *(UINT32 *) ETH_MAC_REG(2) = SoftReset.w32; for(u16Delay = 0 ; u16Delay < 5000 ; u16Delay ++) { if ((*(UINT32 *) ETH_GLB_REG(3) ^ 0x7) == 0) { return 1; } } return 0;}/*======================================================================= * 函数名称:void ETH_SetPortRMIIOrMII(In UINT32 u32MIIOrRMIIMode) * 初稿完成:2005/1/6 * 作 者: * 函数功能:设置端口与PHY之间RMII与MII接口模式选择(0-MII,1-RMII) * 输入参数: * RMII/MII模式 * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/void ETH_SetPortRMIIOrMII (In UINT32 u32MIIOrRMIIMode) { Set_RMII_Endian_U SetRMIIOrMII; SetRMIIOrMII.w32 = *(UINT32 *) ETH_GLB_REG(4); SetRMIIOrMII.bits.mode_rmii = u32MIIOrRMIIMode; *(UINT32 *) ETH_GLB_REG(4) = SetRMIIOrMII.w32;}/*======================================================================= * 函数名称:void ETH_SetEndian (In UINT32 u32InEndian, In UINT32 u32OutEndian) * 初稿完成:2005/1/6 * 作 者: * 函数功能:设置SDRAM的大小端模式,1-小端,0-大端 * 输入参数: * 输出参数: * 返回类型: 无 * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/void ETH_SetEndian (In UINT32 u32InEndian, In UINT32 u32OutEndian) { Set_RMII_Endian_U SetEndian; SetEndian.w32 = *(UINT32 *) ETH_GLB_REG(4); SetEndian.bits.in_endian = u32InEndian; SetEndian.bits.out_endian = u32OutEndian; *(UINT32 *) ETH_GLB_REG(4) = SetEndian.w32;}/*======================================================================= * 函数名称:void ETH_SetFrameQueueLength (In UINT32 u32InputLength, In UINT32 u32OutputLength) * 初稿完成:2005/1/6 * 作 者: * 函数功能:设置输入和输出队列长度,长度总和<= 32 * 输入参数: * 输出参数: * 返回类型: return 0->set fail; return 1->set success. * 其他说明: * 调用函数: 建议 * 主调函数: 建议 *========================================================================*/UINT32 ETH_SetFrameQueueLength (In UINT32 u32InputLength, In UINT32 u32OutputLength){ Set_FrameQueueLength_U SetFrameQueue; Set_CPUReadSpeLinDup_U SpeLinDupMode; if ( (u32InputLength == 0) || (u32OutputLength == 0) ) { //dbg_info("The length can not be 0!\n"); return 0; } if ( (u32InputLength + u32OutputLength) > 32 ) { //dbg_info("InputLength add OutputLength must smaller than 32!\n"); return 0; } /*for the queue can be set perfect, we must unlink the port first, and clear the queue frame*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -