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

📄 ne64api.c

📁 MC9S12NE64串口与网络通信源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
 /*****************************************************************************
 *
 * 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 + -