mirror of
https://github.com/lwip-tcpip/lwip.git
synced 2025-02-04 21:39:49 +00:00
initial version for Xilinx Virtex-II Pro port
This commit is contained in:
parent
6c979fed40
commit
a582ccfce8
51
src/arch/v2pro/include/arch/cc.h
Normal file
51
src/arch/v2pro/include/arch/cc.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_CC_H__
|
||||
#define __ARCH_CC_H__
|
||||
|
||||
typedef unsigned char u8_t;
|
||||
typedef signed char s8_t;
|
||||
typedef unsigned short u16_t;
|
||||
typedef signed short s16_t;
|
||||
typedef unsigned long u32_t;
|
||||
typedef signed long s32_t;
|
||||
|
||||
typedef u32_t mem_ptr_t;
|
||||
|
||||
#define PACK_STRUCT_FIELD(x) x __attribute__((packed))
|
||||
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
||||
#define PACK_STRUCT_BEGIN
|
||||
#define PACK_STRUCT_END
|
||||
|
||||
#endif /* __ARCH_CC_H__ */
|
39
src/arch/v2pro/include/arch/cpu.h
Normal file
39
src/arch/v2pro/include/arch/cpu.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_CPU_H__
|
||||
#define __ARCH_CPU_H__
|
||||
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
|
||||
#endif /* __ARCH_CPU_H__ */
|
40
src/arch/v2pro/include/arch/lib.h
Normal file
40
src/arch/v2pro/include/arch/lib.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_LIB_H__
|
||||
#define __ARCH_LIB_H__
|
||||
|
||||
void bcopy(const void *src, void *dest, int len);
|
||||
void bzero(void *data, int n);
|
||||
|
||||
#endif /* __ARCH_LIB_H__ */
|
40
src/arch/v2pro/include/arch/perf.h
Normal file
40
src/arch/v2pro/include/arch/perf.h
Normal file
@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_PERF_H__
|
||||
#define __ARCH_PERF_H__
|
||||
|
||||
#define PERF_START /* null definition */
|
||||
#define PERF_STOP(x) /* null definition */
|
||||
|
||||
#endif /* __ARCH_PERF_H__ */
|
39
src/arch/v2pro/include/arch/sys_arch.h
Normal file
39
src/arch/v2pro/include/arch/sys_arch.h
Normal file
@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __SYS_XILINX_V2P_H__
|
||||
#define __SYS_XILINX_V2P_H__
|
||||
|
||||
#define SYS_MBOX_NULL 0
|
||||
|
||||
#endif /* __SYS_XILINX_V2P_H__ */
|
51
src/arch/v2pro/include/netif/xemacif.h
Normal file
51
src/arch/v2pro/include/netif/xemacif.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Xilinx, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Chris Borrelli <chris.borrelli@xilinx.com>
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __NETIF_XEMACIF_H__
|
||||
#define __NETIF_XEMACIF_H__
|
||||
|
||||
#include "lwip/netif.h"
|
||||
|
||||
void xemacif_setmac(u8_t *addr);
|
||||
u8_t * xemacif_getmac(void);
|
||||
void xemacif_init(struct netif *netif);
|
||||
void xemacif_input(void *CallBackRef);
|
||||
|
||||
/* define LWIP_XEMAC_USE_INTMODE to make the driver use interrupt mode.
|
||||
* otherwise, the xemac code will use poll mode. the application
|
||||
* should check this as well for init stuff
|
||||
*/
|
||||
|
||||
//#define LWIP_XEMAC_USE_INTMODE 1
|
||||
|
||||
#endif /* __NETIF_XEMACIF_H__ */
|
59
src/arch/v2pro/lib_arch.c
Normal file
59
src/arch/v2pro/lib_arch.c
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
#include "lwip/arch.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
void
|
||||
bcopy(const void *src, void *dst, unsigned int size)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for(i = 0; i < size; ++i) {
|
||||
((char *)dst)[i] = ((char *) src)[i];
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
void
|
||||
bzero(void *s, int n)
|
||||
{
|
||||
for(--n ;n >= 0; --n) {
|
||||
((char *)s)[n] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
511
src/arch/v2pro/netif/xemacif.c
Executable file
511
src/arch/v2pro/netif/xemacif.c
Executable file
@ -0,0 +1,511 @@
|
||||
/*
|
||||
* Copyright (c) 2001, 2002 Swedish Institute of Computer Science.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Copyright (c) 2001, 2002 Xilinx, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright notice,
|
||||
* this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
* this list of conditions and the following disclaimer in the documentation
|
||||
* and/or other materials provided with the distribution.
|
||||
* 3. The name of the author may not be used to endorse or promote products
|
||||
* derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
||||
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS".
|
||||
* BY PROVIDING THIS DESIGN, CODE, OR INFORMATION AS ONE POSSIBLE
|
||||
* IMPLEMENTATION OF THIS FEATURE, APPLICATION OR STANDARD, XILINX
|
||||
* IS MAKING NO REPRESENTATION THAT THIS IMPLEMENTATION IS FREE FROM
|
||||
* ANY CLAIMS OF INFRINGEMENT, AND YOU ARE RESPONSIBLE FOR OBTAINING
|
||||
* ANY RIGHTS YOU MAY REQUIRE FOR YOUR IMPLEMENTATION. XILINX
|
||||
* EXPRESSLY DISCLAIMS ANY WARRANTY WHATSOEVER WITH RESPECT TO THE
|
||||
* ADEQUACY OF THE IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY
|
||||
* WARRANTIES OR REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE
|
||||
* FROM CLAIMS OF INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* This file is part of the lwIP TCP/IP stack.
|
||||
*
|
||||
* Author: Chris Borrelli <chris.borrelli@xilinx.com>
|
||||
*
|
||||
* Based on example ethernetif.c, Adam Dunkels <adam@sics.se>
|
||||
*
|
||||
*/
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* V2PDK Include Files */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "xemac.h"
|
||||
#include "xparameters.h"
|
||||
#include "xstatus.h"
|
||||
#include "xintc.h"
|
||||
#include "exception.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* LWIP Include Files */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#include "lwip/debug.h"
|
||||
#include "lwip/opt.h"
|
||||
#include "lwip/def.h"
|
||||
#include "lwip/mem.h"
|
||||
#include "lwip/pbuf.h"
|
||||
#include "lwip/sys.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "netif/etharp.h"
|
||||
#include "netif/xemacif.h"
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Describe network interface */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define IFNAME0 'e'
|
||||
#define IFNAME1 '0'
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Constant Definitions */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
#define EMAC_INTR_ID 28 /* Interrupt ID for EMAC */
|
||||
#define XEM_MAX_FRAME_SIZE_IN_WORDS ((XEM_MAX_FRAME_SIZE/sizeof(Xuint32))+1)
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif structure */
|
||||
/* contains the ethernet address and the */
|
||||
/* pointer to the instance of the Xilinx */
|
||||
/* EMAC driver. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
|
||||
struct xemacif {
|
||||
struct eth_addr *ethaddr;
|
||||
XEmac *instance_ptr;
|
||||
};
|
||||
|
||||
static const struct eth_addr ethbroadcast = {{0xff,0xff,0xff,0xff,0xff,0xff}};
|
||||
static struct eth_addr mymac = {{0x00,0x0A,0x35,0x00,0x22,0x20}};
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* Forward declarations */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static err_t xemacif_output(struct netif *netif, struct pbuf *p,
|
||||
struct ip_addr *ipaddr);
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
static void FifoSendHandler(void *CallBackRef);
|
||||
static void ErrorHandler(void *CallBackRef, XStatus Code);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* low_level_init function */
|
||||
/* - hooks up the data structures and sets the mac options and mac */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static err_t
|
||||
low_level_init(struct netif *netif_ptr)
|
||||
{
|
||||
XIntc *IntcInstancePtr;
|
||||
|
||||
XEmac * InstancePtr;
|
||||
Xuint16 DeviceId = XPAR_EMAC_0_DEVICE_ID; /* from xparameters.h */
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
Xuint16 IntcDeviceId = XPAR_INTC_0_DEVICE_ID;
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
XStatus Result;
|
||||
Xuint32 Options;
|
||||
|
||||
struct xemacif *xemacif_ptr;
|
||||
|
||||
xemacif_ptr = netif_ptr->state;
|
||||
|
||||
/* Get Instance of EMAC Driver */
|
||||
xemacif_ptr->instance_ptr = InstancePtr = XEmac_GetInstance(0);
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
/* Get Instance of Interrupt Controller Driver */
|
||||
IntcInstancePtr = XIntc_GetInstance(0);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
/* Call Initialize Function of EMAC driver */
|
||||
Result = XEmac_Initialize(InstancePtr, DeviceId);
|
||||
if (Result != XST_SUCCESS) {
|
||||
return ERR_MEM;
|
||||
}
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
if (XIntc_Initialize(IntcInstancePtr, IntcDeviceId) != XST_SUCCESS) {
|
||||
return ERR_MEM;
|
||||
}
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
if (XEmac_IsSgDma(InstancePtr)) {
|
||||
/* not configured for direct FIFO access */
|
||||
return ERR_MEM;
|
||||
}
|
||||
|
||||
Result = XEmac_SelfTest(InstancePtr);
|
||||
if (Result != XST_SUCCESS && Result != XST_DEVICE_IS_STARTED) {
|
||||
return ERR_MEM;
|
||||
}
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
Result = XIntc_SelfTest(IntcInstancePtr);
|
||||
if (Result != XST_SUCCESS && Result != XST_DEVICE_IS_STARTED) {
|
||||
return ERR_MEM;
|
||||
}
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
/* Stop the EMAC hardware */
|
||||
(void) XEmac_Stop(InstancePtr);
|
||||
|
||||
/* Set MAC Address of EMAC */
|
||||
Result = XEmac_SetMacAddress(InstancePtr, (Xuint8*) netif_ptr->hwaddr);
|
||||
if (Result != XST_SUCCESS) return ERR_MEM;
|
||||
|
||||
/* Set MAC Options - UNICAST and BROADCAST */
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
Options = (XEM_UNICAST_OPTION | XEM_BROADCAST_OPTION);
|
||||
#else /* LWIP_XEMAC_USE_INTMODE */
|
||||
Options = (XEM_UNICAST_OPTION | XEM_BROADCAST_OPTION | XEM_POLLED_OPTION);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
Result = XEmac_SetOptions(InstancePtr, Options);
|
||||
if (Result != XST_SUCCESS) return ERR_MEM;
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
/* Set Callbacks and error handler */
|
||||
XEmac_SetFifoSendHandler(InstancePtr, netif_ptr, FifoSendHandler);
|
||||
XEmac_SetFifoRecvHandler(InstancePtr, netif_ptr, xemacif_input);
|
||||
XEmac_SetErrorHandler(InstancePtr, netif_ptr, ErrorHandler);
|
||||
|
||||
/* Connect to the interrupt controller and enable interrupts */
|
||||
XIntc_Connect(IntcInstancePtr, EMAC_INTR_ID,
|
||||
XEmac_GetIntrHandler(InstancePtr), InstancePtr);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
/* Start the EMAC hardware */
|
||||
Result = XEmac_Start(InstancePtr);
|
||||
if (Result != XST_SUCCESS)
|
||||
return ERR_MEM;
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
if (XST_SUCCESS != XIntc_Start(IntcInstancePtr))
|
||||
return ERR_MEM;
|
||||
|
||||
XIntc_Enable(IntcInstancePtr, EMAC_INTR_ID);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* FifoSendHandler() */
|
||||
/* */
|
||||
/* Checks for Tx Errors */
|
||||
/* TODO: Add actions. Nothing happens if an error is found. */
|
||||
/* */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void FifoSendHandler(void *CallBackRef)
|
||||
{
|
||||
struct netif *netif_ptr = (struct netif *) CallBackRef;
|
||||
XEmac *EmacPtr = ((struct xemacif*) netif_ptr->state)->instance_ptr;
|
||||
XEmacStats Stats;
|
||||
|
||||
/*
|
||||
* Check stats for transmission errors (overrun or underrun errors are
|
||||
* caught by the asynchronous error handler).
|
||||
*/
|
||||
XEmac_GetStats(EmacPtr, &Stats);
|
||||
if (Stats.XmitLateCollisionErrors || Stats.XmitExcessDeferral)
|
||||
;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* ErrorHandler() */
|
||||
/* */
|
||||
/* Resets the MAC hardware is an error occurs */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static void ErrorHandler(void *CallBackRef, XStatus Code)
|
||||
{
|
||||
struct netif *netif_ptr = (struct netif *) CallBackRef;
|
||||
XEmac *EmacPtr = ((struct xemacif*) netif_ptr->state)->instance_ptr;
|
||||
|
||||
if (Code == XST_RESET_ERROR) {
|
||||
/*
|
||||
* A reset error means the application should reset the device because
|
||||
* it encountered a reset condition (most likely a FIFO overrun, but
|
||||
* can be other reasons). You can look at the XEmac statistics to
|
||||
* see what the error is.
|
||||
*/
|
||||
XEmac_Reset(EmacPtr);
|
||||
(void)XEmac_SetMacAddress(EmacPtr, (Xuint8*) netif_ptr->hwaddr);
|
||||
(void)XEmac_SetOptions(EmacPtr,XEM_UNICAST_OPTION|XEM_BROADCAST_OPTION);
|
||||
(void)XEmac_Start(EmacPtr);
|
||||
}
|
||||
}
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* low_level_output() */
|
||||
/* */
|
||||
/* Should do the actual transmission of the packet. The packet is */
|
||||
/* contained in the pbuf that is passed to the function. This pbuf */
|
||||
/* might be chained. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static err_t low_level_output(struct xemacif *xemacif_ptr, struct pbuf *p)
|
||||
{
|
||||
struct pbuf *q;
|
||||
u32_t frame_buffer[XEM_MAX_FRAME_SIZE_IN_WORDS]; /* word aligned */
|
||||
Xuint8 *frame_ptr;
|
||||
int payload_size = 0, i;
|
||||
XStatus Result;
|
||||
|
||||
frame_ptr = (Xuint8 *) frame_buffer;
|
||||
|
||||
for(q = p; q != NULL; q = q->next) {
|
||||
/*
|
||||
* Send the data from the pbuf to the interface, one pbuf at a
|
||||
* time. The size of the data in each pbuf is kept in the ->len
|
||||
* variable.
|
||||
*/
|
||||
for(i = 0 ; i < q->len ; i++) {
|
||||
*(frame_ptr++) = (Xuint8) *(((u8_t *) q->payload) + i);
|
||||
payload_size++;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
|
||||
Result = XEmac_FifoSend(xemacif_ptr->instance_ptr,
|
||||
(Xuint8 *) frame_buffer,
|
||||
payload_size);
|
||||
|
||||
#else /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
Result = XEmac_PollSend(xemacif_ptr->instance_ptr,
|
||||
(Xuint8 *) frame_buffer,
|
||||
payload_size);
|
||||
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
if (Result != XST_SUCCESS) return ERR_MEM;
|
||||
|
||||
#ifdef LINK_STATS
|
||||
stats.link.xmit++;
|
||||
#endif /* LINK_STATS */
|
||||
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* low_level_input() */
|
||||
/* */
|
||||
/* Allocates a pbuf pool and transfers bytes of */
|
||||
/* incoming packet from the interface into the pbuf. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static struct pbuf * low_level_input(struct xemacif *xemacif_ptr)
|
||||
{
|
||||
struct pbuf *p = NULL, *q = NULL;
|
||||
XEmac *EmacPtr = (XEmac *) xemacif_ptr->instance_ptr;
|
||||
|
||||
Xuint32 RecvBuffer[XEM_MAX_FRAME_SIZE_IN_WORDS];
|
||||
Xuint32 FrameLen = XEM_MAX_FRAME_SIZE;
|
||||
Xuint32 i;
|
||||
u8_t * frame_bytes = (u8_t *) RecvBuffer;
|
||||
XStatus Result;
|
||||
|
||||
#ifdef CHRIS_DEBUG
|
||||
char ascii[2];
|
||||
#endif /* CHRIS_DEBUG */
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
Result = XEmac_FifoRecv(EmacPtr, (Xuint8 *)RecvBuffer, &FrameLen);
|
||||
#else
|
||||
Result = XEmac_PollRecv(EmacPtr, (Xuint8 *)RecvBuffer, &FrameLen);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
if (Result != XST_SUCCESS)
|
||||
return p;
|
||||
|
||||
#if 0
|
||||
printf("\r\n");
|
||||
for (i=0 ; i < FrameLen ; i++) {
|
||||
printf("%4X", frame_bytes[i]);
|
||||
if (! (i%20) && i) printf("\r\n");
|
||||
else printf(" ");
|
||||
}
|
||||
printf ("\r\n");
|
||||
#endif
|
||||
|
||||
/* Allocate a pbuf chain of pbufs from the pool. */
|
||||
p = pbuf_alloc(PBUF_LINK, FrameLen, PBUF_POOL);
|
||||
|
||||
if(p != NULL) {
|
||||
/* Iterate over the pbuf chain until we have
|
||||
* read the entire packet into the pbuf. */
|
||||
for(q = p; q != NULL; q = q->next) {
|
||||
/* Read enough bytes to fill this pbuf
|
||||
* in the chain. The avaliable data in
|
||||
* the pbuf is given by the q->len variable. */
|
||||
for (i = 0 ; i < q->len ; i++) {
|
||||
((u8_t *)q->payload)[i] = *(frame_bytes++);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LINK_STATS
|
||||
stats.link.recv++;
|
||||
#endif /* LINK_STATS */
|
||||
|
||||
} else {
|
||||
|
||||
#ifdef LINK_STATS
|
||||
stats.link.memerr++;
|
||||
stats.link.drop++;
|
||||
#endif /* LINK_STATS */
|
||||
;
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif_output(): */
|
||||
/* */
|
||||
/* This function is called by the TCP/IP stack when an IP packet */
|
||||
/* should be sent. It calls the function called low_level_output() to */
|
||||
/* do the actuall transmission of the packet. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
static err_t xemacif_output(struct netif *netif_ptr,
|
||||
struct pbuf *p,
|
||||
struct ip_addr *ipaddr)
|
||||
{
|
||||
struct xemacif *xemacif_ptr = xemacif_ptr = netif_ptr->state;
|
||||
|
||||
p = etharp_output(netif_ptr, ipaddr, p);
|
||||
if (p != NULL)
|
||||
return low_level_output(xemacif_ptr, p);
|
||||
return ERR_OK;
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif_input(): */
|
||||
/* */
|
||||
/* This function should be called when a packet is ready to be read */
|
||||
/* from the interface. It uses the function low_level_input() that */
|
||||
/* should handle the actual reception of bytes from the network */
|
||||
/* interface. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void xemacif_input(void *CallBackRef)
|
||||
{
|
||||
struct netif * netif_ptr = (struct netif *) CallBackRef;
|
||||
struct xemacif * xemacif_ptr;
|
||||
struct eth_hdr * ethernet_header;
|
||||
struct pbuf *p, *q;
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
/* Disable Interrupts */
|
||||
XIntc_Disable(XIntc_GetInstance(0), XPAR_INTC_0_DEVICE_ID);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
|
||||
xemacif_ptr = netif_ptr->state;
|
||||
|
||||
p = low_level_input(xemacif_ptr);
|
||||
|
||||
if(p != NULL) {
|
||||
ethernet_header = p->payload;
|
||||
|
||||
q = NULL;
|
||||
switch(htons(ethernet_header->type)) {
|
||||
case ETHTYPE_IP:
|
||||
q = etharp_ip_input(netif_ptr, p);
|
||||
pbuf_header(p, -14);
|
||||
netif_ptr->input(p, netif_ptr);
|
||||
break;
|
||||
case ETHTYPE_ARP:
|
||||
q = etharp_arp_input(netif_ptr, xemacif_ptr->ethaddr, p);
|
||||
break;
|
||||
default:
|
||||
pbuf_free(p);
|
||||
break;
|
||||
}
|
||||
|
||||
if(q != NULL) {
|
||||
low_level_output(xemacif_ptr, q);
|
||||
pbuf_free(q);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LWIP_XEMAC_USE_INTMODE
|
||||
/* Enable Interrupts again */
|
||||
XIntc_Enable(XIntc_GetInstance(0), XPAR_INTC_0_DEVICE_ID);
|
||||
#endif /* LWIP_XEMAC_USE_INTMODE */
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif_setmac(): */
|
||||
/* */
|
||||
/* Sets the MAC address of the system. */
|
||||
/* Note: Can only be called before xemacif_init is called. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void xemacif_setmac(u8_t *addr)
|
||||
{
|
||||
mymac.addr[0] = addr[0];
|
||||
mymac.addr[1] = addr[1];
|
||||
mymac.addr[2] = addr[2];
|
||||
mymac.addr[3] = addr[3];
|
||||
mymac.addr[4] = addr[4];
|
||||
mymac.addr[5] = addr[5];
|
||||
}
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif_getmac(): */
|
||||
/* */
|
||||
/* Returns a pointer to the mymac variable (6 bytes in length) */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
u8_t * xemacif_getmac(void) { return &(mymac.addr[0]); }
|
||||
|
||||
/*---------------------------------------------------------------------------*/
|
||||
/* xemacif_init(): */
|
||||
/* */
|
||||
/* Should be called at the beginning of the program to set up the */
|
||||
/* network interface. It calls the function low_level_init() to do the */
|
||||
/* actual setup of the hardware. */
|
||||
/*---------------------------------------------------------------------------*/
|
||||
void xemacif_init(struct netif *netif_ptr)
|
||||
{
|
||||
struct xemacif *xemacif_ptr;
|
||||
|
||||
xemacif_ptr = mem_malloc(sizeof(struct xemacif));
|
||||
|
||||
netif_ptr->state = xemacif_ptr;
|
||||
netif_ptr->hwaddr[0] = mymac.addr[0];
|
||||
netif_ptr->hwaddr[1] = mymac.addr[1];
|
||||
netif_ptr->hwaddr[2] = mymac.addr[2];
|
||||
netif_ptr->hwaddr[3] = mymac.addr[3];
|
||||
netif_ptr->hwaddr[4] = mymac.addr[4];
|
||||
netif_ptr->hwaddr[5] = mymac.addr[5];
|
||||
netif_ptr->name[0] = IFNAME0;
|
||||
netif_ptr->name[1] = IFNAME1;
|
||||
netif_ptr->output = xemacif_output;
|
||||
netif_ptr->linkoutput = NULL;
|
||||
|
||||
/* Copy pointer to netif_ptr->hwaddr into the xemacif_ptr->ethaddr */
|
||||
xemacif_ptr->ethaddr = (struct eth_addr *)&(netif_ptr->hwaddr[0]);
|
||||
|
||||
/* Set EXmac instance pointer to NULL. It gets set in low_level_init() */
|
||||
xemacif_ptr->instance_ptr = NULL;
|
||||
|
||||
low_level_init(netif_ptr);
|
||||
etharp_init();
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user