forked from ROMEO/obsw
better, not done
This commit is contained in:
parent
2d8d8aeb0a
commit
6c556b8fbf
@ -47,7 +47,7 @@ add_executable(${TARGET_NAME})
|
|||||||
set (LWIP_INCLUDE_DIRS
|
set (LWIP_INCLUDE_DIRS
|
||||||
"${LWIP_DIR}/src/include"
|
"${LWIP_DIR}/src/include"
|
||||||
"bsp_z7/lwip/include"
|
"bsp_z7/lwip/include"
|
||||||
${LWIP_DIR}/contrib/ports/freertos/include
|
#${LWIP_DIR}/contrib/ports/freertos/include
|
||||||
)
|
)
|
||||||
include(${LWIP_DIR}/src/Filelists.cmake)
|
include(${LWIP_DIR}/src/Filelists.cmake)
|
||||||
set(lwip_SRCS
|
set(lwip_SRCS
|
||||||
@ -56,7 +56,7 @@ set(lwip_SRCS
|
|||||||
${lwipcore6_SRCS}
|
${lwipcore6_SRCS}
|
||||||
${lwipnetif_SRCS}
|
${lwipnetif_SRCS}
|
||||||
${lwipapi_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/netif/slipif.c
|
||||||
#${LWIP_DIR}/src/apps/tftp/tftp.c
|
#${LWIP_DIR}/src/apps/tftp/tftp.c
|
||||||
)
|
)
|
||||||
|
@ -1 +1,2 @@
|
|||||||
add_subdirectory(netif)
|
add_subdirectory(netif)
|
||||||
|
add_subdirectory(port)
|
@ -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 <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __ARCH_CC_H__
|
||||||
|
#define __ARCH_CC_H__
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -9,17 +45,43 @@
|
|||||||
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
||||||
#define LWIP_TIMEVAL_PRIVATE 0
|
#define LWIP_TIMEVAL_PRIVATE 0
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include "cpu.h"
|
||||||
|
|
||||||
// errno is a macro. If we define LWIP_ERRNO_INCLUDE to errno.h the preprocessor will replace it,
|
// 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
|
// breaking the include. Instead we supply a helper include which in turn includes errno.h
|
||||||
#define LWIP_ERRNO_INCLUDE <onrre.h>
|
#define LWIP_ERRNO_INCLUDE <onrre.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
|
||||||
|
|
||||||
|
// 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
|
#define LWIP_RAND rand
|
||||||
|
|
||||||
|
// typedef unsigned long mem_ptr_t;
|
||||||
|
|
||||||
#define PACK_STRUCT_FIELD(x) x
|
#define PACK_STRUCT_FIELD(x) x
|
||||||
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
#define PACK_STRUCT_STRUCT __attribute__((packed))
|
||||||
#define PACK_STRUCT_BEGIN
|
#define PACK_STRUCT_BEGIN
|
||||||
#define PACK_STRUCT_END
|
#define PACK_STRUCT_END
|
||||||
|
|
||||||
#define LWIP_PLATFORM_ASSERT(x)
|
#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__ */
|
||||||
|
25
bsp_z7/lwip/include/arch/cc_old.h
Normal file
25
bsp_z7/lwip/include/arch/cc_old.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "lwipopts.h"
|
||||||
|
|
||||||
|
/** if you want to use the struct timeval provided
|
||||||
|
* by your system, set this to 0 and include <sys/time.h> in cc.h */
|
||||||
|
#define LWIP_TIMEVAL_PRIVATE 0
|
||||||
|
#include <sys/time.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 <onrre.h>
|
||||||
|
|
||||||
|
#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)
|
49
bsp_z7/lwip/include/arch/cpu.h
Normal file
49
bsp_z7/lwip/include/arch/cpu.h
Normal file
@ -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 <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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__ */
|
52
bsp_z7/lwip/include/arch/perf.h
Normal file
52
bsp_z7/lwip/include/arch/perf.h
Normal file
@ -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 <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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__ */
|
74
bsp_z7/lwip/include/arch/sys_arch.h
Normal file
74
bsp_z7/lwip/include/arch/sys_arch.h
Normal file
@ -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 <adam@sics.se>
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#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__ */
|
@ -124,8 +124,7 @@ static volatile u32_t bd_space_index = 0;
|
|||||||
static volatile u32_t bd_space_attr_set = 0;
|
static volatile u32_t bd_space_attr_set = 0;
|
||||||
|
|
||||||
#if !NO_SYS
|
#if !NO_SYS
|
||||||
//extern u32 xInsideISR;
|
extern u32 xInsideISR;
|
||||||
u32 xInsideISR; // TODO check if we are ISR safe
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define XEMACPS_BD_TO_INDEX(ringptr, bdptr) \
|
#define XEMACPS_BD_TO_INDEX(ringptr, bdptr) \
|
||||||
@ -577,10 +576,10 @@ void emacps_recv_handler(void *arg)
|
|||||||
setup_rx_bds(xemacpsif, rxring);
|
setup_rx_bds(xemacpsif, rxring);
|
||||||
}
|
}
|
||||||
#if !NO_SYS
|
#if !NO_SYS
|
||||||
BaseType_t xHigherPriorityTaskWoken;
|
// BaseType_t xHigherPriorityTaskWoken;
|
||||||
xSemaphoreGiveFromISR(xemac->sem_rx_data_available.sem, &xHigherPriorityTaskWoken);
|
// xSemaphoreGiveFromISR(xemac->sem_rx_data_available.sem, &xHigherPriorityTaskWoken);
|
||||||
portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //TODO delay this?
|
// portYIELD_FROM_ISR(xHigherPriorityTaskWoken); //TODO delay this?
|
||||||
//sys_sem_signal(&xemac->sem_rx_data_available);
|
sys_sem_signal(&xemac->sem_rx_data_available);
|
||||||
xInsideISR--;
|
xInsideISR--;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
5
bsp_z7/lwip/port/CMakeLists.txt
Normal file
5
bsp_z7/lwip/port/CMakeLists.txt
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
target_sources(lwip PRIVATE
|
||||||
|
sys_arch.c
|
||||||
|
sys_arch_raw.c
|
||||||
|
)
|
||||||
|
|
622
bsp_z7/lwip/port/sys_arch.c
Normal file
622
bsp_z7/lwip/port/sys_arch.c
Normal file
@ -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 <adam@sics.se>
|
||||||
|
* 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
|
89
bsp_z7/lwip/port/sys_arch_raw.c
Normal file
89
bsp_z7/lwip/port/sys_arch_raw.c
Normal file
@ -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
|
||||||
|
}
|
@ -65,7 +65,7 @@ int main(void) {
|
|||||||
|
|
||||||
// printf("Booting Software\n");
|
// printf("Booting Software\n");
|
||||||
|
|
||||||
//testEth();
|
testEth();
|
||||||
|
|
||||||
mission();
|
mission();
|
||||||
}
|
}
|
||||||
|
@ -114,10 +114,10 @@ void network_thread() {
|
|||||||
/* specify that the network if is up */
|
/* specify that the network if is up */
|
||||||
netif_set_up(&server_netif);
|
netif_set_up(&server_netif);
|
||||||
|
|
||||||
// /* start packet receive thread - required for lwIP operation */
|
/* start packet receive thread - required for lwIP operation */
|
||||||
// sys_thread_new("xemacif_input_thread",
|
sys_thread_new("xemacif_input_thread",
|
||||||
// (void(*)(void*))xemacif_input_thread, &server_netif,
|
(void(*)(void*))xemacif_input_thread, &server_netif,
|
||||||
// THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
|
THREAD_STACKSIZE, DEFAULT_THREAD_PRIO);
|
||||||
|
|
||||||
#if LWIP_DHCP == 1
|
#if LWIP_DHCP == 1
|
||||||
dhcp_start(&server_netif);
|
dhcp_start(&server_netif);
|
||||||
|
@ -17,9 +17,9 @@ extern "C" {
|
|||||||
|
|
||||||
#[panic_handler]
|
#[panic_handler]
|
||||||
fn panic(panic: &PanicInfo<'_>) -> ! {
|
fn panic(panic: &PanicInfo<'_>) -> ! {
|
||||||
unsafe {
|
// unsafe { this breaks in ISR
|
||||||
osal::stop_it();
|
// osal::stop_it();
|
||||||
}
|
// }
|
||||||
// TODO: Make this unicode-safe
|
// TODO: Make this unicode-safe
|
||||||
_ = writeln!(crate::fsrc::sif::Stderr {},"");
|
_ = writeln!(crate::fsrc::sif::Stderr {},"");
|
||||||
_ = write!(crate::fsrc::sif::Stderr {},"in task \"");
|
_ = write!(crate::fsrc::sif::Stderr {},"in task \"");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user