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

📄 sed.c

📁 ADAM2 sources (modified by Oleg)
💻 C
📖 第 1 页 / 共 3 页
字号:
 */char abuffer[4096];octet *sed_FormatPacket( destEAddr, ethType )        register octet *destEAddr;  {  octet *xMitBuf;  bit32u *dp;  int i;      for(i=0,dp=(bit32u *)abuffer;i<((sizeof abuffer)/4);i++)     *dp++=0;  xMitBuf = (octet *)&abuffer[2];  Move( destEAddr, xMitBuf, 6 );  Move( sed_lclEthAddr, xMitBuf + 6, 6 );  *((short *)(xMitBuf+12)) = wfix(ethType);  return(xMitBuf+14);  }/* *  Send a packet out over the ethernet.  The packet is sitting at the * beginning of the transmit buffer.  The routine returns when the * packet has been successfully sent. */int sed_Send( pkLengthInOctets )  register int pkLengthInOctets;  {  char *cp;  pkLengthInOctets += 14;             /* account for Ethernet header */  pkLengthInOctets = (pkLengthInOctets + 1) & (~1);  if (pkLengthInOctets < E10P_MIN)     pkLengthInOctets = E10P_MIN; /* and min. ethernet len */  cp=&abuffer[2];  IssueSend((int *)UNCACHED(cp),pkLengthInOctets, FALSE);  /*Now wait for Tx completion*/  while (TCRFREEENT == txcompring_size)    {    }  TCRENTINC=1;  return(0);  }/*  * Test for the arrival of a packet on the Ethernet interface.  The packet may * arrive in either buffer A or buffer B; the location of the packet is * returned.  If no packet is returned withing 'timeout' milliseconds, * then the routine returns zero. *  * Note: ignores ethernet errors.  may occasionally return something * which was received in error. */octet *sed_IsPacket(void)  {  octet *pb;      pb=GetRxPacket();  if (pb)    {    pb+=14;    }  return(pb);  }/*  *  Check to make sure that the packet that you received was the one that * you expected to get. */int sed_CheckPacket( recBufLocation, expectedType )    word *recBufLocation;    word expectedType;  {  if ( recBufLocation[-1] != wfix(expectedType) )     return(0);   else    return(1);  }char ubuff[2048];void *GetRxPacket(void)  {  bit32u uitmpsts,rlen;  char *uipbufrtn;  uipbufrtn=0;  do    {    if (RCRPENDENT)      {      uitmpsts=RxCompPtr->status;      CurrentRcb=(struct rcb_s *)UNCACHED(RxCompPtr->sof_list);      rlen=CurrentRcb->size&0x0ffff;      if (((uitmpsts&0xc0000000)==0x80000000)&&(rlen>=60)&&(rlen<=1514))        { /* Good frame*/        sys_memcpy(&ubuff[2],CurrentRcb->DatPtr,rlen);        uipbufrtn=&ubuff[2];        }      if (uitmpsts&0x80000000)        {        RxFree(CurrentRcb);                                 }      RxCompPtr=((struct rxcompring_s *) ((((int)(RxCompPtr+1))&RxCompRingMask)|(RxCompRingBase)));      RCRENTINC=1;      }    }while((RCRPENDENT)&&(uipbufrtn==0));  return(uipbufrtn);  }#ifdef DIAG_SUPPORTvoid FillBuffer(volatile int *buffer,int size){  int i;  char *cp;  if ((size > 1518) || (size < 64)) 	return;  cp = (char *)buffer;  for(i = 0; i < size; i++)    *cp++ = (i + 1);}int CheckBuffer(volatile int *buffer, int size, int seq){  int i;  char *cp;  if ((size > 1518) || (size < 64))   {    return 1;  }  size -= 4;  cp = (char *)buffer;  for(i = 0; i < size; i++, cp++)  {    if (i == SEQ)    {      if ((*cp & 0x0ff) != (seq & 0x0ff))      {		/*sys_printf("\n Rx Buffer data miscompare, Expected %x, Found %x\n", (seq&0x0ff), (*cp&0x0ff));*/        return 1;       }    }    else    {      if ((*cp & 0x0ff) != ((i + 1) & 0x0ff))       {		/*sys_printf("\n Rx Buffer data miscompare, Expected %x, Found %x\n", ((i+1)&0x0ff), (*cp&0x0ff));*/        return 1;      }    }  }  rcb_pending--;  return(0);}void SetSeq(volatile int *buffer,int seq){  char *cp;  if (SEQ >= BUFFER_SIZE) 	return;  cp = (char *)buffer;  cp[SEQ] = (char)seq;}int test_emac(int loopback){  volatile unsigned *mem_ptr;   int data_val, i, j, m, RxNeed, ExpTxErrors, try, sts;   if (sed_Init(loopback) == 1)	return 1;  /* Now put some data in Tx buffer */  for(i = 0;i < TX_BUF_COUNT; i++)  {    if (i >= FLIP_TBUF_INDEX)      mem_ptr = sys_malloc(1518+16);    else      mem_ptr  = sys_malloc(1518+16);    if (!mem_ptr) {      sys_printf("Error: sys_malloc\n");	  return 1;	}    mem_ptr=(volatile unsigned *)((i&0xf)+((bit32u)mem_ptr));    FillBuffer((int *)mem_ptr,1518);    tx_buf[i] = mem_ptr;  }  tx_buf_index = 0;  tx_frame_seq = rx_fram_seq = 0;  ExpTxErrors = 0;  if ((loopback == EXTERNAL_LOOP) || (loopback == WIRE_LOOP))    clockwait(3*av_cpufreq);  t_clear();  if (MACCONTROL&NO_LOOP)  {    while(MACSTATUS & 1)     {      if (t_get() > (4*av_cpufreq))       {		sys_printf("\n Timed out waiting for Link\n");        return 1;      }    }  }  /* Now send frame */  for(j = 0; j < loops; j++)  {    for(i = MIN_FRAME_SIZE;i <= MAX_FRAME_SIZE; i += steps)    {      for(m = 0; m < TX_BURST_COUNT; m++)      {        mem_ptr = tx_buf[tx_buf_index++];        if (tx_buf_index >= TX_BUF_COUNT) tx_buf_index = 0;        SetSeq((int *)mem_ptr, tx_frame_seq++);        IssueSend((int *)mem_ptr, i, FALSE);        if (((tx_frame_seq & 0xff) == 0) && (( j> 2) || (loops == 1)))        {          IssueSend((int *)mem_ptr, i, TRUE);          ExpTxErrors++;        }      }      for(m = 0; m < TX_BURST_COUNT; m++)      {        try = TEST_TIMEOUT;        while (TCRFREEENT == txcompring_size)        {          data_val++;          if (!try)           {			/*sys_printf("\n Timed out waiting for Tx Completion Ring\n");*/            return 1;          }          try--;        }        RxNeed = 1;        while (RxNeed)        {          try = TEST_TIMEOUT;          while (RCRFREEENT == rxcompring_size)          {            data_val++;            if (!try)             {			  /*sys_printf("\n Timed out waiting for Rx Completion Ring %x %x\n", RCRFREEENT, rxcompring_size);*/              return 1;            }            try--;          }      	  CurrentRcb = (struct rcb_s *)UNCACHED(RxCompPtr->sof_list);          if ((RxCompPtr->status & 0xc0000000) == 0x80000000)          {            RxNeed--;            sts = CheckBuffer(CurrentRcb->DatPtr, i, rx_fram_seq++);            if (sts)             {              MACCONTROL = CAF | FULL_DUPLEX | SPEED_100 | PEFCE;              return(sts);            }            if ((CurrentRcb->size & 0x0ffff) != (i+4)) 			{			  /*sys_printf("\n Rx buffer Length error, i=%d, size=%x\n", (i+4), (CurrentRcb->size & 0xffff));*/              return 1;			}            *(CurrentRcb->DatPtr) = 0;            RxFree(CurrentRcb);          }          RxCompPtr = ((struct rxcompring_s *) ((((int)(RxCompPtr + 1))&RxCompRingMask) | (RxCompRingBase)));          RCRENTINC = 1;        }        tcb_pending--;        TCRENTINC = 1;      }      while(ExpTxErrors)       {        try = TEST_TIMEOUT;        while (TCRFREEENT == txcompring_size)        {          data_val++;          if (!try)           {			/*sys_printf("\n Timed out waiting for Tx Completion Ring\n");*/            return 1;          }          try--;        }        ExpTxErrors--;        tcb_pending--;        TCRENTINC = 1;      }    }  }  sed_shutdown();  return 0;}#if 0"emac(id=eth0:InternalLoopback, base=0xA8610000, reset_bit=17, loopback=internal)","emac(id=eth1:InternalLoopback, base=0xA8612800, reset_bit=21, loopback=internal)","emac(id=eth0:ExternalLoopback, base=0xA8610000, reset_bit=17, loopback=external, mii_phy=1, critical=no)","emac(id=eth1:ExternalLoopback, base=0xA8612800, reset_bit=21, loopback=external, mii_phy=1, critical=no)","emac(id=eth0:WireLoopback    , base=0xA8610000, reset_bit=17, loopback=wire    , mii_phy=1, critical=no)","emac(id=eth1:WireLoopback    , base=0xA8612800, reset_bit=21, loopback=wire    , mii_phy=1, critical=no)",#endifint demac(void){    char *cp;	rtim = t_get();	av_cpufreq = (cp = sys_getenv("cpufrequency")) ? atoul(cp) : 125000000;  	ticdiv = av_cpufreq / 2000;	loops = 1/*10*/;	steps = 7/*1*/;			emacbase = EMACA_BASE;		sys_printf("Testing 'eth0' InternalLoop ");	if (test_emac(INTERNAL_LOOP) == 1)	{		sys_printf("Failed\n");		return 1;	}	else		sys_printf("Passed\n");		sys_printf("Testing 'eth0' ExternalLoop ");	if (test_emac(EXTERNAL_LOOP) == 1)	{		sys_printf("Failed\n");		return 1;	}	else		sys_printf("Passed\n");#if 0    sys_printf("Testing 'eth0' WireLoop ");	if (test_emac(WIRE_LOOP) == 1)	{		sys_printf("Failed\n");		return 1;	}	else		sys_printf("Passed\n");#endif	return 0;}#endif /*DIAG_SUPPORT*/#include "emacphy.c"

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -