📄 ne64api.c
字号:
/*****************************************************************************
*
* File Name : ne64api.c
*
* DESCRIPTION : Defines higher level routines for the EMAC module
*
* Got from FREESCALE
* Modified by Houlei @2004.10.10 Tsinghua University
*****************************************************************************/
#include "MOTTYPES.h"
#include "etherinit.h"
#include "ethernet.h"
#include "ne64api.h"
#include "IO_Map.h"
extern tU16 ROMFileSize;
extern tU08 *ROMFile_Start;
extern tU08 Send_File_Flag;
extern unsigned char volatile *EthTxBuf;
extern eth_HwAddress sed_lclEthAddr;
extern in_HwAddress sin_lclINAddr;
extern tU16 myport;
extern udpsocket udp_socket;
#define RAM_START 0x2000 /**< RAM block starting address */
#if WORD_ACCESS
tU16 emacFIFOa[EMAC_RX_SZ/2] @ RAM_START; /**< Emac RX buffer A definition */
tU16 emacFIFOb[EMAC_RX_SZ/2] @ (RAM_START + EMAC_RX_SZ); /**< Emac RX buffer B definition */
tU16 emacFIFOtx[EMAC_TX_SZ/2] @ (RAM_START + 2*EMAC_RX_SZ); /**< Emac TX buffer definition */
#else
tU08 emacFIFOa[EMAC_RX_SZ] @ RAM_START; /**< Emac RX buffer A definition */
tU08 emacFIFOb[EMAC_RX_SZ] @ (RAM_START + EMAC_RX_SZ); /**< Emac RX buffer B definition */
tU08 emacFIFOtx[EMAC_TX_SZ] @ (RAM_START + 2*EMAC_RX_SZ); /**< Emac TX buffer definition */
#endif
extern tU08 activebuffer;
extern tU08 gotlink;
#if WORD_ACCESS
extern tU16 *rxa_pointer;
extern tU16 *rxb_pointer;
#else
extern tU08 *rxa_pointer;
extern tU08 *rxb_pointer;
#endif
extern tU08 *tx_pointer;
extern ethernet_frame received_frame;
extern ethernet_frame send_frame;
tU08 MIIwrite(tU08 _mpadr, tU08 _mradr, tU16 _mwdata) {
tU16 temprdata;
_DEBUGNL;_DEBUGT("-MIIWRITE-");
if (MCMST_BUSY)
{
_DEBUGT("-MII_BUSY ");
return 0; /* MII busy -> return with error */
}
MPADR=_mpadr;
_DEBUGC(MPADR);
MRADR=_mradr;
_DEBUGC(MRADR);
MWDATA=_mwdata;
MCMST_OP=MII_WRITE;
//Wait for MII write
while(!(IEVENT&0x0080));
IEVENT = IEVENT_MMCIF_MASK; /* Clear the flag in Emac */
while ( ! (MIIread(PHY_ADDRESS, PHY_REG_IR, &temprdata)) );
return 0xff; /* operation completed OK */
}
//===============================================
tU08 MIIread(tU08 _mpadr, tU08 _mradr, tU16 * _mrdata) {
_DEBUGNL;_DEBUGT("-MIIREAD-");
if (MCMST_BUSY)
{
_DEBUGT("-MII_BUSY ");
return 0; /* MII busy -> return with error */
}
MPADR=_mpadr;
MRADR=_mradr;
MCMST_OP=MII_READ;
while(!(IEVENT&0x0080));
*_mrdata = MRDATA;
IEVENT = IEVENT_MMCIF_MASK; /* Clear the flag in Emac */
_DEBUGT("DATA= "); _DEBUGI(*_mrdata); _DEBUGNL;
return 0xff; /* operation completed OK */
}
//===============================================
void EtherOpen(tU08 miisetup, /* mii preamble & clock setup */
tU08 bufmap, /* buffer configuration) */
tU16 maxfl, /* initial max.frame length for receive */
void * pmacad, /* pointer to MAC address definition */
tU08 control, /* the acceptance mask*/
tU16 etype, /* programmable ethertype (16bit value)*/
tU08 rxmode, /* reception mode settings */
tU08 netctl /* network control setup (see NETCT_X)*/
)
{
tU08 ctr;
tU16 * pIn;
tMACADStr * pInMAC = (tMACADStr *)&MACAD2;
_DEBUGT("EtherOpen(start)\n\r");
/* do EMAC software reset */
SWRST = SWRST_MACRST_MASK;
/* wait a while */
for (ctr=160; ctr >0; ctr--); //MODIFIDE BY ME 16\->160
/* setup MDC clock */
MCMST_MDCSEL=miisetup;
_DEBUGT("mdcsel=");_DEBUGC(MCMST_MDCSEL);
/* setup FIFO memory configuration */
BUFCFG_BUFMAP=bufmap;
_DEBUGT("; bufmap=");_DEBUGC(BUFCFG_BUFMAP);
/* setup max. reception frame length */
BUFCFG_MAXFL=maxfl;
_DEBUGT("; maxfl=");_DEBUGI(BUFCFG_MAXFL);
/* set hardware address */
_DEBUGT("\n\rMAC ADDR");
pIn=(tU16 *)pmacad;
for (ctr=0; ctr < sizeof(tMACADStr)/2; ctr++)
{
pInMAC->Word[ctr] = *pIn;
_DEBUGI(pInMAC->Word[ctr]); //
pIn++;
}
_DEBUGNL;
EtherType(control, etype);
/* setup the reception mode */
RXCTS=rxmode;
_DEBUGT("rxmode=");_DEBUGC(rxmode);
#ifdef ETH_DEBUG
#if ETH_DEBUG
if (rxmode & RXCT_RFCE) _DEBUGT("=RFCE |");
if (rxmode & RXCT_PROM) _DEBUGT(" PROM |");
if (rxmode & RXCT_CONMC) _DEBUGT(" CONMC |");
if (rxmode & RXCT_BCREJ) _DEBUGT(" BCREJ");
#endif
#endif
/* and finally network control */
EmacControl(netctl);
/* after that the EMAC can be enabled */
EmacEnable();
_DEBUGT("\n\rEtherOpen(end)\n\r");
}
//===============================================
void EtherClose(void)
{
_DEBUGT("EtherClose\n\r");
/* disable EMAC */
EmacDisable();
/* mask all EMAC interrupts */
IMASK=0;
}
//===============================================
void EmacDisable(void)
{
/* disable EMAC */
NETCTL_EMACE = 0;
}
//===============================================
void EmacEnable(void)
{
/* Enable EMAC */
NETCTL_EMACE = 1;
}
//===============================================
void EmacControl(tU08 netctl)
{
/* Enable EMAC */
NETCTL=netctl;
_DEBUGT("\n\rnetctl"); _DEBUGC(netctl);
#ifdef ETH_DEBUG
#if ETH_DEBUG
if (netctl & NETCT_ESWAI) _DEBUGT("= ESWAI |");
if (netctl & NETCT_EXTPHY) _DEBUGT(" EXTPHY |");
if (netctl & NETCT_MLB) _DEBUGT(" MLB |");
if (netctl & NETCT_FDX) _DEBUGT(" FDX");
#endif
#endif
}
//===============================================
void EtherType(tU08 control, tU16 etype)
{
_DEBUGT("EtherType = ");
/* setup the ethertype control register */
ETCTL=control;
_DEBUGC(ETCTL); //MODIFIED BY ME
#ifdef ETH_DEBUG
#if ETH_DEBUG
if (control & T_PET) _DEBUGT("= PET |");
if (control & T_EMW) _DEBUGT("EMW |");
if (control & T_IPV6) _DEBUGT("IPV6 |");
if (control & T_ARP) _DEBUGT("ARP |");
if (control & T_IPV4) _DEBUGT("IPV4 |");
if (control & T_IEEE) _DEBUGT("IEEE ");
#endif
#endif
/* setup the programmable ethertype */
_DEBUGT("; Programmable etype = ");_DEBUGI(etype);_DEBUGNL;
ETYPE=etype;
}
//===============================================
tU16 EtherPause(tU08 ptrc, tU16 ptime)
{
_DEBUGT("EtherPause(start)\n\r");
TXCTS_PTRC = ptrc;
if (ptrc)
{
_DEBUGT("ptrc=1 (send pause)");
PTIME=ptime;
while (TXCTS_TXACT == 1);
TXCTS_TCMD=TCMD_PAUSE; //send pause
}
else
{
_DEBUGT("ptrc=0 (read ptime) ");
ptime=PTIME; /* return current PAUSE counter value */
}
_DEBUGT(" ptime = "); _DEBUGI(ptime); _DEBUGT("EtherPause(end)\n\r");
return ptime;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -