initial commit
This commit is contained in:
373
port/threadx/inc/csr.h
Normal file
373
port/threadx/inc/csr.h
Normal file
@@ -0,0 +1,373 @@
|
||||
/***************************************************************************
|
||||
* Copyright (c) 2024 Microsoft Corporation
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the MIT License which is available at
|
||||
* https://opensource.org/licenses/MIT.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
**************************************************************************/
|
||||
|
||||
|
||||
#ifndef CSR_H
|
||||
#define CSR_H
|
||||
|
||||
|
||||
// Machine Status Register, mstatus
|
||||
#define MSTATUS_MPP_MASK (3L << 11) // previous mode.
|
||||
#define MSTATUS_MPP_M (3L << 11)
|
||||
#define MSTATUS_MPP_S (1L << 11)
|
||||
#define MSTATUS_MPP_U (0L << 11)
|
||||
#define MSTATUS_MIE (1L << 3) // machine-mode interrupt enable.
|
||||
#define MSTATUS_MPIE (1L << 7)
|
||||
#define MSTATUS_FS (1L << 13)
|
||||
|
||||
// Machine-mode Interrupt Enable
|
||||
#define MIE_MTIE (1L << 7)
|
||||
#define MIE_MSIE (1L << 3)
|
||||
#define MIE_MEIE (1L << 11)
|
||||
#define MIE_STIE (1L << 5) // supervisor timer
|
||||
#define MIE_SSIE (1L << 1)
|
||||
#define MIE_SEIE (1L << 9)
|
||||
|
||||
// Supervisor Status Register, sstatus
|
||||
#define SSTATUS_SPP (1L << 8) // Previous mode, 1=Supervisor, 0=User
|
||||
#define SSTATUS_SPIE (1L << 5) // Supervisor Previous Interrupt Enable
|
||||
#define SSTATUS_UPIE (1L << 4) // User Previous Interrupt Enable
|
||||
#define SSTATUS_SIE (1L << 1) // Supervisor Interrupt Enable
|
||||
#define SSTATUS_UIE (1L << 0) // User Interrupt Enable
|
||||
#define SSTATUS_SPIE (1L << 5)
|
||||
#define SSTATUS_UPIE (1L << 4)
|
||||
|
||||
// Supervisor Interrupt Enable
|
||||
#define SIE_SEIE (1L << 9) // external
|
||||
#define SIE_STIE (1L << 5) // timer
|
||||
#define SIE_SSIE (1L << 1) // software
|
||||
|
||||
#ifndef __ASSEMBLER__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
static inline uint64_t riscv_get_core()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, mhartid" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_mstatus()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, mstatus" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_mstatus(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw mstatus, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// machine exception program counter, holds the
|
||||
// instruction address to which a return from
|
||||
// exception will go.
|
||||
static inline void riscv_writ_mepc(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw mepc, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_sstatus()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, sstatus" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_sstatus(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw sstatus, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// Supervisor Interrupt Pending
|
||||
static inline uint64_t riscv_get_sip()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, sip" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_sip(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw sip, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_sie()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, sie" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_sie(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw sie, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_mie()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, mie" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_mie(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw mie, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// supervisor exception program counter, holds the
|
||||
// instruction address to which a return from
|
||||
// exception will go.
|
||||
static inline void riscv_writ_sepc(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw sepc, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_sepc()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, sepc" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// Machine Exception Delegation
|
||||
static inline uint64_t riscv_get_medeleg()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, medeleg" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_medeleg(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw medeleg, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// Machine Interrupt Delegation
|
||||
static inline uint64_t riscv_get_mideleg()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, mideleg" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_mideleg(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw mideleg, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// Supervisor Trap-Vector Base Address
|
||||
// low two bits are mode.
|
||||
static inline void riscv_writ_stvec(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw stvec, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_stvec()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, stvec" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// Supervisor Timer Comparison Register
|
||||
static inline uint64_t riscv_get_stimecmp()
|
||||
{
|
||||
uint64_t x;
|
||||
// asm volatile("csrr %0, stimecmp" : "=r" (x) );
|
||||
asm volatile("csrr %0, 0x14d" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_stimecmp(uint64_t x)
|
||||
{
|
||||
// asm volatile("csrw stimecmp, %0" : : "r" (x));
|
||||
asm volatile("csrw 0x14d, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// Machine Environment Configuration Register
|
||||
static inline uint64_t riscv_get_menvcfg()
|
||||
{
|
||||
uint64_t x;
|
||||
// asm volatile("csrr %0, menvcfg" : "=r" (x) );
|
||||
asm volatile("csrr %0, 0x30a" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_menvcfg(uint64_t x)
|
||||
{
|
||||
// asm volatile("csrw menvcfg, %0" : : "r" (x));
|
||||
asm volatile("csrw 0x30a, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// Physical Memory Protection
|
||||
static inline void riscv_writ_pmpcfg0(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw pmpcfg0, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline void riscv_writ_pmpaddr0(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw pmpaddr0, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
// supervisor address translation and protection;
|
||||
// holds the address of the page table.
|
||||
static inline void riscv_writ_satp(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw satp, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_satp()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, satp" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// Supervisor Trap Cause
|
||||
static inline uint64_t riscv_get_scause()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, scause" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// Supervisor Trap Value
|
||||
static inline uint64_t riscv_get_stval()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, stval" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// Machine-mode Counter-Enable
|
||||
static inline void riscv_writ_mcounteren(uint64_t x)
|
||||
{
|
||||
asm volatile("csrw mcounteren, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_mcounteren()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, mcounteren" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// machine-mode cycle counter
|
||||
static inline uint64_t riscv_get_time()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("csrr %0, time" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// enable device interrupts
|
||||
static inline void riscv_sintr_on()
|
||||
{
|
||||
uint64_t sstatus = riscv_get_sstatus();
|
||||
sstatus |= SSTATUS_SIE;
|
||||
riscv_writ_sstatus(sstatus);
|
||||
}
|
||||
|
||||
// disable device interrupts
|
||||
static inline void riscv_sintr_off()
|
||||
{
|
||||
uint64_t sstatus = riscv_get_sstatus();
|
||||
sstatus &= (~SSTATUS_SIE);
|
||||
riscv_writ_sstatus(sstatus);
|
||||
}
|
||||
|
||||
// are device interrupts enabled?
|
||||
static inline int riscv_sintr_get()
|
||||
{
|
||||
uint64_t x = riscv_get_sstatus();
|
||||
return (x & SSTATUS_SIE) != 0;
|
||||
}
|
||||
|
||||
static inline void riscv_sintr_restore(int x)
|
||||
{
|
||||
if(x)
|
||||
riscv_sintr_on();
|
||||
else
|
||||
riscv_sintr_off();
|
||||
}
|
||||
|
||||
// enable device interrupts
|
||||
static inline void riscv_mintr_on()
|
||||
{
|
||||
uint64_t mstatus = riscv_get_mstatus();
|
||||
mstatus |= MSTATUS_MIE;
|
||||
riscv_writ_mstatus(mstatus);
|
||||
}
|
||||
|
||||
// disable device interrupts
|
||||
static inline void riscv_mintr_off()
|
||||
{
|
||||
uint64_t mstatus = riscv_get_mstatus();
|
||||
mstatus &= (~MSTATUS_MIE);
|
||||
riscv_writ_mstatus(mstatus);
|
||||
}
|
||||
|
||||
// are device interrupts enabled?
|
||||
static inline int riscv_mintr_get()
|
||||
{
|
||||
uint64_t x = riscv_get_mstatus();
|
||||
return (x & MSTATUS_MIE) != 0;
|
||||
}
|
||||
|
||||
static inline void riscv_mintr_restore(int x)
|
||||
{
|
||||
if(x)
|
||||
riscv_mintr_on();
|
||||
else
|
||||
riscv_mintr_off();
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_sp()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("mv %0, sp" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// read and write tp, the thread pointer, which xv6 uses to hold
|
||||
// this core's hartid (core number), the index into cpus[].
|
||||
static inline uint64_t riscv_get_tp()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("mv %0, tp" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
static inline void riscv_writ_tp(uint64_t x)
|
||||
{
|
||||
asm volatile("mv tp, %0" : : "r" (x));
|
||||
}
|
||||
|
||||
static inline uint64_t riscv_get_ra()
|
||||
{
|
||||
uint64_t x;
|
||||
asm volatile("mv %0, ra" : "=r" (x) );
|
||||
return x;
|
||||
}
|
||||
|
||||
// flush the TLB.
|
||||
static inline void sfence_vma()
|
||||
{
|
||||
// the zero, zero means flush all TLB entries.
|
||||
asm volatile("sfence.vma zero, zero");
|
||||
}
|
||||
|
||||
#endif // __ASSEMBLER__
|
||||
|
||||
#endif
|
||||
194
port/threadx/inc/nx_port.h
Normal file
194
port/threadx/inc/nx_port.h
Normal file
@@ -0,0 +1,194 @@
|
||||
/***************************************************************************
|
||||
* Copyright (c) 2024 Microsoft Corporation
|
||||
* Copyright (c) 2025-present Eclipse ThreadX Contributors
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the MIT License which is available at
|
||||
* https://opensource.org/licenses/MIT.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/** */
|
||||
/** NetX Component */
|
||||
/** */
|
||||
/** Port Specific */
|
||||
/** */
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/* */
|
||||
/* PORT SPECIFIC C INFORMATION RELEASE */
|
||||
/* */
|
||||
/* nx_port.h PIC32x/Microchip */
|
||||
/* 6.4.3 */
|
||||
/* */
|
||||
/* AUTHOR */
|
||||
/* */
|
||||
/* William E. Lamie, Microsoft Corporation */
|
||||
/* */
|
||||
/* DESCRIPTION */
|
||||
/* */
|
||||
/* This file contains data type definitions that make the NetX */
|
||||
/* real-time TCP/IP function identically on a variety of different */
|
||||
/* processor architectures. */
|
||||
/* */
|
||||
/* RELEASE HISTORY */
|
||||
/* */
|
||||
/* DATE NAME DESCRIPTION */
|
||||
/* */
|
||||
/* 10-31-2022 Zhen Kong Initial PIC32x/Microchip */
|
||||
/* Support Version 6.2.0 */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef NX_PORT_H
|
||||
#define NX_PORT_H
|
||||
#include "tx_port.h"
|
||||
/* Determine if the optional NetX user define file should be used. */
|
||||
|
||||
#ifdef NX_INCLUDE_USER_DEFINE_FILE
|
||||
|
||||
/* Yes, include the user defines in nx_user.h. The defines in this file may
|
||||
alternately be defined on the command line. */
|
||||
|
||||
#include "nx_user.h"
|
||||
#endif
|
||||
|
||||
/* Default to little endian, since this is what most RISC-V targets are. */
|
||||
|
||||
#define NX_LITTLE_ENDIAN
|
||||
|
||||
/* Define various constants for the port. */
|
||||
|
||||
#ifndef NX_IP_PERIODIC_RATE
|
||||
#define NX_IP_PERIODIC_RATE \
|
||||
10 /* Default IP periodic rate of 1 second for \
|
||||
ports with 1ms timer interrupts. This \
|
||||
value may be defined instead at the \
|
||||
command line and this value will not be \
|
||||
used. */
|
||||
#endif
|
||||
|
||||
/* Define macros that swap the endian for little endian ports. */
|
||||
#ifdef NX_LITTLE_ENDIAN
|
||||
#define NX_CHANGE_ULONG_ENDIAN(arg) \
|
||||
{ \
|
||||
ULONG _i; \
|
||||
ULONG _tmp; \
|
||||
_i = (UINT)arg; \
|
||||
/* _i = A, B, C, D */ \
|
||||
_tmp = _i ^ (((_i) >> 16) | (_i << 16)); \
|
||||
/* _tmp = _i ^ (_i ROR 16) = A^C, B^D, C^A, D^B */ \
|
||||
_tmp &= 0xff00ffff; \
|
||||
/* _tmp = A^C, 0, C^A, D^B */ \
|
||||
_i = ((_i) >> 8) | (_i << 24); \
|
||||
/* _i = D, A, B, C */ \
|
||||
_i = _i ^ ((_tmp) >> 8); \
|
||||
/* _i = D, C, B, A */ \
|
||||
arg = _i; \
|
||||
}
|
||||
#define NX_CHANGE_USHORT_ENDIAN(a) (a = (((a >> 8) | (a << 8)) & 0xFFFF))
|
||||
|
||||
#ifndef htonl
|
||||
#define htonl(val) NX_CHANGE_ULONG_ENDIAN(val)
|
||||
#endif /* htonl */
|
||||
|
||||
#ifndef ntohl
|
||||
#define ntohl(val) NX_CHANGE_ULONG_ENDIAN(val)
|
||||
#endif /* ntohl */
|
||||
|
||||
#ifndef htons
|
||||
#define htons(val) NX_CHANGE_USHORT_ENDIAN(val)
|
||||
#endif /*htons */
|
||||
|
||||
#ifndef ntohs
|
||||
#define ntohs(val) NX_CHANGE_USHORT_ENDIAN(val)
|
||||
#endif /*ntohs */
|
||||
|
||||
#else
|
||||
|
||||
#define NX_CHANGE_ULONG_ENDIAN(a)
|
||||
#define NX_CHANGE_USHORT_ENDIAN(a)
|
||||
|
||||
#ifndef htons
|
||||
#define htons(val) (val)
|
||||
#endif /* htons */
|
||||
|
||||
#ifndef ntohs
|
||||
#define ntohs(val) (val)
|
||||
#endif /* ntohs */
|
||||
|
||||
#ifndef ntohl
|
||||
#define ntohl(val) (val)
|
||||
#endif
|
||||
|
||||
#ifndef htonl
|
||||
#define htonl(val) (val)
|
||||
#endif /* htonl */
|
||||
|
||||
#endif
|
||||
|
||||
/* Define several macros for the error checking shell in NetX. */
|
||||
|
||||
#ifndef TX_TIMER_PROCESS_IN_ISR
|
||||
|
||||
#define NX_CALLER_CHECKING_EXTERNS \
|
||||
extern TX_THREAD* _tx_thread_current_ptr; \
|
||||
extern TX_THREAD _tx_timer_thread; \
|
||||
extern volatile ULONG TX_THREAD_GET_SYSTEM_STATE();
|
||||
|
||||
#define NX_THREADS_ONLY_CALLER_CHECKING \
|
||||
if((TX_THREAD_GET_SYSTEM_STATE()) || (_tx_thread_current_ptr == TX_NULL) || (_tx_thread_current_ptr == &_tx_timer_thread)) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_INIT_AND_THREADS_CALLER_CHECKING \
|
||||
if(((TX_THREAD_GET_SYSTEM_STATE()) && (TX_THREAD_GET_SYSTEM_STATE() < ((ULONG)0xF0F0F0F0))) || \
|
||||
(_tx_thread_current_ptr == &_tx_timer_thread)) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_NOT_ISR_CALLER_CHECKING \
|
||||
if((TX_THREAD_GET_SYSTEM_STATE()) && (TX_THREAD_GET_SYSTEM_STATE() < ((ULONG)0xF0F0F0F0))) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_THREAD_WAIT_CALLER_CHECKING \
|
||||
if((wait_option) && \
|
||||
((_tx_thread_current_ptr == NX_NULL) || (TX_THREAD_GET_SYSTEM_STATE()) || (_tx_thread_current_ptr == &_tx_timer_thread))) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#else
|
||||
|
||||
#define NX_CALLER_CHECKING_EXTERNS \
|
||||
extern TX_THREAD* _tx_thread_current_ptr; \
|
||||
extern volatile ULONG TX_THREAD_GET_SYSTEM_STATE();
|
||||
|
||||
#define NX_THREADS_ONLY_CALLER_CHECKING \
|
||||
if((TX_THREAD_GET_SYSTEM_STATE()) || (_tx_thread_current_ptr == TX_NULL)) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_INIT_AND_THREADS_CALLER_CHECKING \
|
||||
if(((TX_THREAD_GET_SYSTEM_STATE()) && (TX_THREAD_GET_SYSTEM_STATE() < ((ULONG)0xF0F0F0F0)))) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_NOT_ISR_CALLER_CHECKING \
|
||||
if((TX_THREAD_GET_SYSTEM_STATE()) && (TX_THREAD_GET_SYSTEM_STATE() < ((ULONG)0xF0F0F0F0))) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#define NX_THREAD_WAIT_CALLER_CHECKING \
|
||||
if((wait_option) && ((_tx_thread_current_ptr == NX_NULL) || (TX_THREAD_GET_SYSTEM_STATE()))) \
|
||||
return (NX_CALLER_ERROR);
|
||||
|
||||
#endif
|
||||
|
||||
/* Define the version ID of NetX. This may be utilized by the application. */
|
||||
|
||||
#ifdef NX_SYSTEM_INIT
|
||||
CHAR _nx_version_id[] = "Copyright (c) 2024 Microsoft Corporation. * NetX Duo PIC32x/MPLAB Version 6.4.1 *";
|
||||
#else
|
||||
extern CHAR _nx_version_id[];
|
||||
#endif
|
||||
|
||||
#endif
|
||||
785
port/threadx/inc/nx_user.h
Normal file
785
port/threadx/inc/nx_user.h
Normal file
@@ -0,0 +1,785 @@
|
||||
/***************************************************************************
|
||||
* Copyright (c) 2024 Microsoft Corporation
|
||||
* Copyright (c) 2025-present Eclipse ThreadX Contributors
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the MIT License which is available at
|
||||
* https://opensource.org/licenses/MIT.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/** */
|
||||
/** NetX Component */
|
||||
/** */
|
||||
/** User Specific */
|
||||
/** */
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/* */
|
||||
/* PORT SPECIFIC C INFORMATION RELEASE */
|
||||
/* */
|
||||
/* nx_user.h PORTABLE C */
|
||||
/* 6.4.3 */
|
||||
/* */
|
||||
/* AUTHOR */
|
||||
/* */
|
||||
/* Yuxin Zhou, Microsoft Corporation */
|
||||
/* */
|
||||
/* DESCRIPTION */
|
||||
/* */
|
||||
/* This file contains user defines for configuring NetX in specific */
|
||||
/* ways. This file will have an effect only if the application and */
|
||||
/* NetX library are built with NX_INCLUDE_USER_DEFINE_FILE defined. */
|
||||
/* Note that all the defines in this file may also be made on the */
|
||||
/* command line when building NetX library and application objects. */
|
||||
/* */
|
||||
/* RELEASE HISTORY */
|
||||
/* */
|
||||
/* DATE NAME DESCRIPTION */
|
||||
/* */
|
||||
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
|
||||
/* 09-30-2020 Yuxin Zhou Modified comment(s), */
|
||||
/* resulting in version 6.1 */
|
||||
/* 08-02-2021 Yuxin Zhou Modified comment(s), and */
|
||||
/* supported TCP/IP offload, */
|
||||
/* resulting in version 6.1.8 */
|
||||
/* 04-25-2022 Yuxin Zhou Modified comment(s), */
|
||||
/* resulting in version 6.1.11 */
|
||||
/* 10-31-2023 Tiejun Zhou Modified comment(s), */
|
||||
/* supported random IP id, */
|
||||
/* resulting in version 6.3.0 */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef NX_USER_H
|
||||
#define NX_USER_H
|
||||
|
||||
#if __riscv_xlen == 64
|
||||
#define NX_CRYPTO_HUGE_NUMBER_BITS 16
|
||||
#else
|
||||
#define NX_CRYPTO_HUGE_NUMBER_BITS 32
|
||||
#endif
|
||||
/* Define various build options for the NetX Duo port. The application should either make changes
|
||||
here by commenting or un-commenting the conditional compilation defined OR supply the defines
|
||||
though the compiler's equivalent of the -D option. */
|
||||
|
||||
/* Override various options with default values already assigned in nx_api.h or nx_port.h. Please
|
||||
also refer to nx_port.h for descriptions on each of these options. */
|
||||
|
||||
/* Configuration options for Interface */
|
||||
|
||||
/* NX_MAX_PHYSICAL_INTERFACES defines the number physical network interfaces
|
||||
present to NetX Duo IP layer. Physical interface does not include
|
||||
loopback interface. By default there is at least one physical interface
|
||||
in the system. */
|
||||
/*
|
||||
#define NX_MAX_PHYSICAL_INTERFACES 1
|
||||
*/
|
||||
|
||||
/* Defined, this option disables NetX Duo support on the 127.0.0.1 loopback interface.
|
||||
127.0.0.1 loopback interface is enabled by default. Uncomment out the follow code to disable
|
||||
the loopback interface. */
|
||||
/*
|
||||
#define NX_DISABLE_LOOPBACK_INTERFACE
|
||||
*/
|
||||
|
||||
/* If defined, the link driver is able to specify extra capability, such as checksum offloading features. */
|
||||
/*
|
||||
#define NX_ENABLE_INTERFACE_CAPABILITY
|
||||
*/
|
||||
|
||||
/* Configuration options for IP */
|
||||
|
||||
/* This defines specifies the number of ThreadX timer ticks in one second. The default value is based
|
||||
on ThreadX timer interrupt. */
|
||||
/*
|
||||
#ifdef TX_TIMER_TICKS_PER_SECOND
|
||||
#define NX_IP_PERIODIC_RATE TX_TIMER_TICKS_PER_SECOND
|
||||
#else
|
||||
#define NX_IP_PERIODIC_RATE 100
|
||||
#endif
|
||||
*/
|
||||
|
||||
/* Defined, NX_ENABLE_IP_RAW_PACKET_FILTER allows an application to install a filter
|
||||
for incoming raw packets. This feature is disabled by default. */
|
||||
/*
|
||||
#define NX_ENABLE_IP_RAW_PACKET_FILTER
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum number of RAW packets can be queued for receive. The default
|
||||
value is 20. */
|
||||
/*
|
||||
#define NX_IP_RAW_MAX_QUEUE_DEPTH 20
|
||||
*/
|
||||
|
||||
/* Defined, this option enables IP static routing feature. By default IP static routing
|
||||
feature is not compiled in. */
|
||||
/*
|
||||
#define NX_ENABLE_IP_STATIC_ROUTING
|
||||
*/
|
||||
|
||||
/* This define specifies the size of IP routing table. The default value is 8. */
|
||||
/*
|
||||
#define NX_IP_ROUTING_TABLE_SIZE 8
|
||||
*/
|
||||
|
||||
/* Defined, this option enables random IP id. By default IP id is increased by one for each packet. */
|
||||
/*
|
||||
#define NX_ENABLE_IP_ID_RANDOMIZATION
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum number of multicast groups that can be joined.
|
||||
The default value is 7. */
|
||||
/*
|
||||
#define NX_MAX_MULTICAST_GROUPS 7
|
||||
*/
|
||||
|
||||
/* Configuration options for IPv6 */
|
||||
|
||||
/* Disable IPv6 processing in NetX Duo. */
|
||||
/*
|
||||
#define NX_DISABLE_IPV6
|
||||
*/
|
||||
|
||||
/* Define the number of entries in IPv6 address pool. */
|
||||
/*
|
||||
#ifdef NX_MAX_PHYSICAL_INTERFACES
|
||||
#define NX_MAX_IPV6_ADDRESSES (NX_MAX_PHYSICAL_INTERFACES * 3)
|
||||
#endif
|
||||
*/
|
||||
|
||||
/* Do not process IPv6 ICMP Redirect Messages. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_REDIRECT_PROCESS
|
||||
*/
|
||||
|
||||
/* Do not process IPv6 Router Advertisement Messages. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_ROUTER_ADVERTISEMENT_PROCESS
|
||||
*/
|
||||
|
||||
/* Do not send IPv6 Router Solicitation Messages. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_ROUTER_SOLICITATION
|
||||
*/
|
||||
|
||||
/* Define the max number of router solicitations a host sends until a router response
|
||||
is received. If no response is received, the host concludes no router is present. */
|
||||
/*
|
||||
#define NX_ICMPV6_MAX_RTR_SOLICITATIONS 3
|
||||
*/
|
||||
|
||||
/* Define the interval between which the host sends router solicitations in seconds. */
|
||||
/*
|
||||
#define NX_ICMPV6_RTR_SOLICITATION_INTERVAL 4
|
||||
*/
|
||||
|
||||
/* Define the maximum delay for the initial router solicitation in seconds. */
|
||||
/*
|
||||
#define NX_ICMPV6_RTR_SOLICITATION_DELAY 1
|
||||
*/
|
||||
|
||||
/* Do not send ICMPv4 Error Messages. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV4_ERROR_MESSAGE
|
||||
*/
|
||||
|
||||
/* Do not send ICMPv6 Error Messages. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_ERROR_MESSAGE
|
||||
*/
|
||||
|
||||
/* Disable the Duplicate Address Detection (DAD) protocol when configuring the host IP address. */
|
||||
/*
|
||||
#define NX_DISABLE_IPV6_DAD
|
||||
*/
|
||||
|
||||
/* If defined, application is able to control whether or not to perform IPv6 stateless
|
||||
address autoconfiguration with nxd_ipv6_stateless_address_autoconfig_enable() or
|
||||
nxd_ipv6_stateless_address_autoconfig_disable() service. If defined, the system starts
|
||||
with IPv6 stateless address autoconfiguration enabled. This feature is disabled by default. */
|
||||
/*
|
||||
#define NX_IPV6_STATELESS_AUTOCONFIG_CONTROL
|
||||
*/
|
||||
|
||||
/* If enabled, application is able to install a callback function to get notified
|
||||
when an interface IPv6 address is changed. By default this feature is disabled. */
|
||||
/*
|
||||
#define NX_ENABLE_IPV6_ADDRESS_CHANGE_NOTIFY
|
||||
*/
|
||||
|
||||
/* Defined, this option prevents NetX Duo from removing stale (old) cache table entries
|
||||
whose timeout has not expired so are otherwise still valid) to make room for new entries
|
||||
when the table is full. Static and router entries are not purged. */
|
||||
/*
|
||||
#define NX_DISABLE_IPV6_PURGE_UNUSED_CACHE_ENTRIES
|
||||
*/
|
||||
|
||||
/* This define enables simple IPv6 multicast group join/leave function. By default
|
||||
the IPv6 multicast join/leave function is not enabled. */
|
||||
/*
|
||||
#define NX_ENABLE_IPV6_MULTICAST
|
||||
*/
|
||||
|
||||
/* Defined, Minimum Path MTU Discovery feature is enabled. */
|
||||
/*
|
||||
#define NX_ENABLE_IPV6_PATH_MTU_DISCOVERY
|
||||
*/
|
||||
|
||||
/* Define wait interval in seconds to reset the path MTU for a destination
|
||||
table entry after decreasing it in response to a packet too big error message.
|
||||
RFC 1981 Section 5.4 states the minimum time to wait is
|
||||
5 minutes and recommends 10 minutes.
|
||||
*/
|
||||
/*
|
||||
#define NX_PATH_MTU_INCREASE_WAIT_INTERVAL 600
|
||||
*/
|
||||
|
||||
/* Configuration options for Neighbor Discovery. */
|
||||
/* Define values used for Neighbor Discovery protocol.
|
||||
The default values are suggested by RFC2461, chapter 10. */
|
||||
|
||||
/* Define the maximum number of multicast Neighbor Solicitation packets
|
||||
NetX Duo sends for a packet destination needing physical mapping
|
||||
to the IP address. */
|
||||
/*
|
||||
#define NX_MAX_MULTICAST_SOLICIT 3
|
||||
*/
|
||||
|
||||
/* Define the maximum number of unicast Neighbor Solicitation packets
|
||||
NetX Duo sends for a cache entry whose reachable time has expired
|
||||
and gone "stale". */
|
||||
/*
|
||||
#define NX_MAX_UNICAST_SOLICIT 3
|
||||
*/
|
||||
|
||||
/* Define the length of time, in seconds, that a Neighbor Cache table entry
|
||||
remains in the reachable state before it becomes state. */
|
||||
/*
|
||||
#define NX_REACHABLE_TIME 30
|
||||
*/
|
||||
|
||||
/* Define the length of time, in milliseconds, between retransmitting
|
||||
Neighbor Solicitation (NS) packets. */
|
||||
/*
|
||||
#define NX_RETRANS_TIMER 1000
|
||||
*/
|
||||
|
||||
/* Define the length of time, in seconds, for a Neighbor Cache entry
|
||||
to remain in the Delay state. This is the Delay first probe timer. */
|
||||
/*
|
||||
#define NX_DELAY_FIRST_PROBE_TIME 5
|
||||
*/
|
||||
|
||||
/* This defines specifies the maximum number of packets that can be queued while waiting for a
|
||||
Neighbor Discovery to resolve an IPv6 address. The default value is 4. */
|
||||
/*
|
||||
#define NX_ND_MAX_QUEUE_DEPTH 4
|
||||
*/
|
||||
|
||||
/* Define the maximum ICMPv6 Duplicate Address Detect Transmit . */
|
||||
/*
|
||||
#define NX_IPV6_DAD_TRANSMITS 3
|
||||
*/
|
||||
|
||||
/* Define the number of neighbor cache entries. */
|
||||
/*
|
||||
#define NX_IPV6_NEIGHBOR_CACHE_SIZE 16
|
||||
*/
|
||||
|
||||
/* Define the size of the IPv6 destination table. */
|
||||
/*
|
||||
#define NX_IPV6_DESTINATION_TABLE_SIZE 8
|
||||
*/
|
||||
|
||||
/* Define the size of the IPv6 prefix table. */
|
||||
/*
|
||||
#define NX_IPV6_PREFIX_LIST_TABLE_SIZE 8
|
||||
*/
|
||||
|
||||
/* Configuration options for IPSEC */
|
||||
|
||||
/* This define enables IPSEC in NetX Duo. */
|
||||
/*
|
||||
#define NX_IPSEC_ENABLE
|
||||
*/
|
||||
|
||||
/* Configuration options for NAT */
|
||||
|
||||
/* This define enables NAT process in NetX Duo. */
|
||||
/*
|
||||
#define NX_NAT_ENABLE
|
||||
*/
|
||||
|
||||
/* Configuration options for IGMP */
|
||||
|
||||
/* Defined, IGMP v2 support is disabled. By default NetX Duo
|
||||
is built with IGMPv2 enabled . By uncommenting this option,
|
||||
NetX Duo reverts back to IGMPv1 only. */
|
||||
/*
|
||||
#define NX_DISABLE_IGMPV2
|
||||
*/
|
||||
|
||||
/* Configuration options for ARP */
|
||||
|
||||
/* When defines, ARP reply is sent when address conflict occurs. */
|
||||
/*
|
||||
#define NX_ARP_DEFEND_BY_REPLY
|
||||
*/
|
||||
|
||||
/* To use the ARP collision handler to check for invalid ARP messages
|
||||
matching existing entries in the table (man in the middle attack),
|
||||
enable this feature. */
|
||||
/*
|
||||
#define NX_ENABLE_ARP_MAC_CHANGE_NOTIFICATION
|
||||
*/
|
||||
|
||||
/* This define specifies the number of seconds ARP entries remain valid. The default value of 0 disables
|
||||
aging of ARP entries. */
|
||||
/*
|
||||
#define NX_ARP_EXPIRATION_RATE 0
|
||||
*/
|
||||
|
||||
/* This define specifies the number of seconds between ARP retries. The default value is 10, which represents
|
||||
10 seconds. */
|
||||
/*
|
||||
#define NX_ARP_UPDATE_RATE 10
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum number of ARP retries made without an ARP response. The default
|
||||
value is 18. */
|
||||
/*
|
||||
#define NX_ARP_MAXIMUM_RETRIES 18
|
||||
*/
|
||||
|
||||
/* This defines specifies the maximum number of packets that can be queued while waiting for an ARP
|
||||
response. The default value is 4. */
|
||||
/*
|
||||
#define NX_ARP_MAX_QUEUE_DEPTH 4
|
||||
*/
|
||||
|
||||
/* Defined, this option disables entering ARP request information in the ARP cache. */
|
||||
/*
|
||||
#define NX_DISABLE_ARP_AUTO_ENTRY
|
||||
*/
|
||||
|
||||
/* Define the ARP defend interval. The default value is 10 seconds. */
|
||||
/*
|
||||
#define NX_ARP_DEFEND_INTERVAL 10
|
||||
*/
|
||||
|
||||
/* Configuration options for TCP */
|
||||
|
||||
/* This define specifies how the number of system ticks (NX_IP_PERIODIC_RATE) is divided to calculate the
|
||||
timer rate for the TCP delayed ACK processing. The default value is 5, which represents 200ms. */
|
||||
/*
|
||||
#define NX_TCP_ACK_TIMER_RATE 5
|
||||
*/
|
||||
|
||||
/* This define specifies how the number of system ticks (NX_IP_PERIODIC_RATE) is divided to calculate the
|
||||
fast TCP timer rate. The fast TCP timer is used to drive various TCP timers, including the delayed ACK
|
||||
timer. The default value is 10, which represents 100ms. */
|
||||
/*
|
||||
#define NX_TCP_FAST_TIMER_RATE 10
|
||||
*/
|
||||
|
||||
/* This define specifies how the number of system ticks (NX_IP_PERIODIC_RATE) is divided to calculate the
|
||||
timer rate for the TCP transmit retry processing. The default value is 1, which represents 1 second. */
|
||||
/*
|
||||
#define NX_TCP_TRANSMIT_TIMER_RATE 1
|
||||
*/
|
||||
|
||||
/* This define specifies how many seconds of inactivity before the keepalive timer activates. The default
|
||||
value is 7200, which represents 2 hours. */
|
||||
/*
|
||||
#define NX_TCP_KEEPALIVE_INITIAL 7200
|
||||
*/
|
||||
|
||||
/* This define specifies how many seconds between retries of the keepalive timer assuming the other side
|
||||
of the connection is not responding. The default value is 75, which represents 75 seconds between
|
||||
retries. */
|
||||
/*
|
||||
#define NX_TCP_KEEPALIVE_RETRY 75
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum packets that are out of order. The default value is 8. */
|
||||
/*
|
||||
#define NX_TCP_MAX_OUT_OF_ORDER_PACKETS 8
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum number of TCP server listen requests. The default value is 10. */
|
||||
/*
|
||||
#define NX_MAX_LISTEN_REQUESTS 10
|
||||
*/
|
||||
|
||||
/* Defined, this option enables the optional TCP keepalive timer. */
|
||||
/*
|
||||
#define NX_ENABLE_TCP_KEEPALIVE
|
||||
*/
|
||||
|
||||
/* Defined, this option enables the optional TCP immediate ACK response processing. */
|
||||
/*
|
||||
#define NX_TCP_IMMEDIATE_ACK
|
||||
*/
|
||||
|
||||
/* This define specifies the number of TCP packets to receive before sending an ACK. */
|
||||
/* The default value is 2: ack every 2 packets. */
|
||||
/*
|
||||
#define NX_TCP_ACK_EVERY_N_PACKETS 2
|
||||
*/
|
||||
|
||||
/* Automatically define NX_TCP_ACK_EVERY_N_PACKETS to 1 if NX_TCP_IMMEDIATE_ACK is defined.
|
||||
This is needed for backward compatibility. */
|
||||
#if(defined(NX_TCP_IMMEDIATE_ACK) && !defined(NX_TCP_ACK_EVERY_N_PACKETS))
|
||||
#define NX_TCP_ACK_EVERY_N_PACKETS 1
|
||||
#endif
|
||||
|
||||
/* This define specifies how many transmit retires are allowed before the connection is deemed broken.
|
||||
The default value is 10. */
|
||||
/*
|
||||
#define NX_TCP_MAXIMUM_RETRIES 10
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum depth of the TCP transmit queue before TCP send requests are
|
||||
suspended or rejected. The default value is 20, which means that a maximum of 20 packets can be in
|
||||
the transmit queue at any given time. */
|
||||
/*
|
||||
#define NX_TCP_MAXIMUM_TX_QUEUE 20
|
||||
*/
|
||||
|
||||
/* This define specifies how the retransmit timeout period changes between successive retries. If this
|
||||
value is 0, the initial retransmit timeout is the same as subsequent retransmit timeouts. If this
|
||||
value is 1, each successive retransmit is twice as long. The default value is 0. */
|
||||
/*
|
||||
#define NX_TCP_RETRY_SHIFT 0
|
||||
*/
|
||||
|
||||
/* This define specifies how many keepalive retries are allowed before the connection is deemed broken.
|
||||
The default value is 10. */
|
||||
/*
|
||||
#define NX_TCP_KEEPALIVE_RETRIES 10
|
||||
*/
|
||||
|
||||
/* Defined, this option enables the TCP window scaling feature. (RFC 1323). Default disabled. */
|
||||
/*
|
||||
#define NX_ENABLE_TCP_WINDOW_SCALING
|
||||
*/
|
||||
|
||||
/* Defined, this option disables the reset processing during disconnect when the timeout value is
|
||||
specified as NX_NO_WAIT. */
|
||||
/*
|
||||
#define NX_DISABLE_RESET_DISCONNECT
|
||||
*/
|
||||
|
||||
/* If defined, the incoming SYN packet (connection request) is checked for a minimum acceptable
|
||||
MSS for the host to accept the connection. The default minimum should be based on the host
|
||||
application packet pool payload, socket transmit queue depth and relevant application specific parameters. */
|
||||
/*
|
||||
#define NX_ENABLE_TCP_MSS_CHECK
|
||||
#define NX_TCP_MSS_MINIMUM 128
|
||||
*/
|
||||
|
||||
/* If defined, NetX Duo has a notify callback for the transmit TCP socket queue decreased from
|
||||
the maximum queue depth. */
|
||||
/*
|
||||
#define NX_ENABLE_TCP_QUEUE_DEPTH_UPDATE_NOTIFY
|
||||
*/
|
||||
|
||||
/* Defined, feature of low watermark is enabled. */
|
||||
/*
|
||||
#define NX_ENABLE_LOW_WATERMARK
|
||||
*/
|
||||
|
||||
/* Define the maximum receive queue for TCP socket. */
|
||||
/*
|
||||
#ifdef NX_ENABLE_LOW_WATERMARK
|
||||
#define NX_TCP_MAXIMUM_RX_QUEUE 20
|
||||
#endif
|
||||
*/
|
||||
|
||||
/* Configuration options for fragmentation */
|
||||
|
||||
/* Defined, this option disables both IPv4 and IPv6 fragmentation and reassembly logic. */
|
||||
/*
|
||||
#define NX_DISABLE_FRAGMENTATION
|
||||
*/
|
||||
|
||||
/* Defined, this option process IP fragmentation immediately. */
|
||||
/*
|
||||
#define NX_FRAGMENT_IMMEDIATE_ASSEMBLY
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum time of IP reassembly. The default value is 60.
|
||||
By default this option is not defined. */
|
||||
/*
|
||||
#define NX_IP_MAX_REASSEMBLY_TIME 60
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum time of IPv4 reassembly. The default value is 15.
|
||||
Note that if NX_IP_MAX_REASSEMBLY_TIME is defined, this option is automatically defined as 60.
|
||||
By default this option is not defined. */
|
||||
/*
|
||||
#define NX_IPV4_MAX_REASSEMBLY_TIME 15
|
||||
*/
|
||||
|
||||
/* This define specifies the maximum time of IPv6 reassembly. The default value is 60.
|
||||
Note that if NX_IP_MAX_REASSEMBLY_TIME is defined, this option is automatically defined as 60.
|
||||
By default this option is not defined. */
|
||||
/*
|
||||
#define NX_IPV6_MAX_REASSEMBLY_TIME 60
|
||||
*/
|
||||
|
||||
/* Configuration options for checksum */
|
||||
|
||||
/* Defined, this option disables checksum logic on received ICMPv4 packets.
|
||||
Note that if NX_DISABLE_ICMP_RX_CHECKSUM is defined, this option is
|
||||
automatically defined. By default this option is not defined.*/
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV4_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on received ICMPv6 packets.
|
||||
Note that if NX_DISABLE_ICMP_RX_CHECKSUM is defined, this option is
|
||||
automatically defined. By default this option is not defined.*/
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on received ICMPv4 or ICMPv6 packets.
|
||||
Note that if NX_DISABLE_ICMP_RX_CHECKSUM is defined, NX_DISABLE_ICMPV4_RX_CHECKSUM
|
||||
and NX_DISABLE_ICMPV6_RX_CHECKSUM are automatically defined. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMP_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted ICMPv4 packets.
|
||||
Note that if NX_DISABLE_ICMP_TX_CHECKSUM is defined, this option is
|
||||
automatically defined. By default this option is not defined.*/
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV4_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted ICMPv6 packets.
|
||||
Note that if NX_DISABLE_ICMP_TX_CHECKSUM is defined, this option is
|
||||
automatically defined. By default this option is not defined.*/
|
||||
/*
|
||||
#define NX_DISABLE_ICMPV6_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted ICMPv4 or ICMPv6 packets.
|
||||
Note that if NX_DISABLE_ICMP_TX_CHECKSUM is defined, NX_DISABLE_ICMPV4_TX_CHECKSUM
|
||||
and NX_DISABLE_ICMPV6_TX_CHECKSUM are automatically defined. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMP_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on received IP packets. This is useful if the link-layer
|
||||
has reliable checksum or CRC logic. */
|
||||
/*
|
||||
#define NX_DISABLE_IP_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted IP packets. */
|
||||
/*
|
||||
#define NX_DISABLE_IP_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on received TCP packets. */
|
||||
/*
|
||||
#define NX_DISABLE_TCP_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted TCP packets. */
|
||||
/*
|
||||
#define NX_DISABLE_TCP_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on received UDP packets. */
|
||||
|
||||
/*
|
||||
#define NX_DISABLE_UDP_RX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Defined, this option disables checksum logic on transmitted UDP packets. Note that
|
||||
IPV6 requires the UDP checksum computed for outgoing packets. If this option is
|
||||
defined, the IPv6 NetX Duo host must ensure the UDP checksum is computed elsewhere
|
||||
before the packet is transmitted. */
|
||||
/*
|
||||
#define NX_DISABLE_UDP_TX_CHECKSUM
|
||||
*/
|
||||
|
||||
/* Configuration options for statistics. */
|
||||
|
||||
/* Defined, ARP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_ARP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, IP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_IP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, ICMP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_ICMP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, IGMP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_IGMP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, packet information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_PACKET_INFO
|
||||
*/
|
||||
|
||||
/* Defined, RARP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_RARP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, TCP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_TCP_INFO
|
||||
*/
|
||||
|
||||
/* Defined, UDP information gathering is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_UDP_INFO
|
||||
*/
|
||||
|
||||
/* Configuration options for Packet Pool */
|
||||
|
||||
/* This define specifies the size of the physical packet header. The default value is 16 (based on
|
||||
a typical 16-byte Ethernet header). */
|
||||
/*
|
||||
#define NX_PHYSICAL_HEADER 16
|
||||
*/
|
||||
|
||||
/* This define specifies the size of the physical packet trailer and is typically used to reserve storage
|
||||
for things like Ethernet CRCs, etc. */
|
||||
/*
|
||||
#define NX_PHYSICAL_TRAILER 4
|
||||
*/
|
||||
|
||||
/* Defined, this option disables the addition size checking on received packets. */
|
||||
/*
|
||||
#define NX_DISABLE_RX_SIZE_CHECKING
|
||||
*/
|
||||
|
||||
/* Defined, packet debug infromation is enabled. */
|
||||
/*
|
||||
#define NX_ENABLE_PACKET_DEBUG_INFO
|
||||
*/
|
||||
|
||||
/* Defined, NX_PACKET structure is padded for alignment purpose. The default is no padding. */
|
||||
/*
|
||||
#define NX_PACKET_HEADER_PAD
|
||||
#define NX_PACKET_HEADER_PAD_SIZE 1
|
||||
*/
|
||||
|
||||
/* Defined, packet header and payload are aligned automatically by the value. The default value is sizeof(ULONG). */
|
||||
/*
|
||||
#define NX_PACKET_ALIGNMENT sizeof(ULONG)
|
||||
*/
|
||||
|
||||
/* If defined, the packet chain feature is removed. */
|
||||
/*
|
||||
#define NX_DISABLE_PACKET_CHAIN
|
||||
*/
|
||||
|
||||
/* Defined, the IP instance manages two packet pools. */
|
||||
/*
|
||||
#define NX_ENABLE_DUAL_PACKET_POOL
|
||||
*/
|
||||
|
||||
/* Configuration options for Others */
|
||||
|
||||
/* Defined, this option bypasses the basic NetX error checking. This define is typically used
|
||||
after the application is fully debugged. */
|
||||
/*
|
||||
#define NX_DISABLE_ERROR_CHECKING
|
||||
*/
|
||||
|
||||
/* Defined, this option enables deferred driver packet handling. This allows the driver to place a raw
|
||||
packet on the IP instance and have the driver's real processing routine called from the NetX internal
|
||||
IP helper thread. */
|
||||
/*
|
||||
#define NX_DRIVER_DEFERRED_PROCESSING
|
||||
*/
|
||||
|
||||
/* Defined, the source address of incoming packet is checked. The default is disabled. */
|
||||
/*
|
||||
#define NX_ENABLE_SOURCE_ADDRESS_CHECK
|
||||
*/
|
||||
|
||||
/* Defined, the extended notify support is enabled. This feature adds additional callback/notify services
|
||||
to NetX Duo API for notifying the application of socket events, such as TCP connection and disconnect
|
||||
completion. These extended notify functions are mainly used by the BSD wrapper. The default is this
|
||||
feature is disabled. */
|
||||
/*
|
||||
#define NX_ENABLE_EXTENDED_NOTIFY_SUPPORT
|
||||
*/
|
||||
|
||||
/* Defined, ASSERT is disabled. The default is enabled. */
|
||||
/*
|
||||
#define NX_DISABLE_ASSERT
|
||||
*/
|
||||
|
||||
/* Define the process when assert fails. */
|
||||
/*
|
||||
#define NX_ASSERT_FAIL while (1) tx_thread_sleep(NX_WAIT_FOREVER);
|
||||
*/
|
||||
|
||||
/* Defined, the IPv4 feature is disabled. */
|
||||
/*
|
||||
#define NX_DISABLE_IPV4
|
||||
*/
|
||||
|
||||
/* Defined, the destination address of ICMP packet is checked. The default is disabled.
|
||||
An ICMP Echo Request destined to an IP broadcast or IP multicast address will be silently discarded.
|
||||
*/
|
||||
/*
|
||||
#define NX_ENABLE_ICMP_ADDRESS_CHECK
|
||||
*/
|
||||
|
||||
/* Define the max string length. The default value is 1024. */
|
||||
/*
|
||||
#define NX_MAX_STRING_LENGTH 1024
|
||||
*/
|
||||
|
||||
/* Defined, the TCP/IP offload feature is enabled.
|
||||
NX_ENABLE_INTERFACE_CAPABILITY must be defined to enable this feature. */
|
||||
/*
|
||||
#define NX_ENABLE_TCPIP_OFFLOAD
|
||||
*/
|
||||
|
||||
/* Defined, the VLAN feature is enabled.
|
||||
Note: Require driver support to use APIs from this file.
|
||||
A quick check in driver is to search for
|
||||
NX_LINK_RAW_PACKET_SEND. VLAN APIs are not supported if not found. */
|
||||
/*
|
||||
#define NX_ENABLE_VLAN
|
||||
*/
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int rand(void);
|
||||
void srand(unsigned seed);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#define NX_RAND rand
|
||||
#define NX_SRAND srand
|
||||
#endif
|
||||
279
port/threadx/inc/tx_port.h
Normal file
279
port/threadx/inc/tx_port.h
Normal file
@@ -0,0 +1,279 @@
|
||||
/***************************************************************************
|
||||
* Copyright (c) 2024 Microsoft Corporation
|
||||
*
|
||||
* This program and the accompanying materials are made available under the
|
||||
* terms of the MIT License which is available at
|
||||
* https://opensource.org/licenses/MIT.
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
/** */
|
||||
/** ThreadX Component */
|
||||
/** */
|
||||
/** Port Specific */
|
||||
/** */
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
|
||||
/**************************************************************************/
|
||||
/* */
|
||||
/* PORT SPECIFIC C INFORMATION RELEASE */
|
||||
/* */
|
||||
/* tx_port.h RISC-V64/GNU */
|
||||
/* 6.2.1 */
|
||||
/* */
|
||||
/* AUTHOR */
|
||||
/* */
|
||||
/* Scott Larson, Microsoft Corporation */
|
||||
/* */
|
||||
/* DESCRIPTION */
|
||||
/* */
|
||||
/* This file contains data type definitions that make the ThreadX */
|
||||
/* real-time kernel function identically on a variety of different */
|
||||
/* processor architectures. For example, the size or number of bits */
|
||||
/* in an "int" data type vary between microprocessor architectures and */
|
||||
/* even C compilers for the same microprocessor. ThreadX does not */
|
||||
/* directly use native C data types. Instead, ThreadX creates its */
|
||||
/* own special types that can be mapped to actual data types by this */
|
||||
/* file to guarantee consistency in the interface and functionality. */
|
||||
/* */
|
||||
/* RELEASE HISTORY */
|
||||
/* */
|
||||
/* DATE NAME DESCRIPTION */
|
||||
/* */
|
||||
/* 03-08-2023 Scott Larson Initial Version 6.2.1 */
|
||||
/* */
|
||||
/**************************************************************************/
|
||||
|
||||
#ifndef TX_PORT_H
|
||||
#define TX_PORT_H
|
||||
|
||||
#ifdef __ASSEMBLER__
|
||||
|
||||
#if __riscv_xlen == 64
|
||||
#define SLL32 sllw
|
||||
#define STORE sd
|
||||
#define LOAD ld
|
||||
#define LWU lwu
|
||||
#define LOG_REGBYTES 3
|
||||
#else
|
||||
#define SLL32 sll
|
||||
#define STORE sw
|
||||
#define LOAD lw
|
||||
#define LWU lw
|
||||
#define LOG_REGBYTES 2
|
||||
#endif
|
||||
#define REGBYTES (1 << LOG_REGBYTES)
|
||||
#define TX_THREAD_STACK_END_OFFSET 2*4 + 2*REGBYTES
|
||||
#define TX_THREAD_TIME_SLICE_OFFSET 3*4+ 3*REGBYTES
|
||||
|
||||
#else /*not __ASSEMBLER__ */
|
||||
|
||||
/* Include for memset. */
|
||||
#include <string.h>
|
||||
/* include for strtoul*/
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Determine if the optional ThreadX user define file should be used. */
|
||||
|
||||
#ifdef TX_INCLUDE_USER_DEFINE_FILE
|
||||
|
||||
/* Yes, include the user defines in tx_user.h. The defines in this file may
|
||||
alternately be defined on the command line. */
|
||||
|
||||
#include "nx_user.h"
|
||||
#include "tx_user.h"
|
||||
#endif
|
||||
|
||||
/* Define compiler library include files. */
|
||||
|
||||
/* Define ThreadX basic types for this port. */
|
||||
|
||||
#define VOID void
|
||||
typedef char CHAR;
|
||||
typedef unsigned char UCHAR;
|
||||
typedef int INT;
|
||||
typedef unsigned int UINT;
|
||||
typedef int LONG;
|
||||
typedef unsigned int ULONG;
|
||||
typedef unsigned long long ULONG64;
|
||||
typedef short SHORT;
|
||||
typedef unsigned short USHORT;
|
||||
#define ULONG64_DEFINED
|
||||
#define ALIGN_TYPE_DEFINED
|
||||
#define ALIGN_TYPE ULONG64
|
||||
|
||||
/* Define the priority levels for ThreadX. Legal values range
|
||||
from 32 to 1024 and MUST be evenly divisible by 32. */
|
||||
|
||||
#ifndef TX_MAX_PRIORITIES
|
||||
#define TX_MAX_PRIORITIES 32
|
||||
#endif
|
||||
|
||||
/* Define the minimum stack for a ThreadX thread on this processor. If the size supplied during
|
||||
thread creation is less than this value, the thread create call will return an error. */
|
||||
|
||||
#ifndef TX_MINIMUM_STACK
|
||||
#define TX_MINIMUM_STACK 1024 /* Minimum stack size for this port */
|
||||
#endif
|
||||
|
||||
/* Define the system timer thread's default stack size and priority. These are only applicable
|
||||
if TX_TIMER_PROCESS_IN_ISR is not defined. */
|
||||
|
||||
#ifndef TX_TIMER_THREAD_STACK_SIZE
|
||||
#define TX_TIMER_THREAD_STACK_SIZE 1024 /* Default timer thread stack size */
|
||||
#endif
|
||||
|
||||
#ifndef TX_TIMER_THREAD_PRIORITY
|
||||
#define TX_TIMER_THREAD_PRIORITY 0 /* Default timer thread priority */
|
||||
#endif
|
||||
|
||||
/* Define various constants for the ThreadX RISC-V port. */
|
||||
|
||||
#define TX_INT_DISABLE 0x00000000 /* Disable interrupts value */
|
||||
#define TX_INT_ENABLE 0x00000008 /* Enable interrupt value */
|
||||
|
||||
/* Define the clock source for trace event entry time stamp. The following two item are port specific.
|
||||
For example, if the time source is at the address 0x0a800024 and is 16-bits in size, the clock
|
||||
source constants would be:
|
||||
|
||||
#define TX_TRACE_TIME_SOURCE *((ULONG *) 0x0a800024)
|
||||
#define TX_TRACE_TIME_MASK 0x0000FFFFUL
|
||||
|
||||
*/
|
||||
|
||||
#ifndef TX_TRACE_TIME_SOURCE
|
||||
#define TX_TRACE_TIME_SOURCE ++_tx_trace_simulated_time
|
||||
#endif
|
||||
#ifndef TX_TRACE_TIME_MASK
|
||||
#define TX_TRACE_TIME_MASK 0xFFFFFFFFUL
|
||||
#endif
|
||||
|
||||
/* Define the port specific options for the _tx_build_options variable. This variable indicates
|
||||
how the ThreadX library was built. */
|
||||
|
||||
#define TX_PORT_SPECIFIC_BUILD_OPTIONS 0
|
||||
|
||||
/* Define the in-line initialization constant so that modules with in-line
|
||||
initialization capabilities can prevent their initialization from being
|
||||
a function call. */
|
||||
|
||||
#define TX_INLINE_INITIALIZATION
|
||||
|
||||
/* Determine whether or not stack checking is enabled. By default, ThreadX stack checking is
|
||||
disabled. When the following is defined, ThreadX thread stack checking is enabled. If stack
|
||||
checking is enabled (TX_ENABLE_STACK_CHECKING is defined), the TX_DISABLE_STACK_FILLING
|
||||
define is negated, thereby forcing the stack fill which is necessary for the stack checking
|
||||
logic. */
|
||||
|
||||
#ifdef TX_ENABLE_STACK_CHECKING
|
||||
#undef TX_DISABLE_STACK_FILLING
|
||||
#endif
|
||||
|
||||
/* Define the TX_THREAD control block extensions for this port. The main reason
|
||||
for the multiple macros is so that backward compatibility can be maintained with
|
||||
existing ThreadX kernel awareness modules. */
|
||||
|
||||
#define TX_THREAD_EXTENSION_0
|
||||
#define TX_THREAD_EXTENSION_1
|
||||
#define TX_THREAD_EXTENSION_2
|
||||
#define TX_THREAD_EXTENSION_3
|
||||
|
||||
/* Define the port extensions of the remaining ThreadX objects. */
|
||||
|
||||
#define TX_BLOCK_POOL_EXTENSION
|
||||
#define TX_BYTE_POOL_EXTENSION
|
||||
#define TX_EVENT_FLAGS_GROUP_EXTENSION
|
||||
#define TX_MUTEX_EXTENSION
|
||||
#define TX_QUEUE_EXTENSION
|
||||
#define TX_SEMAPHORE_EXTENSION
|
||||
#define TX_TIMER_EXTENSION
|
||||
|
||||
/* Define the user extension field of the thread control block. Nothing
|
||||
additional is needed for this port so it is defined as white space. */
|
||||
|
||||
#ifndef TX_THREAD_USER_EXTENSION
|
||||
#define TX_THREAD_USER_EXTENSION
|
||||
#endif
|
||||
|
||||
/* Define the macros for processing extensions in tx_thread_create, tx_thread_delete,
|
||||
tx_thread_shell_entry, and tx_thread_terminate. */
|
||||
|
||||
#define TX_THREAD_CREATE_EXTENSION(thread_ptr)
|
||||
#define TX_THREAD_DELETE_EXTENSION(thread_ptr)
|
||||
#define TX_THREAD_COMPLETED_EXTENSION(thread_ptr)
|
||||
#define TX_THREAD_TERMINATED_EXTENSION(thread_ptr)
|
||||
|
||||
/* Define the ThreadX object creation extensions for the remaining objects. */
|
||||
|
||||
#define TX_BLOCK_POOL_CREATE_EXTENSION(pool_ptr)
|
||||
#define TX_BYTE_POOL_CREATE_EXTENSION(pool_ptr)
|
||||
#define TX_EVENT_FLAGS_GROUP_CREATE_EXTENSION(group_ptr)
|
||||
#define TX_MUTEX_CREATE_EXTENSION(mutex_ptr)
|
||||
#define TX_QUEUE_CREATE_EXTENSION(queue_ptr)
|
||||
#define TX_SEMAPHORE_CREATE_EXTENSION(semaphore_ptr)
|
||||
#define TX_TIMER_CREATE_EXTENSION(timer_ptr)
|
||||
|
||||
/* Define the ThreadX object deletion extensions for the remaining objects. */
|
||||
|
||||
#define TX_BLOCK_POOL_DELETE_EXTENSION(pool_ptr)
|
||||
#define TX_BYTE_POOL_DELETE_EXTENSION(pool_ptr)
|
||||
#define TX_EVENT_FLAGS_GROUP_DELETE_EXTENSION(group_ptr)
|
||||
#define TX_MUTEX_DELETE_EXTENSION(mutex_ptr)
|
||||
#define TX_QUEUE_DELETE_EXTENSION(queue_ptr)
|
||||
#define TX_SEMAPHORE_DELETE_EXTENSION(semaphore_ptr)
|
||||
#define TX_TIMER_DELETE_EXTENSION(timer_ptr)
|
||||
|
||||
/* Define ThreadX interrupt lockout and restore macros for protection on
|
||||
access of critical kernel information. The restore interrupt macro must
|
||||
restore the interrupt posture of the running thread prior to the value
|
||||
present prior to the disable macro. In most cases, the save area macro
|
||||
is used to define a local function save area for the disable and restore
|
||||
macros. */
|
||||
|
||||
#ifdef TX_DISABLE_INLINE
|
||||
|
||||
ULONG64 _tx_thread_interrupt_control(unsigned int new_posture);
|
||||
|
||||
#define TX_INTERRUPT_SAVE_AREA register ULONG64 interrupt_save;
|
||||
|
||||
#define TX_DISABLE interrupt_save = _tx_thread_interrupt_control(TX_INT_DISABLE);
|
||||
#define TX_RESTORE _tx_thread_interrupt_control(interrupt_save);
|
||||
|
||||
#else
|
||||
|
||||
#define TX_INTERRUPT_SAVE_AREA ULONG64 interrupt_save;
|
||||
/* Atomically read mstatus into interrupt_save and clear bit 3 of mstatus. */
|
||||
#define TX_DISABLE \
|
||||
{ __asm__("csrrci %0, mstatus, 0x08" : "=r"(interrupt_save) :); };
|
||||
/* We only care about mstatus.mie (bit 3), so mask interrupt_save and write to mstatus. */
|
||||
#define TX_RESTORE \
|
||||
{ \
|
||||
register ULONG64 __tempmask = interrupt_save & 0x08; \
|
||||
__asm__("csrrs x0, mstatus, %0 \n\t" : : "r"(__tempmask) :); \
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
/* Define the interrupt lockout macros for each ThreadX object. */
|
||||
|
||||
#define TX_BLOCK_POOL_DISABLE TX_DISABLE
|
||||
#define TX_BYTE_POOL_DISABLE TX_DISABLE
|
||||
#define TX_EVENT_FLAGS_GROUP_DISABLE TX_DISABLE
|
||||
#define TX_MUTEX_DISABLE TX_DISABLE
|
||||
#define TX_QUEUE_DISABLE TX_DISABLE
|
||||
#define TX_SEMAPHORE_DISABLE TX_DISABLE
|
||||
|
||||
/* Define the version ID of ThreadX. This may be utilized by the application. */
|
||||
|
||||
#ifdef TX_THREAD_INIT
|
||||
CHAR _tx_version_id[] = "Copyright (c) 2024 Microsoft Corporation. * ThreadX RISC-V64/GNU Version 6.4.2 *";
|
||||
#else
|
||||
extern CHAR _tx_version_id[];
|
||||
#endif
|
||||
|
||||
#endif /*not __ASSEMBLER__ */
|
||||
#endif
|
||||
Reference in New Issue
Block a user