diff --git a/bsp_z7/lwip/xilinx_eth/CMakeLists.txt b/bsp_z7/lwip/xilinx_eth/CMakeLists.txt new file mode 100644 index 0000000..724a8e2 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/CMakeLists.txt @@ -0,0 +1,27 @@ +set (LWIP_INCLUDE_DIRS_XIL + "${LWIP_DIR}/src/include" + "${LWIP_DIR}/src/include/compat/posix" + "include" +) + +set(lwip_SRCS_XIL + ${lwipcore_SRCS} + ${lwipcore4_SRCS} + ${lwipcore6_SRCS} + ${lwipnetif_SRCS} + ${lwipapi_SRCS} + #${LWIP_DIR}/contrib/ports/freertos/sys_arch.c + #${LWIP_DIR}/src/netif/slipif.c + #${LWIP_DIR}/src/apps/tftp/tftp.c +) + + +add_library(lwip_xil EXCLUDE_FROM_ALL ${lwip_SRCS_XIL}) + +target_include_directories(lwip_xil PUBLIC ${LWIP_INCLUDE_DIRS_XIL}) + +target_sources(lwip_xil PRIVATE xethernet.c) + +add_subdirectory(netif) +add_subdirectory(port) + diff --git a/bsp_z7/lwip/xilinx_eth/README.md b/bsp_z7/lwip/xilinx_eth/README.md new file mode 100644 index 0000000..584b309 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/README.md @@ -0,0 +1,3 @@ +This folder contains mostly code from https://github.com/Xilinx/embeddedsw/tree/xilinx_v2024.1/ThirdParty/sw_services/lwip220/src/lwip-2.2.0/contrib/ports/xilinx + +Some files were added or modified to work with our setup. See git history for details, first clean import ist at `fd2c5a544fa1139c5123c35c83ca6b886bae2e6f`. \ No newline at end of file diff --git a/bsp_z7/lwip/xilinx_eth/include/arch/cc.h b/bsp_z7/lwip/xilinx_eth/include/arch/cc.h index 01b7d16..803c90b 100644 --- a/bsp_z7/lwip/xilinx_eth/include/arch/cc.h +++ b/bsp_z7/lwip/xilinx_eth/include/arch/cc.h @@ -47,30 +47,37 @@ #include #include "cpu.h" -/* As per new design of lwip-2.0.2, - * LWIP_NO_STDINT_H should be defined as 1 in cc.h */ -#define LWIP_NO_STDINT_H 1 +#include "xil_printf.h" -typedef unsigned char u8_t; -typedef signed char s8_t; -typedef unsigned short u16_t; -typedef signed short s16_t; -typedef unsigned int u32_t; -typedef signed int s32_t; -typedef unsigned long long u64_t; -typedef signed long long s64_t; -#define S16_F "d" -#define U16_F "d" -#define S32_F "d" -#define U32_F "x" +// errno is a macro. If we define LWIP_ERRNO_INCLUDE to errno.h the preprocessor will replace it, +// breaking the include. Instead we supply a helper include which in turn includes errno.h +#define LWIP_ERRNO_INCLUDE -#define X16_F "x" -#define X32_F "x" +// /* As per new design of lwip-2.0.2, +// * LWIP_NO_STDINT_H should be defined as 1 in cc.h */ +// #define LWIP_NO_STDINT_H 1 + +// typedef unsigned char u8_t; +// typedef signed char s8_t; +// typedef unsigned short u16_t; +// typedef signed short s16_t; +// typedef unsigned int u32_t; +// typedef signed int s32_t; +// typedef unsigned long long u64_t; +// typedef signed long long s64_t; + +// #define S16_F "d" +// #define U16_F "d" +// #define S32_F "d" +// #define U32_F "x" + +// #define X16_F "x" +// #define X32_F "x" #define LWIP_RAND rand -typedef unsigned long mem_ptr_t; +// typedef unsigned long mem_ptr_t; #define PACK_STRUCT_FIELD(x) x #define PACK_STRUCT_STRUCT __attribute__((packed)) diff --git a/bsp_z7/lwip/xilinx_eth/include/lwipopts.h b/bsp_z7/lwip/xilinx_eth/include/lwipopts.h new file mode 100644 index 0000000..a3b8132 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/include/lwipopts.h @@ -0,0 +1,336 @@ +/* + * Copyright (c) 2001-2003 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 + * + */ +#ifndef LWIP_LWIPOPTS_H +#define LWIP_LWIPOPTS_H + +#define LWIP_IPV4 1 +#define LWIP_IPV6 0 + +#define NO_SYS 0 +#define LWIP_SOCKET 1 +#define LWIP_NETCONN 1 +#define LWIP_NETIF_API 0 + +#define LWIP_IGMP 0 +#define LWIP_ICMP LWIP_IPV4 + +#define LWIP_SNMP 0 +//#define MIB2_STATS LWIP_SNMP +#ifdef LWIP_HAVE_MBEDTLS +#define LWIP_SNMP_V3 (LWIP_SNMP) +#endif + +#define LWIP_DNS 0 +#define LWIP_MDNS_RESPONDER 0 + +#define LWIP_NUM_NETIF_CLIENT_DATA (LWIP_MDNS_RESPONDER) + +#define LWIP_HAVE_LOOPIF 0 +#define LWIP_NETIF_LOOPBACK 0 +#define LWIP_LOOPBACK_MAX_PBUFS 0 + +#define TCP_LISTEN_BACKLOG 0 + +#define LWIP_COMPAT_SOCKETS 2 +//TODO put this into the OS +#define LWIP_POSIX_SOCKETS_IO_NAMES 0 +#define LWIP_SO_RCVTIMEO 0 +#define LWIP_SO_RCVBUF 0 +//TODO use this with LWIP_POSIX_SOCKETS_IO_NAMES +// TODO why is 100 not working... +#define LWIP_SOCKET_OFFSET 10 + +#define LWIP_SOCKET_SELECT 1 +#define LWIP_SOCKET_POLL 1 + +#define LWIP_TCPIP_CORE_LOCKING 0 + +#define LWIP_NETIF_LINK_CALLBACK 1 +#define LWIP_NETIF_STATUS_CALLBACK 1 +#define LWIP_NETIF_EXT_STATUS_CALLBACK 1 + +//#define LWIP_DEBUG + +#ifdef LWIP_DEBUG + +#define LWIP_DBG_MIN_LEVEL LWIP_DBG_LEVEL_ALL +#define PPP_DEBUG LWIP_DBG_OFF +#define MEM_DEBUG LWIP_DBG_OFF +#define MEMP_DEBUG LWIP_DBG_OFF +#define PBUF_DEBUG LWIP_DBG_ON +#define API_LIB_DEBUG LWIP_DBG_ON +#define API_MSG_DEBUG LWIP_DBG_ON +#define TCPIP_DEBUG LWIP_DBG_ON +#define NETIF_DEBUG LWIP_DBG_ON +#define SOCKETS_DEBUG LWIP_DBG_ON +#define DNS_DEBUG LWIP_DBG_ON +#define AUTOIP_DEBUG LWIP_DBG_ON +#define DHCP_DEBUG LWIP_DBG_ON +#define IP_DEBUG LWIP_DBG_ON +#define IP_REASS_DEBUG LWIP_DBG_ON +#define ICMP_DEBUG LWIP_DBG_ON +#define IGMP_DEBUG LWIP_DBG_ON +#define UDP_DEBUG LWIP_DBG_ON +#define TCP_DEBUG LWIP_DBG_OFF +#define TCP_INPUT_DEBUG LWIP_DBG_OFF +#define TCP_OUTPUT_DEBUG LWIP_DBG_OFF +#define TCP_RTO_DEBUG LWIP_DBG_OFF +#define TCP_CWND_DEBUG LWIP_DBG_OFF +#define TCP_WND_DEBUG LWIP_DBG_OFF +#define TCP_FR_DEBUG LWIP_DBG_OFF +#define TCP_QLEN_DEBUG LWIP_DBG_OFF +#define TCP_RST_DEBUG LWIP_DBG_OFF +#define TIMERS_DEBUG LWIP_DBG_OFF +#define LWIP_DEBUG_TIMERNAMES LWIP_DBG_OFF +#endif + +#define LWIP_DBG_TYPES_ON (LWIP_DBG_ON|LWIP_DBG_TRACE|LWIP_DBG_STATE|LWIP_DBG_FRESH|LWIP_DBG_HALT) + + +/* ---------- Memory options ---------- */ +/* MEM_ALIGNMENT: should be set to the alignment of the CPU for which + lwIP is compiled. 4 byte alignment -> define MEM_ALIGNMENT to 4, 2 + byte alignment -> define MEM_ALIGNMENT to 2. */ +/* MSVC port: intel processors don't need 4-byte alignment, + but are faster that way! */ + //TODO documentation + //Zynq needs 32 for DMA to work (something about cache I guess...) +#define MEM_ALIGNMENT 32U + +#define MEM_USE_POOLS 1 +#define MEMP_USE_CUSTOM_POOLS MEM_USE_POOLS + +/* MEM_SIZE: the size of the heap memory. If the application will send +a lot of data that needs to be copied, this should be set high. */ +#define MEM_SIZE 102400 + +/* MEMP_NUM_PBUF: the number of memp struct pbufs. If the application + sends a lot of data out of ROM (or other static memory), this + should be set high. */ +#define MEMP_NUM_PBUF 16 +/* MEMP_NUM_RAW_PCB: the number of UDP protocol control blocks. One + per active RAW "connection". */ +#define MEMP_NUM_RAW_PCB 3 +/* MEMP_NUM_UDP_PCB: the number of UDP protocol control blocks. One + per active UDP "connection". */ +#define MEMP_NUM_UDP_PCB 8 +/* MEMP_NUM_TCP_PCB: the number of simulatenously active TCP + connections. */ +#define MEMP_NUM_TCP_PCB 5 +/* MEMP_NUM_TCP_PCB_LISTEN: the number of listening TCP + connections. */ +#define MEMP_NUM_TCP_PCB_LISTEN 8 +/* MEMP_NUM_TCP_SEG: the number of simultaneously queued TCP + segments. */ +#define MEMP_NUM_TCP_SEG 16 +/* MEMP_NUM_SYS_TIMEOUT: the number of simulateously active + timeouts. */ +#define MEMP_NUM_SYS_TIMEOUT 17 + +/* The following four are used only with the sequential API and can be + set to 0 if the application only will use the raw API. */ +/* MEMP_NUM_NETBUF: the number of struct netbufs. */ +#define MEMP_NUM_NETBUF 2 +/* MEMP_NUM_NETCONN: the number of struct netconns. */ +#define MEMP_NUM_NETCONN 12 +/* MEMP_NUM_TCPIP_MSG_*: the number of struct tcpip_msg, which is used + for sequential API communication and incoming packets. Used in + src/api/tcpip.c. */ +#define MEMP_NUM_TCPIP_MSG_API 16 +#define MEMP_NUM_TCPIP_MSG_INPKT 16 + +#define TCPIP_THREAD_STACKSIZE 10240 + + +/* ---------- Pbuf options ---------- */ +/* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ +#define PBUF_POOL_SIZE 120 + +/* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ +/* Needs to be large enough to fit eth MTU to be able to use DMA for xemacps rx*/ +#define PBUF_POOL_BUFSIZE 1600 + +/** SYS_LIGHTWEIGHT_PROT + * define SYS_LIGHTWEIGHT_PROT in lwipopts.h if you want inter-task protection + * for certain critical regions during buffer allocation, deallocation and memory + * allocation and deallocation. + */ +#define SYS_LIGHTWEIGHT_PROT (NO_SYS==0) + + +/* ---------- TCP options ---------- */ +#define LWIP_TCP 0 +#define TCP_TTL 255 + +#define LWIP_ALTCP (LWIP_TCP) +#ifdef LWIP_HAVE_MBEDTLS +#define LWIP_ALTCP_TLS (LWIP_TCP) +#define LWIP_ALTCP_TLS_MBEDTLS (LWIP_TCP) +#endif + + +/* Controls if TCP should queue segments that arrive out of + order. Define to 0 if your device is low on memory. */ +#define TCP_QUEUE_OOSEQ 1 + +/* TCP Maximum segment size. */ +#define TCP_MSS 1024 + +/* TCP sender buffer space (bytes). */ +#define TCP_SND_BUF 2048 + +/* TCP sender buffer space (pbufs). This must be at least = 2 * + TCP_SND_BUF/TCP_MSS for things to work. */ +#define TCP_SND_QUEUELEN (4 * TCP_SND_BUF/TCP_MSS) + +/* TCP writable space (bytes). This must be less than or equal + to TCP_SND_BUF. It is the amount of space which must be + available in the tcp snd_buf for select to return writable */ +#define TCP_SNDLOWAT (TCP_SND_BUF/2) + +/* TCP receive window. */ +#define TCP_WND (20 * 1024) + +/* Maximum number of retransmissions of data segments. */ +#define TCP_MAXRTX 12 + +/* Maximum number of retransmissions of SYN segments. */ +#define TCP_SYNMAXRTX 4 + + +#define TCPIP_MBOX_SIZE 5 + +/* ---------- ARP options ---------- */ +#define LWIP_ARP 1 +#define ARP_TABLE_SIZE 10 +#define ARP_QUEUEING 1 +#define ARP_QUEUE_LEN 10 + + +/* ---------- IP options ---------- */ +/* Define IP_FORWARD to 1 if you wish to have the ability to forward + IP packets across network interfaces. If you are going to run lwIP + on a device with only one network interface, define this to 0. */ +#define IP_FORWARD 1 + +/* IP reassembly and segmentation.These are orthogonal even + * if they both deal with IP fragments */ +#define IP_REASSEMBLY 1 +#define IP_REASS_MAX_PBUFS (10 * ((1500 + PBUF_POOL_BUFSIZE - 1) / PBUF_POOL_BUFSIZE)) +#define MEMP_NUM_REASSDATA IP_REASS_MAX_PBUFS +#define IP_FRAG 1 +#define IPV6_FRAG_COPYHEADER 1 + +/* ---------- ICMP options ---------- */ +#define ICMP_TTL 255 + + +/* ---------- DHCP options ---------- */ +/* Define LWIP_DHCP to 1 if you want DHCP configuration of + interfaces. */ +#define LWIP_DHCP 0 + +/* 1 if you want to do an ARP check on the offered address + (recommended). */ +#define DHCP_DOES_ARP_CHECK (LWIP_DHCP) + + +/* ---------- AUTOIP options ------- */ +#define LWIP_AUTOIP (LWIP_DHCP) +#define LWIP_DHCP_AUTOIP_COOP (LWIP_DHCP && LWIP_AUTOIP) + + +/* ---------- UDP options ---------- */ +#define LWIP_UDP 1 +#define LWIP_UDPLITE 0 +#define UDP_TTL 255 +#define DEFAULT_UDP_RECVMBOX_SIZE 4 + +/* ---------- RAW options ---------- */ +#define LWIP_RAW 0 +#define DEFAULT_TCP_RECVMBOX_SIZE 2 + +/* ---------- Statistics options ---------- */ + +#define LWIP_STATS 0 +#define LWIP_STATS_DISPLAY 0 + +#if LWIP_STATS +#define LINK_STATS 1 +#define IP_STATS 1 +#define ICMP_STATS 1 +#define IGMP_STATS 1 +#define IPFRAG_STATS 1 +#define UDP_STATS 1 +#define TCP_STATS 1 +#define MEM_STATS 1 +#define MEMP_STATS 1 +#define PBUF_STATS 1 +#define SYS_STATS 1 +#endif /* LWIP_STATS */ + +/* ---------- NETBIOS options ---------- */ +#define LWIP_NETBIOS_RESPOND_NAME_QUERY 0 + +/* ---------- PPP options ---------- */ + +#define PPP_SUPPORT 0 /* Set > 0 for PPP */ + +#if PPP_SUPPORT + +#define NUM_PPP 1 /* Max PPP sessions. */ + + +/* Select modules to enable. Ideally these would be set in the makefile but + * we're limited by the command line length so you need to modify the settings + * in this file. + */ +#define PPPOE_SUPPORT 1 +#define PPPOS_SUPPORT 1 + +#define PAP_SUPPORT 1 /* Set > 0 for PAP. */ +#define CHAP_SUPPORT 1 /* Set > 0 for CHAP. */ +#define MSCHAP_SUPPORT 0 /* Set > 0 for MSCHAP */ +#define CBCP_SUPPORT 0 /* Set > 0 for CBCP (NOT FUNCTIONAL!) */ +#define CCP_SUPPORT 0 /* Set > 0 for CCP */ +#define VJ_SUPPORT 0 /* Set > 0 for VJ header compression. */ +#define MD5_SUPPORT 1 /* Set > 0 for MD5 (see also CHAP) */ + +#endif /* PPP_SUPPORT */ + + +// Disable slip task +#define SLIP_USE_RX_THREAD 0 + + + +#endif /* LWIP_LWIPOPTS_H */ diff --git a/bsp_z7/lwip/xilinx_eth/include/lwippools.h b/bsp_z7/lwip/xilinx_eth/include/lwippools.h new file mode 100644 index 0000000..7b5650e --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/include/lwippools.h @@ -0,0 +1,5 @@ +LWIP_MALLOC_MEMPOOL_START +LWIP_MALLOC_MEMPOOL(50, 256) +LWIP_MALLOC_MEMPOOL(50, 512) +LWIP_MALLOC_MEMPOOL(50, 1550) +LWIP_MALLOC_MEMPOOL_END \ No newline at end of file diff --git a/bsp_z7/lwip/xilinx_eth/include/netif/xadapter.h b/bsp_z7/lwip/xilinx_eth/include/netif/xadapter.h index 552a64f..10dd106 100644 --- a/bsp_z7/lwip/xilinx_eth/include/netif/xadapter.h +++ b/bsp_z7/lwip/xilinx_eth/include/netif/xadapter.h @@ -40,6 +40,9 @@ extern "C" { #if !NO_SYS #include "lwip/sys.h" +//TODO this is not portable: +#include "FreeRTOS.h" +#include "timers.h" #endif #include "lwip/netif.h" diff --git a/bsp_z7/lwip/xilinx_eth/include/netif/xpqueue.h b/bsp_z7/lwip/xilinx_eth/include/netif/xpqueue.h index 9258449..ba5c917 100644 --- a/bsp_z7/lwip/xilinx_eth/include/netif/xpqueue.h +++ b/bsp_z7/lwip/xilinx_eth/include/netif/xpqueue.h @@ -36,7 +36,7 @@ extern "C" { #endif -#include "debug.h" +#include "lwip/debug.h" #define PQ_QUEUE_SIZE 4096 diff --git a/bsp_z7/lwip/xilinx_eth/include/onrre.h b/bsp_z7/lwip/xilinx_eth/include/onrre.h new file mode 100644 index 0000000..a77254c --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/include/onrre.h @@ -0,0 +1,2 @@ +#pragma once +#include \ No newline at end of file diff --git a/bsp_z7/lwip/xilinx_eth/include/xethernet.h b/bsp_z7/lwip/xilinx_eth/include/xethernet.h new file mode 100644 index 0000000..3175008 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/include/xethernet.h @@ -0,0 +1,3 @@ +#pragma once + +void xethernet_init(); \ No newline at end of file diff --git a/bsp_z7/lwip/xilinx_eth/include/xlwipconfig.h b/bsp_z7/lwip/xilinx_eth/include/xlwipconfig.h index cc40f3a..e7691b1 100644 --- a/bsp_z7/lwip/xilinx_eth/include/xlwipconfig.h +++ b/bsp_z7/lwip/xilinx_eth/include/xlwipconfig.h @@ -33,8 +33,31 @@ #ifndef __XLWIPCONFIG_H_ #define __XLWIPCONFIG_H_ -/* this is a generated file: do not modify */ +#define XLWIP_CONFIG_INCLUDE_GEM +#define XLWIP_CONFIG_N_TX_DESC 64 +#define XLWIP_CONFIG_N_RX_DESC 64 -#define XLWIP_CONFIG_INCLUDE_EMACLITE 1 +//#define CONFIG_LINKSPEED100 +#define CONFIG_LINKSPEED_AUTODETECT + +//TODO defines +/* +#cmakedefine XLWIP_CONFIG_INCLUDE_AXIETH_ON_ZYNQ @XLWIP_CONFIG_INCLUDE_AXIETH_ON_ZYNQ@ +#cmakedefine XLWIP_CONFIG_INCLUDE_EMACLITE_ON_ZYNQ @XLWIP_CONFIG_INCLUDE_EMACLITE_ON_ZYNQ@ +#cmakedefine XLWIP_CONFIG_INCLUDE_EMACLITE @XLWIP_CONFIG_INCLUDE_EMACLITE@ +#cmakedefine XLWIP_CONFIG_INCLUDE_AXI_ETHERNET @XLWIP_CONFIG_INCLUDE_AXI_ETHERNET@ +#cmakedefine XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_DMA @XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_DMA@ +#cmakedefine XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO @XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_FIFO@ +#cmakedefine XLWIP_CONFIG_AXI_ETHERNET_ENABLE_1588 @XLWIP_CONFIG_AXI_ETHERNET_ENABLE_1588@ +#cmakedefine XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA @XLWIP_CONFIG_INCLUDE_AXI_ETHERNET_MCDMA@ +#cmakedefine XLWIP_CONFIG_INCLUDE_GEM @XLWIP_CONFIG_INCLUDE_GEM@ +#cmakedefine XLWIP_CONFIG_N_TX_DESC @XLWIP_CONFIG_N_TX_DESC@ +#cmakedefine XLWIP_CONFIG_N_RX_DESC @XLWIP_CONFIG_N_RX_DESC@ +#cmakedefine XLWIP_CONFIG_N_TX_COALESCE @XLWIP_CONFIG_N_TX_COALESCE@ +#cmakedefine XLWIP_CONFIG_N_RX_COALESCE @XLWIP_CONFIG_N_RX_COALESCE@ +#cmakedefine XLWIP_CONFIG_EMAC_NUMBER @XLWIP_CONFIG_EMAC_NUMBER@ +#cmakedefine XLWIP_CONFIG_PCS_PMA_1000BASEX_CORE_PRESENT @XLWIP_CONFIG_PCS_PMA_1000BASEX_CORE_PRESENT@ +#cmakedefine XLWIP_CONFIG_PCS_PMA_SGMII_CORE_PRESENT @XLWIP_CONFIG_PCS_PMA_SGMII_CORE_PRESENT@ +*/ #endif diff --git a/bsp_z7/lwip/xilinx_eth/netif/CMakeLists.txt b/bsp_z7/lwip/xilinx_eth/netif/CMakeLists.txt new file mode 100644 index 0000000..1821e0c --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/netif/CMakeLists.txt @@ -0,0 +1,12 @@ +target_sources(lwip_xil PRIVATE + xadapter.c + xpqueue.c + xemacpsif_dma.c + xemacpsif_physpeed.c + xemacpsif_hw.c + xemacpsif.c + topology.c +) + +target_include_directories(lwip_xil PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) + diff --git a/bsp_z7/lwip/xilinx_eth/netif/topology.c b/bsp_z7/lwip/xilinx_eth/netif/topology.c new file mode 100644 index 0000000..ad8393c --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/netif/topology.c @@ -0,0 +1,37 @@ +#include "netif/xtopology.h" + +// struct xtopology_t { +// UINTPTR emac_baseaddr; +// enum xemac_types emac_type; +// #ifndef SDT +// UINTPTR intc_baseaddr; +// unsigned intc_emac_intr; /* valid only for xemac_type_xps_emaclite */ +// UINTPTR scugic_baseaddr; /* valid only for Zynq */ +// unsigned scugic_emac_intr; /* valid only for GEM */ +// #endif +// }; + + +int xtopology_n_emacs = 2; +struct xtopology_t xtopology[] = { + { + 0xE000B000, + xemac_type_emacps, +#ifndef SDT + 0, + 0, + 0xF8F00100, + 0x36 +#endif + }, + { + 0xE000C000, + xemac_type_emacps, +#ifndef SDT + 0, + 0, + 0xF8F00100, + 0x4D +#endif + } +}; \ No newline at end of file diff --git a/bsp_z7/lwip/xilinx_eth/port/CMakeLists.txt b/bsp_z7/lwip/xilinx_eth/port/CMakeLists.txt new file mode 100644 index 0000000..93b6114 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/port/CMakeLists.txt @@ -0,0 +1,5 @@ +target_sources(lwip_xil PRIVATE + sys_arch.c + sys_arch_raw.c +) + diff --git a/bsp_z7/lwip/xilinx_eth/xethernet.c b/bsp_z7/lwip/xilinx_eth/xethernet.c new file mode 100644 index 0000000..1cae547 --- /dev/null +++ b/bsp_z7/lwip/xilinx_eth/xethernet.c @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2017 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2023 Advanced Micro Devices, 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. + * + */ + +#include "lwip/inet.h" +#include "lwip/tcpip.h" +#include "netif/xadapter.h" + +#define PLATFORM_EMAC_BASEADDR 0xE000B000 + +#define THREAD_STACKSIZE 1024 + +#define DEFAULT_IP_ADDRESS "192.168.1.10" +#define DEFAULT_IP_MASK "255.255.255.0" +#define DEFAULT_GW_ADDRESS "192.168.1.1" + +struct netif server_netif; + +// u32_t sys_now(void) { return xTaskGetTickCount() * portTICK_PERIOD_MS; } + +static void print_ip(char *msg, ip_addr_t *ip) { + xil_printf(msg); + xil_printf("%d.%d.%d.%d\n\r", ip4_addr1(ip), ip4_addr2(ip), ip4_addr3(ip), + ip4_addr4(ip)); +} + +static void print_ip_settings(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw) { + print_ip("Board IP: ", ip); + print_ip("Netmask : ", mask); + print_ip("Gateway : ", gw); +} + +// static void assign_default_ip(ip_addr_t *ip, ip_addr_t *mask, ip_addr_t *gw) +// { +// int err; + +// xil_printf("Configuring default IP %s \r\n", DEFAULT_IP_ADDRESS); + +// err = inet_aton(DEFAULT_IP_ADDRESS, ip); +// if (!err) +// xil_printf("Invalid default IP address: %d\r\n", err); + +// err = inet_aton(DEFAULT_IP_MASK, mask); +// if (!err) +// xil_printf("Invalid default IP MASK: %d\r\n", err); + +// err = inet_aton(DEFAULT_GW_ADDRESS, gw); +// if (!err) +// xil_printf("Invalid default gateway address: %d\r\n", err); +// } + +void init_thread(void *_) { + + /* the mac address of the board. this should be unique per board */ + u8_t mac_ethernet_address[] = {0x00, 0x0a, 0x35, 0x00, 0x01, 0x02}; + + /* Add network interface to the netif_list, and set it as default */ + ip_addr_t ip, mask, gw; + int err = inet_aton(DEFAULT_IP_ADDRESS, &ip); + if (!err) + xil_printf("Invalid default IP address: %d\r\n", err); + + err = inet_aton(DEFAULT_IP_MASK, &mask); + if (!err) + xil_printf("Invalid default IP MASK: %d\r\n", err); + + err = inet_aton(DEFAULT_GW_ADDRESS, &gw); + if (!err) + xil_printf("Invalid default gateway address: %d\r\n", err); + if (!xemac_add(&server_netif, &ip, &mask, &gw, mac_ethernet_address, + PLATFORM_EMAC_BASEADDR)) { + xil_printf("Error adding N/W interface\r\n"); + return; + } + + netif_set_default(&server_netif); + + /* specify that the network if is up */ + netif_set_up(&server_netif); + + /* start packet receive thread - required for lwIP operation */ + sys_thread_new("xemacif_input_thread", (void (*)(void *))xemacif_input_thread, + &server_netif, THREAD_STACKSIZE, DEFAULT_THREAD_PRIO); + + print_ip_settings(&(server_netif.ip_addr), &(server_netif.netmask), + &(server_netif.gw)); + xil_printf("\r\n"); + + // Some allocations do not allow task deletion + // vTaskDelete(NULL); + vTaskSuspend(NULL); +} + +void xethernet_init() { + // pushed into thread so it only starts after threads are started + sys_thread_new("initxeth_thread", init_thread, 0, THREAD_STACKSIZE, + DEFAULT_THREAD_PRIO); +} \ No newline at end of file