📄 fec__hdl.c
字号:
/************************************************************************/
/* */
/* */
/* (C) Copyright Bangyan Information Technology Ltd, 2000/9. */
/* All right reserved */
/* */
/* Author: Zhuguosheng */
/* */
/* Description: */
/* Driver Set - FEC Handle pecific routines. */
/* */
/* Routines */
/* */
/************************************************************************/
#include "PUB\PUB_INCL.H"
#include "DRVs\DRV860\PUB\NETCOMM.H" /* global defines */
#include "DRVs\DRV860\PUB\D860_PUB.H"
#include "DRVs\DRV860\PUB\MPC860.H" /* IMMR definitions and declarations */
#include "DRVs\DRV860\PUB\MASKS860.h" /* Global masks header file */
#include "FEC.H"
extern EPPC *quicc;
extern QUICC_BD FecRxBd[MAX_FEC_RX_BDS], FecTxBd[MAX_FEC_TX_BDS];
extern UI CurFecRxBd,CurFecTxBd;
extern VOID FecRecvDataHdl(UI len, VOID *buf);
extern NU_SEMAPHORE Semaphore_EthernetSend;
BOOL FecSendToBuf( UI buf_len, VOID *buffer )
{
UI i;
NU_Obtain_Semaphore(&Semaphore_EthernetSend, NU_SUSPEND);
i=CurFecTxBd;
if( (FecTxBd[i].status&TX_BD_R)==TX_BD_R ) //Ring full
{
NU_Release_Semaphore(&Semaphore_EthernetSend) ;
return FALSE;
}
else
{
FecTxBd[i].status |= (TX_BD_R | TX_BD_L | TX_BD_TC);
FecTxBd[i].length = buf_len;
memcpy( FecTxBd[i].buf, buffer, buf_len );
CurFecTxBd++;
if( CurFecTxBd==MAX_FEC_TX_BDS )
CurFecTxBd=0;
quicc->t_x_des_active = FEC_BD_ACTIVE;
NU_Release_Semaphore(&Semaphore_EthernetSend) ;
return TRUE;
}
}
VOID FecSendFrameComp(VOID)
{
}
VOID FecRecvFromBuf( VOID )
{
while( (FecRxBd[CurFecRxBd].status&RX_BD_E)!=RX_BD_E )
{
if( (FecRxBd[CurFecRxBd].status&RX_BD_LG)==RX_BD_LG )
{
}
if( (FecRxBd[CurFecRxBd].status&RX_BD_NO)==RX_BD_NO )
{
}
if( (FecRxBd[CurFecRxBd].status&RX_BD_SH)==RX_BD_SH )
{
}
if((FecRxBd[CurFecRxBd].status&RX_BD_CR)==RX_BD_CR )
{
}
if((FecRxBd[CurFecRxBd].status&RX_BD_OV)==RX_BD_OV )
{
}
if((FecRxBd[CurFecRxBd].status&RX_BD_TR)==RX_BD_TR )
{
}
if( ((FecRxBd[CurFecRxBd].status&RX_BD_LG)!=RX_BD_LG) &&
((FecRxBd[CurFecRxBd].status&RX_BD_NO)!=RX_BD_NO) &&
((FecRxBd[CurFecRxBd].status&RX_BD_SH)!=RX_BD_SH) &&
((FecRxBd[CurFecRxBd].status&RX_BD_CR)!=RX_BD_CR) &&
((FecRxBd[CurFecRxBd].status&RX_BD_OV)!=RX_BD_OV) &&
((FecRxBd[CurFecRxBd].status&RX_BD_TR)!=RX_BD_TR) )
{
/* ATTENTION!!! */
/* Send This Data To TCP/IP moduler. */
FecRecvDataHdl(FecRxBd[CurFecRxBd].length-4, FecRxBd[CurFecRxBd].buf);
FecRxBd[CurFecRxBd].status |= RX_BD_E;
FecRxBd[CurFecRxBd].length = 0;
CurFecRxBd++;
if( CurFecRxBd==MAX_FEC_RX_BDS )
CurFecRxBd=0;
}
}
}
VOID FecPollingEvtHdl( VOID )
{
UL sivec_ic;
UL fec_event;
UI fec_bd_status;
//Get FEC Event Register.
fec_event = quicc->t_ievent; /* Save off t_ievent */
if( fec_event!=0 )
{
if( (fec_event&T_IEVENT_HEARTBEATERROR)==T_IEVENT_HEARTBEATERROR )
{
quicc->t_ievent=T_IEVENT_HEARTBEATERROR;
}
if( (fec_event&T_IEVENT_BABBLINGRECEIVER)==T_IEVENT_BABBLINGRECEIVER )
{
quicc->t_ievent=T_IEVENT_BABBLINGRECEIVER;
}
if( (fec_event&T_IEVENT_BABBLINGTRANSMIT)==T_IEVENT_BABBLINGTRANSMIT )
{
quicc->t_ievent=T_IEVENT_BABBLINGTRANSMIT;
}
if( (fec_event&T_IEVENT_GRACEFULSTOPACK)==T_IEVENT_GRACEFULSTOPACK )
{
quicc->t_ievent=T_IEVENT_GRACEFULSTOPACK;
}
if( (fec_event&T_IEVENT_TRANSMITBUFINT)==T_IEVENT_TRANSMITBUFINT )
{
quicc->t_ievent=T_IEVENT_TRANSMITBUFINT;
}
if( (fec_event&T_IEVENT_RECEIVEBUFINT)==T_IEVENT_RECEIVEBUFINT )
{
quicc->t_ievent=T_IEVENT_RECEIVEBUFINT;
}
if( (fec_event&T_IEVENT_MIIINT)==T_IEVENT_MIIINT )
{
quicc->t_ievent=T_IEVENT_MIIINT;
}
if( (fec_event&T_IEVENT_ETHERNETBUSERROR)==T_IEVENT_ETHERNETBUSERROR )
{
quicc->t_ievent=T_IEVENT_ETHERNETBUSERROR;
}
if( (fec_event&T_IEVENT_TRANSMITFRAMEINT)==T_IEVENT_TRANSMITFRAMEINT )
{
quicc->t_ievent=T_IEVENT_TRANSMITFRAMEINT;
FecSendFrameComp();
}
if( (fec_event&T_IEVENT_RECEIVEFRAMEINT)==T_IEVENT_RECEIVEFRAMEINT )
{
quicc->t_ievent=T_IEVENT_RECEIVEFRAMEINT;
FecRecvFromBuf();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -