diff --git a/CMakeLists.txt b/CMakeLists.txt index 92d231c..4030255 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,7 +47,7 @@ add_executable(${TARGET_NAME}) set (LWIP_INCLUDE_DIRS "${LWIP_DIR}/src/include" "bsp_z7/lwip/include" - ${LWIP_DIR}/contrib/ports/freertos/include + #${LWIP_DIR}/contrib/ports/freertos/include ) include(${LWIP_DIR}/src/Filelists.cmake) set(lwip_SRCS @@ -56,7 +56,7 @@ set(lwip_SRCS ${lwipcore6_SRCS} ${lwipnetif_SRCS} ${lwipapi_SRCS} - ${LWIP_DIR}/contrib/ports/freertos/sys_arch.c + #${LWIP_DIR}/contrib/ports/freertos/sys_arch.c #${LWIP_DIR}/src/netif/slipif.c #${LWIP_DIR}/src/apps/tftp/tftp.c ) diff --git a/bsp_z7/lwip/CMakeLists.txt b/bsp_z7/lwip/CMakeLists.txt index a642046..ff53adc 100644 --- a/bsp_z7/lwip/CMakeLists.txt +++ b/bsp_z7/lwip/CMakeLists.txt @@ -1 +1,2 @@ -add_subdirectory(netif) \ No newline at end of file +add_subdirectory(netif) +add_subdirectory(port) \ No newline at end of file diff --git a/bsp_z7/lwip/include/arch/cc.h b/bsp_z7/lwip/include/arch/cc.h index 4b17f04..75a584b 100644 --- a/bsp_z7/lwip/include/arch/cc.h +++ b/bsp_z7/lwip/include/arch/cc.h @@ -1,4 +1,40 @@ -#pragma once +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_CC_H__ +#define __ARCH_CC_H__ #include #include @@ -9,17 +45,43 @@ * by your system, set this to 0 and include in cc.h */ #define LWIP_TIMEVAL_PRIVATE 0 #include +#include "cpu.h" // 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 +// /* 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; + #define PACK_STRUCT_FIELD(x) x #define PACK_STRUCT_STRUCT __attribute__((packed)) #define PACK_STRUCT_BEGIN #define PACK_STRUCT_END #define LWIP_PLATFORM_ASSERT(x) -#define LWIP_PLATFORM_DIAG(x) do { printf x; } while(0) +#define LWIP_PLATFORM_DIAG(x) do { xil_printf x; } while(0) + +#endif /* __ARCH_CC_H__ */ diff --git a/bsp_z7/lwip/include/arch/cc_old.h b/bsp_z7/lwip/include/arch/cc_old.h new file mode 100644 index 0000000..4b17f04 --- /dev/null +++ b/bsp_z7/lwip/include/arch/cc_old.h @@ -0,0 +1,25 @@ +#pragma once + +#include +#include + +#include "lwipopts.h" + +/** if you want to use the struct timeval provided + * by your system, set this to 0 and include in cc.h */ +#define LWIP_TIMEVAL_PRIVATE 0 +#include + +// 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 LWIP_RAND rand + +#define PACK_STRUCT_FIELD(x) x +#define PACK_STRUCT_STRUCT __attribute__((packed)) +#define PACK_STRUCT_BEGIN +#define PACK_STRUCT_END + +#define LWIP_PLATFORM_ASSERT(x) +#define LWIP_PLATFORM_DIAG(x) do { printf x; } while(0) diff --git a/bsp_z7/lwip/include/arch/cpu.h b/bsp_z7/lwip/include/arch/cpu.h new file mode 100644 index 0000000..83c3489 --- /dev/null +++ b/bsp_z7/lwip/include/arch/cpu.h @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_CPU_H__ +#define __ARCH_CPU_H__ + +#include "lwipopts.h" + +#ifndef BYTE_ORDER +#ifdef PROCESSOR_LITTLE_ENDIAN +#define BYTE_ORDER LITTLE_ENDIAN +#else +#define BYTE_ORDER BIG_ENDIAN +#endif +#endif + +#endif /* __ARCH_CPU_H__ */ diff --git a/bsp_z7/lwip/include/arch/perf.h b/bsp_z7/lwip/include/arch/perf.h new file mode 100644 index 0000000..76181e6 --- /dev/null +++ b/bsp_z7/lwip/include/arch/perf.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __ARCH_PERF_H__ +#define __ARCH_PERF_H__ + +#define PERF_START /* null definition */ +#define PERF_STOP(x) /* null definition */ + +#ifdef __cplusplus +extern "C" { +#endif + +void perf_init(char *fname); + +#ifdef __cplusplus +} +#endif + +#endif /* __ARCH_PERF_H__ */ diff --git a/bsp_z7/lwip/include/arch/sys_arch.h b/bsp_z7/lwip/include/arch/sys_arch.h new file mode 100644 index 0000000..f8d29d0 --- /dev/null +++ b/bsp_z7/lwip/include/arch/sys_arch.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * + */ + +#ifndef __SYS_XILINX_ARCH_H__ +#define __SYS_XILINX_ARCH_H__ + +#ifdef __cplusplus +extern "C" { +#endif +#include "lwipopts.h" + + +#if !NO_SYS + +#include "FreeRTOS.h" +#include "task.h" +#include "queue.h" +#include "semphr.h" +#include "timers.h" + +#define SYS_MBOX_NULL ( ( xQueueHandle ) NULL ) +#define SYS_SEM_NULL ( ( xSemaphoreHandle ) NULL ) +#define SYS_DEFAULT_THREAD_STACK_DEPTH configMINIMAL_STACK_SIZE + +typedef xSemaphoreHandle sys_sem_t; +typedef xSemaphoreHandle sys_mutex_t; +typedef xQueueHandle sys_mbox_t; +typedef xTaskHandle sys_thread_t; + +typedef unsigned long sys_prot_t; + +#define sys_mbox_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) +#define sys_mbox_set_invalid( x ) ( ( *x ) = NULL ) +#define sys_sem_valid( x ) ( ( ( *x ) == NULL) ? pdFALSE : pdTRUE ) +#define sys_sem_set_invalid( x ) ( ( *x ) = NULL ) +#endif /* !NO_SYS */ + +#ifdef __cplusplus +} +#endif + +#endif /* __SYS_XILINX_ARCH_H__ */ diff --git a/bsp_z7/lwip/netif/xemacpsif_dma.c b/bsp_z7/lwip/netif/xemacpsif_dma.c index 3d09c70..74112e1 100644 --- a/bsp_z7/lwip/netif/xemacpsif_dma.c +++ b/bsp_z7/lwip/netif/xemacpsif_dma.c @@ -124,8 +124,7 @@ static volatile u32_t bd_space_index = 0; static volatile u32_t bd_space_attr_set = 0; #if !NO_SYS -//extern u32 xInsideISR; -u32 xInsideISR; // TODO check if we are ISR safe +extern u32 xInsideISR; #endif #define XEMACPS_BD_TO_INDEX(ringptr, bdptr) \ @@ -577,10 +576,10 @@ void emacps_recv_handler(void *arg) setup_rx_bds(xemacpsif, rxring); } #if !NO_SYS - BaseType_t xHigherPriorityTaskWoken; - xSemaphoreGiveFromISR(xemac->sem_rx_data_available.sem, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //TODO delay this? - //sys_sem_signal(&xemac->sem_rx_data_available); + // BaseType_t xHigherPriorityTaskWoken; + // xSemaphoreGiveFromISR(xemac->sem_rx_data_available.sem, &xHigherPriorityTaskWoken); + // portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //TODO delay this? + sys_sem_signal(&xemac->sem_rx_data_available); xInsideISR--; #endif diff --git a/bsp_z7/lwip/port/CMakeLists.txt b/bsp_z7/lwip/port/CMakeLists.txt new file mode 100644 index 0000000..76302bd --- /dev/null +++ b/bsp_z7/lwip/port/CMakeLists.txt @@ -0,0 +1,5 @@ +target_sources(lwip PRIVATE + sys_arch.c + sys_arch_raw.c +) + diff --git a/bsp_z7/lwip/port/sys_arch.c b/bsp_z7/lwip/port/sys_arch.c new file mode 100644 index 0000000..b2f3ae3 --- /dev/null +++ b/bsp_z7/lwip/port/sys_arch.c @@ -0,0 +1,622 @@ +/* sys_arch.c - + * provide sys_arch functionality as required for lwIP + * most of this functionality is obtained from FreeRTOS + * this file acts as a wrapper around the FreeRTOS functions + */ + +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + * Author: Adam Dunkels + * Simon Goldschmidt + * + */ + +#include "lwipopts.h" + +#if !NO_SYS + +#include "arch/sys_arch.h" + +/* ------------------------ lwIP includes --------------------------------- */ +#include "lwip/opt.h" + +#include "lwip/debug.h" +#include "lwip/def.h" +#include "lwip/sys.h" +#include "lwip/mem.h" +#include "lwip/stats.h" + +/* Very crude mechanism used to determine if the critical section handling +functions are being called from an interrupt context or not. This relies on +the interrupt handler setting this variable manually. */ +u32 xInsideISR; + +/*---------------------------------------------------------------------------* + * Routine: sys_mbox_new + *---------------------------------------------------------------------------* + * Description: + * Creates a new mailbox + * Inputs: + * int size -- Size of elements in the mailbox + * Outputs: + * sys_mbox_t -- Handle to new mailbox + *---------------------------------------------------------------------------*/ +err_t sys_mbox_new( sys_mbox_t *pxMailBox, int iSize ) +{ +err_t xReturn = ERR_MEM; + + *pxMailBox = xQueueCreate( iSize, sizeof( void * ) ); + + if( *pxMailBox != NULL ) + { + xReturn = ERR_OK; + SYS_STATS_INC_USED( mbox ); + } + return xReturn; +} + + +/*---------------------------------------------------------------------------* + * Routine: sys_mbox_free + *---------------------------------------------------------------------------* + * Description: + * Deallocates a mailbox. If there are messages still present in the + * mailbox when the mailbox is deallocated, it is an indication of a + * programming error in lwIP and the developer should be notified. + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * Outputs: + * sys_mbox_t -- Handle to new mailbox + *---------------------------------------------------------------------------*/ +void sys_mbox_free( sys_mbox_t *pxMailBox ) +{ +unsigned long ulMessagesWaiting; + + ulMessagesWaiting = uxQueueMessagesWaiting( *pxMailBox ); + configASSERT( ( ulMessagesWaiting == 0 ) ); + + #if SYS_STATS + { + if( ulMessagesWaiting != 0UL ) + { + SYS_STATS_INC( mbox.err ); + } + + SYS_STATS_DEC( mbox.used ); + } + #endif /* SYS_STATS */ + + vQueueDelete( *pxMailBox ); +} + +/*---------------------------------------------------------------------------* + * Routine: sys_mbox_post + *---------------------------------------------------------------------------* + * Description: + * Post the "msg" to the mailbox. + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * void *data -- Pointer to data to post + *---------------------------------------------------------------------------*/ +void sys_mbox_post( sys_mbox_t *pxMailBox, void *pxMessageToPost ) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + if( xInsideISR != pdFALSE ) { + xQueueSendToBackFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + xQueueSendToBack( *pxMailBox, &pxMessageToPost, portMAX_DELAY ); +} + +/*---------------------------------------------------------------------------* + * Routine: sys_mbox_trypost + *---------------------------------------------------------------------------* + * Description: + * Try to post the "msg" to the mailbox. Returns immediately with + * error if cannot. + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * void *msg -- Pointer to data to post + * Outputs: + * err_t -- ERR_OK if message posted, else ERR_MEM + * if not. + *---------------------------------------------------------------------------*/ +err_t sys_mbox_trypost( sys_mbox_t *pxMailBox, void *pxMessageToPost ) +{ +err_t xReturn; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + if( xInsideISR != pdFALSE ) + { + xReturn = xQueueSendFromISR( *pxMailBox, &pxMessageToPost, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + { + xReturn = xQueueSend( *pxMailBox, &pxMessageToPost, ( portTickType ) 0 ); + } + + if( xReturn == pdPASS ) + { + xReturn = ERR_OK; + } + else + { + LWIP_DEBUGF(NETIF_DEBUGF, ("Queue is full\r\n")); + /* The queue was already full. */ + xReturn = ERR_MEM; + SYS_STATS_INC( mbox.err ); + } + + return xReturn; +} + +/*---------------------------------------------------------------------------* + * Routine: sys_arch_mbox_fetch + *---------------------------------------------------------------------------* + * Description: + * Blocks the thread until a message arrives in the mailbox, but does + * not block the thread longer than "timeout" milliseconds (similar to + * the sys_arch_sem_wait() function). The "msg" argument is a result + * parameter that is set by the function (i.e., by doing "*msg = + * ptr"). The "msg" parameter maybe NULL to indicate that the message + * should be dropped. + * + * The return values are the same as for the sys_arch_sem_wait() function: + * Number of milliseconds spent waiting or SYS_ARCH_TIMEOUT if there was a + * timeout. + * + * Note that a function with a similar name, sys_mbox_fetch(), is + * implemented by lwIP. + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * void **msg -- Pointer to pointer to msg received + * u32_t timeout -- Number of milliseconds until timeout + * Outputs: + * u32_t -- SYS_ARCH_TIMEOUT if timeout, else number + * of milliseconds until received. + *---------------------------------------------------------------------------*/ +u32_t sys_arch_mbox_fetch( sys_mbox_t *pxMailBox, void **ppvBuffer, u32_t ulTimeOut ) +{ +void *pvDummy; +portTickType xStartTime, xEndTime, xElapsed; +unsigned long ulReturn; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + xStartTime = xTaskGetTickCount(); + + if( NULL == ppvBuffer ) + { + ppvBuffer = &pvDummy; + } + + if( ulTimeOut != 0UL ) + { + if( xInsideISR != pdFALSE ) { + if( pdTRUE == xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken ) ) + { + xEndTime = xTaskGetTickCount(); + xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS; + ulReturn = xElapsed; + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + { + *ppvBuffer = NULL; + ulReturn = SYS_ARCH_TIMEOUT; + } + } else { + if( pdTRUE == xQueueReceive( *pxMailBox, &( *ppvBuffer ), ulTimeOut/ portTICK_RATE_MS ) ) + { + xEndTime = xTaskGetTickCount(); + xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS; + + ulReturn = xElapsed; + } + else + { + /* Timed out. */ + *ppvBuffer = NULL; + ulReturn = SYS_ARCH_TIMEOUT; + } + } + } + else + { + if( xInsideISR != pdFALSE ) { + xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + xQueueReceive( *pxMailBox, &( *ppvBuffer ), portMAX_DELAY ); + xEndTime = xTaskGetTickCount(); + xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS; + + if( xElapsed == 0UL ) + { + xElapsed = 1UL; + } + + ulReturn = xElapsed; + } + + return ulReturn; +} + +/*---------------------------------------------------------------------------* + * Routine: sys_arch_mbox_tryfetch + *---------------------------------------------------------------------------* + * Description: + * Similar to sys_arch_mbox_fetch, but if message is not ready + * immediately, we'll return with SYS_MBOX_EMPTY. On success, 0 is + * returned. + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * void **msg -- Pointer to pointer to msg received + * Outputs: + * u32_t -- SYS_MBOX_EMPTY if no messages. Otherwise, + * return ERR_OK. + *---------------------------------------------------------------------------*/ +u32_t sys_arch_mbox_tryfetch( sys_mbox_t *pxMailBox, void **ppvBuffer ) +{ +void *pvDummy; +unsigned long ulReturn; +long lResult; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + if( ppvBuffer== NULL ) + { + ppvBuffer = &pvDummy; + } + + if( xInsideISR != pdFALSE ) + { + lResult = xQueueReceiveFromISR( *pxMailBox, &( *ppvBuffer ), &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + { + lResult = xQueueReceive( *pxMailBox, &( *ppvBuffer ), 0UL ); + } + + if( lResult == pdPASS ) + { + ulReturn = ERR_OK; + } + else + { + ulReturn = SYS_MBOX_EMPTY; + } + + return ulReturn; +} + +/*---------------------------------------------------------------------------* + * Routine: sys_sem_new + *---------------------------------------------------------------------------* + * Description: + * Creates and returns a new semaphore. The "ucCount" argument specifies + * the initial state of the semaphore. + * NOTE: Currently this routine only creates counts of 1 or 0 + * Inputs: + * sys_mbox_t mbox -- Handle of mailbox + * u8_t ucCount -- Initial ucCount of semaphore (1 or 0) + * Outputs: + * sys_sem_t -- Created semaphore or 0 if could not create. + *---------------------------------------------------------------------------*/ +err_t sys_sem_new( sys_sem_t *pxSemaphore, u8_t ucCount ) +{ + (void) ucCount; +err_t xReturn = ERR_MEM; + + *pxSemaphore = xSemaphoreCreateBinary(); + + if( *pxSemaphore != NULL ) + { + xReturn = ERR_OK; + SYS_STATS_INC_USED( sem ); + } + else + { + LWIP_DEBUGF(SYS_DEBUG, ("Sem creation error\r\n")); + SYS_STATS_INC( sem.err ); + } + + return xReturn; +} + +/*---------------------------------------------------------------------------* + * Routine: sys_arch_sem_wait + *---------------------------------------------------------------------------* + * Description: + * Blocks the thread while waiting for the semaphore to be + * signaled. If the "timeout" argument is non-zero, the thread should + * only be blocked for the specified time (measured in + * milliseconds). + * + * If the timeout argument is non-zero, the return value is the number of + * milliseconds spent waiting for the semaphore to be signaled. If the + * semaphore wasn't signaled within the specified time, the return value is + * SYS_ARCH_TIMEOUT. If the thread didn't have to wait for the semaphore + * (i.e., it was already signaled), the function may return zero. + * + * Notice that lwIP implements a function with a similar name, + * sys_sem_wait(), that uses the sys_arch_sem_wait() function. + * Inputs: + * sys_sem_t sem -- Semaphore to wait on + * u32_t timeout -- Number of milliseconds until timeout + * Outputs: + * u32_t -- Time elapsed or SYS_ARCH_TIMEOUT. + *---------------------------------------------------------------------------*/ +u32_t sys_arch_sem_wait( sys_sem_t *pxSemaphore, u32_t ulTimeout ) +{ +portTickType xStartTime, xEndTime, xElapsed; +unsigned long ulReturn; +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + xStartTime = xTaskGetTickCount(); + + if( ulTimeout != 0UL ) + { + if( xInsideISR != pdFALSE ) { + if( xSemaphoreTakeFromISR( *pxSemaphore, &xHigherPriorityTaskWoken ) == pdTRUE ) + { + xEndTime = xTaskGetTickCount(); + xElapsed = (xEndTime - xStartTime) * portTICK_RATE_MS; + ulReturn = xElapsed; + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + { + ulReturn = SYS_ARCH_TIMEOUT; + } + } else { + if( xSemaphoreTake( *pxSemaphore, ulTimeout / portTICK_RATE_MS ) == pdTRUE ) + { + xEndTime = xTaskGetTickCount(); + xElapsed = (xEndTime - xStartTime) * portTICK_RATE_MS; + ulReturn = xElapsed; + } + else + { + ulReturn = SYS_ARCH_TIMEOUT; + } + } + } + else + { + if( xInsideISR != pdFALSE ) { + xSemaphoreTakeFromISR( *pxSemaphore, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + xSemaphoreTake( *pxSemaphore, portMAX_DELAY ); + xEndTime = xTaskGetTickCount(); + xElapsed = ( xEndTime - xStartTime ) * portTICK_RATE_MS; + + if( xElapsed == 0UL ) + { + xElapsed = 1UL; + } + + ulReturn = xElapsed; + } + + return ulReturn; +} + +/** Create a new mutex + * @param mutex pointer to the mutex to create + * @return a new mutex */ +err_t sys_mutex_new( sys_mutex_t *pxMutex ) +{ +err_t xReturn = ERR_MEM; + + *pxMutex = xSemaphoreCreateMutex(); + + if( *pxMutex != NULL ) + { + xReturn = ERR_OK; + SYS_STATS_INC_USED( mutex ); + } + else + { + LWIP_DEBUGF(SYS_DEBUG, ("Mutex creation error\r\n")); + SYS_STATS_INC( mutex.err ); + } + + return xReturn; +} + +/** Lock a mutex + * @param mutex the mutex to lock */ +void sys_mutex_lock( sys_mutex_t *pxMutex ) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + if( xInsideISR != pdFALSE ) { + xSemaphoreTakeFromISR( *pxMutex, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + xSemaphoreTake( *pxMutex, portMAX_DELAY ); +} + +/** Unlock a mutex + * @param mutex the mutex to unlock */ +void sys_mutex_unlock(sys_mutex_t *pxMutex ) +{ + portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + if( xInsideISR != pdFALSE ) { + xSemaphoreGiveFromISR( *pxMutex, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + else + xSemaphoreGive( *pxMutex ); +} + + +/** Delete a semaphore + * @param mutex the mutex to delete */ +void sys_mutex_free( sys_mutex_t *pxMutex ) +{ + SYS_STATS_DEC( mutex.used ); + vQueueDelete( *pxMutex ); +} + + +/*---------------------------------------------------------------------------* + * Routine: sys_sem_signal + *---------------------------------------------------------------------------* + * Description: + * Signals (releases) a semaphore + * Inputs: + * sys_sem_t sem -- Semaphore to signal + *---------------------------------------------------------------------------*/ +void sys_sem_signal( sys_sem_t *pxSemaphore ) +{ +portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE; + + if( xInsideISR != pdFALSE ) + { + xSemaphoreGiveFromISR( *pxSemaphore, &xHigherPriorityTaskWoken ); + if (xHigherPriorityTaskWoken == pdTRUE) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } + } + else + { + xSemaphoreGive( *pxSemaphore ); + } +} + +/*---------------------------------------------------------------------------* + * Routine: sys_sem_free + *---------------------------------------------------------------------------* + * Description: + * Deallocates a semaphore + * Inputs: + * sys_sem_t sem -- Semaphore to free + *---------------------------------------------------------------------------*/ +void sys_sem_free( sys_sem_t *pxSemaphore ) +{ + SYS_STATS_DEC(sem.used); + vQueueDelete( *pxSemaphore ); +} + +/*---------------------------------------------------------------------------* + * Routine: sys_init + *---------------------------------------------------------------------------* + * Description: + * Initialize sys arch + *---------------------------------------------------------------------------*/ +void sys_init(void) +{ +} + +u32_t sys_now(void) +{ + return ((xTaskGetTickCount() * 1000) / configTICK_RATE_HZ); +} + +/*---------------------------------------------------------------------------* + * Routine: sys_thread_new + *---------------------------------------------------------------------------* + * Description: + * Starts a new thread with priority "prio" that will begin its + * execution in the function "thread()". The "arg" argument will be + * passed as an argument to the thread() function. The id of the new + * thread is returned. Both the id and the priority are system + * dependent. + * Inputs: + * char *name -- Name of thread + * void (* thread)(void *arg) -- Pointer to function to run. + * void *arg -- Argument passed into function + * int stacksize -- Required stack amount in bytes + * int prio -- Thread priority + * Outputs: + * sys_thread_t -- Pointer to per-thread timeouts. + *---------------------------------------------------------------------------*/ +sys_thread_t sys_thread_new( const char *pcName, void( *pxThread )( void *pvParameters ), void *pvArg, int iStackSize, int iPriority ) +{ +xTaskHandle xCreatedTask; +portBASE_TYPE xResult; +sys_thread_t xReturn; + + xResult = xTaskCreate( pxThread, ( const char * const) pcName, iStackSize, pvArg, iPriority, &xCreatedTask ); + + if( xResult == pdPASS ) + { + xReturn = xCreatedTask; + } + else + { + xReturn = NULL; + } + + return xReturn; +} + + +/* + * Prints an assertion messages and aborts execution. + */ +void sys_assert( const char *pcMessage ) +{ + (void) pcMessage; + + for (;;) + { + } +} +/*-------------------------------------------------------------------------* + * End of File: sys_arch.c + *-------------------------------------------------------------------------*/ + + +#endif diff --git a/bsp_z7/lwip/port/sys_arch_raw.c b/bsp_z7/lwip/port/sys_arch_raw.c new file mode 100644 index 0000000..6d7f252 --- /dev/null +++ b/bsp_z7/lwip/port/sys_arch_raw.c @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2001-2003 Swedish Institute of Computer Science. + * Copyright (C) 2007 - 2022 Xilinx, Inc. + * Copyright (C) 2022 - 2024 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. + * + * This file is part of the lwIP TCP/IP stack. + * + */ + +#include "xlwipconfig.h" + +#ifdef __MICROBLAZE__ +#include "mb_interface.h" +#endif + +#ifdef __riscv +#include "riscv_interface.h" +#endif + +#include "arch/cc.h" +#include "lwip/sys.h" + +/* + * This optional function does a "fast" critical region protection and returns + * the previous protection level. This function is only called during very short + * critical regions. An embedded system which supports ISR-based drivers might + * want to implement this function by disabling interrupts. Task-based systems + * might want to implement this by using a mutex or disabling tasking. This + * function should support recursive calls from the same task or interrupt. In + * other words, sys_arch_protect() could be called while already protected. In + * that case the return value indicates that it is already protected. + * sys_arch_protect() is only required if your port is supporting an operating + * system. + */ +sys_prot_t +sys_arch_protect() +{ + sys_prot_t cur; +#ifdef __MICROBLAZE__ + cur = mfmsr(); + mtmsr(cur & ~0x2); +#elif __arm__ + cur = mfcpsr(); + mtcpsr(cur | 0xC0); +#elif __aarch64__ + cur = mfcpsr(); + mtcpsr(cur | 0xC0); +#endif + return cur; +} + +/* + * This optional function does a "fast" set of critical region protection to the + * value specified by pval. See the documentation for sys_arch_protect() for + * more information. This function is only required if your port is supporting + * an operating system. + */ +void +sys_arch_unprotect(sys_prot_t lev) +{ +#if defined (__arm__) || defined (__aarch64__) + mtcpsr(lev); +#else + mtmsr(lev); +#endif +} diff --git a/bsp_z7/main.c b/bsp_z7/main.c index 70d8eea..6bca562 100644 --- a/bsp_z7/main.c +++ b/bsp_z7/main.c @@ -65,7 +65,7 @@ int main(void) { // printf("Booting Software\n"); - //testEth(); + testEth(); mission(); } diff --git a/bsp_z7/testEth.c b/bsp_z7/testEth.c index 02f7bf4..b4f38f2 100644 --- a/bsp_z7/testEth.c +++ b/bsp_z7/testEth.c @@ -114,10 +114,10 @@ void network_thread() { /* 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); + /* 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); #if LWIP_DHCP == 1 dhcp_start(&server_netif); diff --git a/mission_rust/src/lib.rs b/mission_rust/src/lib.rs index 6ce067a..62f7041 100644 --- a/mission_rust/src/lib.rs +++ b/mission_rust/src/lib.rs @@ -17,9 +17,9 @@ extern "C" { #[panic_handler] fn panic(panic: &PanicInfo<'_>) -> ! { - unsafe { - osal::stop_it(); - } + // unsafe { this breaks in ISR + // osal::stop_it(); + // } // TODO: Make this unicode-safe _ = writeln!(crate::fsrc::sif::Stderr {},""); _ = write!(crate::fsrc::sif::Stderr {},"in task \"");