fix ethernet config error and optimize ethernet speed for imxrt1052 from Liu_Weichao

This commit is contained in:
IACU 2023-07-20 16:42:20 +08:00
commit 27e9613dcf
8 changed files with 102 additions and 448 deletions

View File

@ -57,16 +57,12 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
//#include "FreeRTOS.h"
//#include "event_groups.h"
#endif
#include <board.h>
#include "netif/ethernet.h" #include "netif/ethernet.h"
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
#include "enet_ethernetif_priv.h" #include "enet_ethernetif_priv.h"
#include <board.h>
#include "fsl_enet.h" #include "fsl_enet.h"
#include "fsl_phy.h" #include "fsl_phy.h"
#include "fsl_gpio.h" #include "fsl_gpio.h"
@ -91,6 +87,7 @@ void enet_delay(uint32 ms)
void Time_Update_LwIP(void) void Time_Update_LwIP(void)
{ {
} }
ethernetif_config_t enet_cfg = { ethernetif_config_t enet_cfg = {
.phyAddress = BOARD_ENET0_PHY_ADDRESS, .phyAddress = BOARD_ENET0_PHY_ADDRESS,
.clockName = kCLOCK_CoreSysClk, .clockName = kCLOCK_CoreSysClk,
@ -109,7 +106,6 @@ void ethernetif_clk_init(void)
{ {
const clock_enet_pll_config_t config = {.enableClkOutput = true, .enableClkOutput25M = false, .loopDivider = 1}; const clock_enet_pll_config_t config = {.enableClkOutput = true, .enableClkOutput25M = false, .loopDivider = 1};
CLOCK_InitEnetPll(&config); CLOCK_InitEnetPll(&config);
SysTick_Config(SystemCoreClock / TICK_PER_SECOND);
} }
void ethernetif_gpio_init(void) void ethernetif_gpio_init(void)
@ -119,13 +115,15 @@ void ethernetif_gpio_init(void)
IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1TxClkOutputDir, true); IOMUXC_EnableMode(IOMUXC_GPR, kIOMUXC_GPR_ENET1TxClkOutputDir, true);
GPIO_PinInit(GPIO1, 3, &gpio_config); GPIO_PinInit(GPIO1, 3, &gpio_config);
GPIO_PinInit(GPIO1, 10, &gpio_config);
/* pull up the ENET_INT before RESET. */ /* pull up the ENET_INT before RESET. */
GPIO_WritePinOutput(GPIO1, 10, 1);
GPIO_WritePinOutput(GPIO1, 3, 0); GPIO_WritePinOutput(GPIO1, 3, 0);
enet_delay(30); enet_delay(30);
GPIO_WritePinOutput(GPIO1, 3, 1); GPIO_WritePinOutput(GPIO1, 3, 1);
} }
void ETH_BSP_Config(void) int ETH_BSP_Config(void)
{ {
static int flag = 0; static int flag = 0;
if(flag == 0) if(flag == 0)
@ -134,6 +132,7 @@ void ETH_BSP_Config(void)
ethernetif_gpio_init(); ethernetif_gpio_init();
flag = 1; flag = 1;
} }
return 0;
} }
void ethernetif_phy_init(struct ethernetif *ethernetif, void ethernetif_phy_init(struct ethernetif *ethernetif,
@ -206,16 +205,19 @@ void ethernetif_input(void *netif_arg)
LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif != NULL", (netif != NULL));
/* move received packet into a new pbuf */ while (1) {
while ((p = ethernetif_linkinput(netif)) != NULL) sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER);
{ /* move received packet into a new pbuf */
/* pass all packets to ethernet_input, which decides what packets it supports */ while ((p = ethernetif_linkinput(netif)) != NULL)
if ((ret = netif->input(p, netif)) != ERR_OK)
{ {
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); /* pass all packets to ethernet_input, which decides what packets it supports */
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p); if ((ret = netif->input(p, netif)) != ERR_OK)
pbuf_free(p); {
p = NULL; LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p);
pbuf_free(p);
p = NULL;
}
} }
} }
} }

View File

@ -58,22 +58,9 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#ifdef FSL_RTOS_XIUOS #include <xs_sem.h>
#define USE_RTOS 1
#define FSL_RTOS_FREE_RTOS
#endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
#include "xs_sem.h"
#else
#include "FreeRTOS.h"
#include "event_groups.h"
#include "list.h"
#endif
typedef uint32_t TickType_t; typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
@ -91,27 +78,6 @@ typedef unsigned long UBaseType_t;
#define pdPASS ( pdTRUE ) #define pdPASS ( pdTRUE )
#define pdFAIL ( pdFALSE ) #define pdFAIL ( pdFALSE )
#ifndef FSL_RTOS_XIUOS
typedef struct EventGroupDef_t
{
EventBits_t uxEventBits;
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxEventGroupNumber;
#endif
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
#endif
} EventGroup_t;
struct EventGroupDef_t;
typedef struct EventGroupDef_t * EventGroupHandle_t;
#endif
#endif
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
#include "enet_ethernetif_priv.h" #include "enet_ethernetif_priv.h"
@ -130,19 +96,13 @@ typedef struct EventGroupDef_t * EventGroupHandle_t;
struct ethernetif struct ethernetif
{ {
ENET_Type *base; ENET_Type *base;
#if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0)) || \ #if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0))
(USE_RTOS && defined(FSL_RTOS_FREE_RTOS))
enet_handle_t handle; enet_handle_t handle;
#endif #endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
int enetSemaphore; int enetSemaphore;
#else
EventGroupHandle_t enetTransmitAccessEvent;
#endif
EventBits_t txFlag; EventBits_t txFlag;
#endif
enet_rx_bd_struct_t *RxBuffDescrip; enet_rx_bd_struct_t *RxBuffDescrip;
enet_tx_bd_struct_t *TxBuffDescrip; enet_tx_bd_struct_t *TxBuffDescrip;
rx_buffer_t *RxDataBuff; rx_buffer_t *RxDataBuff;
@ -153,14 +113,6 @@ struct ethernetif
/******************************************************************************* /*******************************************************************************
* Code * Code
******************************************************************************/ ******************************************************************************/
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
int32 lwip_obtain_semaphore(struct netif *netif)
{
struct ethernetif *ethernetif = netif->state;
return (KSemaphoreObtain(ethernetif->enetSemaphore, WAITING_FOREVER) == EOK);
}
#if FSL_FEATURE_ENET_QUEUE > 1 #if FSL_FEATURE_ENET_QUEUE > 1
static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param) static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param)
#else #else
@ -169,44 +121,19 @@ static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, enet_event
{ {
struct netif *netif = (struct netif *)param; struct netif *netif = (struct netif *)param;
struct ethernetif *ethernetif = netif->state; struct ethernetif *ethernetif = netif->state;
BaseType_t xResult;
switch (event) switch (event)
{ {
case kENET_RxEvent: case kENET_RxEvent:
ethernetif_input(netif); ENET_DisableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
sys_sem_signal(get_eth_recv_sem());
break; break;
case kENET_TxEvent: case kENET_TxEvent:
#ifndef FSL_RTOS_XIUOS break;
{
portBASE_TYPE taskToWake = pdFALSE;
#ifdef __CA7_REV
if (SystemGetIRQNestingLevel())
#else
if (__get_IPSR())
#endif
{
xResult = xEventGroupSetBitsFromISR(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, &taskToWake);
if ((pdPASS == xResult) && (pdTRUE == taskToWake))
{
portYIELD_FROM_ISR(taskToWake);
}
}
else
{
xEventGroupSetBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag);
}
}
#endif
break;
default: default:
break; break;
} }
KSemaphoreAbandon(ethernetif->enetSemaphore);
} }
#endif
#if LWIP_IPV4 && LWIP_IGMP #if LWIP_IPV4 && LWIP_IGMP
err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group, err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group,
@ -312,11 +239,9 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
ENET_GetDefaultConfig(&config); ENET_GetDefaultConfig(&config);
config.ringNum = ENET_RING_NUM; config.ringNum = ENET_RING_NUM;
config.macSpecialConfig |= kENET_ControlPromiscuousEnable;
ethernetif_phy_init(ethernetif, ethernetifConfig, &config); ethernetif_phy_init(ethernetif, ethernetifConfig, &config);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
uint32_t instance; uint32_t instance;
static ENET_Type *const enetBases[] = ENET_BASE_PTRS; static ENET_Type *const enetBases[] = ENET_BASE_PTRS;
static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS; static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS;
@ -328,51 +253,37 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
/* Create the Event for transmit busy release trigger. */ /* Create the Event for transmit busy release trigger. */
#ifdef FSL_RTOS_XIUOS
if(ethernetif->enetSemaphore < 0) if(ethernetif->enetSemaphore < 0)
{ {
ethernetif->enetSemaphore = KSemaphoreCreate(0); ethernetif->enetSemaphore = KSemaphoreCreate(0);
} }
#else
ethernetif->enetTransmitAccessEvent = xEventGroupCreate();
#endif
ethernetif->txFlag = 0x1; ethernetif->txFlag = 0x1;
sys_sem_new(get_eth_recv_sem(), 0);
config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt; config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt;
for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++) for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++)
{ {
if (enetBases[instance] == ethernetif->base) if (enetBases[instance] == ethernetif->base)
{ {
#ifdef __CA7_REV
GIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
GIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
GIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#else
NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE #if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY); NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#endif /* __CA7_REV */
break; break;
} }
} }
LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases))); LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases)));
#endif /* USE_RTOS */
config.txAccelerConfig = kENET_TxAccelIpCheckEnabled | kENET_TxAccelProtoCheckEnabled;
/* Initialize the ENET module.*/ /* Initialize the ENET module.*/
ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock); ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif); ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif);
#endif
ENET_ActiveRead(ethernetif->base); ENET_ActiveRead(ethernetif->base);
// low_level_init();
} }
ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif) ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif)
@ -395,45 +306,17 @@ static unsigned char *enet_get_tx_buffer(struct ethernetif *ethernetif)
*/ */
static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length) static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length)
{ {
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS) uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{ {
status_t result; if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
lw_print("lw: [%s] len %d\n", __func__, length);
do
{ {
result = ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length); return ERR_OK;
if (result == kStatus_ENET_TxFrameBusy)
{
#ifdef FSL_RTOS_XIUOS
KSemaphoreObtain(ethernetif->enetSemaphore, portMAX_DELAY);
#else
xEventGroupWaitBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, pdTRUE, (BaseType_t) false,
portMAX_DELAY);
#endif
}
} while (result == kStatus_ENET_TxFrameBusy);
return ERR_OK;
}
#else
{
uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{
if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
{
return ERR_OK;
}
} }
return ERR_TIMEOUT;
} }
#endif
return ERR_TIMEOUT;
} }
struct pbuf *ethernetif_linkinput(struct netif *netif) struct pbuf *ethernetif_linkinput(struct netif *netif)
@ -538,6 +421,7 @@ struct pbuf *ethernetif_linkinput(struct netif *netif)
} }
} }
ENET_EnableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
return p; return p;
} }

View File

@ -57,11 +57,7 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
//#include "FreeRTOS.h"
//#include "event_groups.h"
#endif
#include "netif/ethernet.h" #include "netif/ethernet.h"
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
@ -209,16 +205,19 @@ void ethernetif_input(void *netif_arg)
LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif != NULL", (netif != NULL));
/* move received packet into a new pbuf */ while (1) {
while ((p = ethernetif_linkinput(netif)) != NULL) sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER);
{ /* move received packet into a new pbuf */
/* pass all packets to ethernet_input, which decides what packets it supports */ while ((p = ethernetif_linkinput(netif)) != NULL)
if ((ret = netif->input(p, netif)) != ERR_OK)
{ {
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); /* pass all packets to ethernet_input, which decides what packets it supports */
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p); if ((ret = netif->input(p, netif)) != ERR_OK)
pbuf_free(p); {
p = NULL; LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p);
pbuf_free(p);
p = NULL;
}
} }
} }
} }

View File

@ -58,22 +58,9 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#ifdef FSL_RTOS_XIUOS #include <xs_sem.h>
#define USE_RTOS 1
#define FSL_RTOS_FREE_RTOS
#endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
#include "xs_sem.h"
#else
#include "FreeRTOS.h"
#include "event_groups.h"
#include "list.h"
#endif
typedef uint32_t TickType_t; typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
@ -91,27 +78,6 @@ typedef unsigned long UBaseType_t;
#define pdPASS ( pdTRUE ) #define pdPASS ( pdTRUE )
#define pdFAIL ( pdFALSE ) #define pdFAIL ( pdFALSE )
#ifndef FSL_RTOS_XIUOS
typedef struct EventGroupDef_t
{
EventBits_t uxEventBits;
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxEventGroupNumber;
#endif
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
#endif
} EventGroup_t;
struct EventGroupDef_t;
typedef struct EventGroupDef_t * EventGroupHandle_t;
#endif
#endif
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
#include "enet_ethernetif_priv.h" #include "enet_ethernetif_priv.h"
@ -130,19 +96,13 @@ typedef struct EventGroupDef_t * EventGroupHandle_t;
struct ethernetif struct ethernetif
{ {
ENET_Type *base; ENET_Type *base;
#if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0)) || \ #if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0))
(USE_RTOS && defined(FSL_RTOS_FREE_RTOS))
enet_handle_t handle; enet_handle_t handle;
#endif #endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
int enetSemaphore; int enetSemaphore;
#else
EventGroupHandle_t enetTransmitAccessEvent;
#endif
EventBits_t txFlag; EventBits_t txFlag;
#endif
enet_rx_bd_struct_t *RxBuffDescrip; enet_rx_bd_struct_t *RxBuffDescrip;
enet_tx_bd_struct_t *TxBuffDescrip; enet_tx_bd_struct_t *TxBuffDescrip;
rx_buffer_t *RxDataBuff; rx_buffer_t *RxDataBuff;
@ -153,14 +113,6 @@ struct ethernetif
/******************************************************************************* /*******************************************************************************
* Code * Code
******************************************************************************/ ******************************************************************************/
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
int32 lwip_obtain_semaphore(struct netif *netif)
{
struct ethernetif *ethernetif = netif->state;
return (KSemaphoreObtain(ethernetif->enetSemaphore, WAITING_FOREVER) == EOK);
}
#if FSL_FEATURE_ENET_QUEUE > 1 #if FSL_FEATURE_ENET_QUEUE > 1
static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param) static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param)
#else #else
@ -169,44 +121,19 @@ static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, enet_event
{ {
struct netif *netif = (struct netif *)param; struct netif *netif = (struct netif *)param;
struct ethernetif *ethernetif = netif->state; struct ethernetif *ethernetif = netif->state;
BaseType_t xResult;
switch (event) switch (event)
{ {
case kENET_RxEvent: case kENET_RxEvent:
ethernetif_input(netif); ENET_DisableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
sys_sem_signal(get_eth_recv_sem());
break; break;
case kENET_TxEvent: case kENET_TxEvent:
#ifndef FSL_RTOS_XIUOS break;
{
portBASE_TYPE taskToWake = pdFALSE;
#ifdef __CA7_REV
if (SystemGetIRQNestingLevel())
#else
if (__get_IPSR())
#endif
{
xResult = xEventGroupSetBitsFromISR(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, &taskToWake);
if ((pdPASS == xResult) && (pdTRUE == taskToWake))
{
portYIELD_FROM_ISR(taskToWake);
}
}
else
{
xEventGroupSetBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag);
}
}
#endif
break;
default: default:
break; break;
} }
KSemaphoreAbandon(ethernetif->enetSemaphore);
} }
#endif
#if LWIP_IPV4 && LWIP_IGMP #if LWIP_IPV4 && LWIP_IGMP
err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group, err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group,
@ -315,7 +242,6 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
ethernetif_phy_init(ethernetif, ethernetifConfig, &config); ethernetif_phy_init(ethernetif, ethernetifConfig, &config);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
uint32_t instance; uint32_t instance;
static ENET_Type *const enetBases[] = ENET_BASE_PTRS; static ENET_Type *const enetBases[] = ENET_BASE_PTRS;
static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS; static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS;
@ -327,51 +253,37 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
/* Create the Event for transmit busy release trigger. */ /* Create the Event for transmit busy release trigger. */
#ifdef FSL_RTOS_XIUOS
if(ethernetif->enetSemaphore < 0) if(ethernetif->enetSemaphore < 0)
{ {
ethernetif->enetSemaphore = KSemaphoreCreate(0); ethernetif->enetSemaphore = KSemaphoreCreate(0);
} }
#else
ethernetif->enetTransmitAccessEvent = xEventGroupCreate();
#endif
ethernetif->txFlag = 0x1; ethernetif->txFlag = 0x1;
sys_sem_new(get_eth_recv_sem(), 0);
config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt; config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt;
for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++) for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++)
{ {
if (enetBases[instance] == ethernetif->base) if (enetBases[instance] == ethernetif->base)
{ {
#ifdef __CA7_REV
GIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
GIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
GIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#else
NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE #if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY); NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#endif /* __CA7_REV */
break; break;
} }
} }
LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases))); LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases)));
#endif /* USE_RTOS */
config.txAccelerConfig = kENET_TxAccelIpCheckEnabled | kENET_TxAccelProtoCheckEnabled;
/* Initialize the ENET module.*/ /* Initialize the ENET module.*/
ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock); ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif); ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif);
#endif
ENET_ActiveRead(ethernetif->base); ENET_ActiveRead(ethernetif->base);
// low_level_init();
} }
ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif) ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif)
@ -394,45 +306,17 @@ static unsigned char *enet_get_tx_buffer(struct ethernetif *ethernetif)
*/ */
static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length) static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length)
{ {
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS) uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{ {
status_t result; if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
lw_print("lw: [%s] len %d\n", __func__, length);
do
{ {
result = ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length); return ERR_OK;
if (result == kStatus_ENET_TxFrameBusy)
{
#ifdef FSL_RTOS_XIUOS
KSemaphoreObtain(ethernetif->enetSemaphore, portMAX_DELAY);
#else
xEventGroupWaitBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, pdTRUE, (BaseType_t) false,
portMAX_DELAY);
#endif
}
} while (result == kStatus_ENET_TxFrameBusy);
return ERR_OK;
}
#else
{
uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{
if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
{
return ERR_OK;
}
} }
return ERR_TIMEOUT;
} }
#endif
return ERR_TIMEOUT;
} }
struct pbuf *ethernetif_linkinput(struct netif *netif) struct pbuf *ethernetif_linkinput(struct netif *netif)
@ -537,6 +421,7 @@ struct pbuf *ethernetif_linkinput(struct netif *netif)
} }
} }
ENET_EnableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
return p; return p;
} }

View File

@ -57,11 +57,7 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
//#include "FreeRTOS.h"
//#include "event_groups.h"
#endif
#include "netif/ethernet.h" #include "netif/ethernet.h"
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
@ -209,16 +205,19 @@ void ethernetif_input(void *netif_arg)
LWIP_ASSERT("netif != NULL", (netif != NULL)); LWIP_ASSERT("netif != NULL", (netif != NULL));
/* move received packet into a new pbuf */ while (1) {
while ((p = ethernetif_linkinput(netif)) != NULL) sys_arch_sem_wait(get_eth_recv_sem(), WAITING_FOREVER);
{ /* move received packet into a new pbuf */
/* pass all packets to ethernet_input, which decides what packets it supports */ while ((p = ethernetif_linkinput(netif)) != NULL)
if ((ret = netif->input(p, netif)) != ERR_OK)
{ {
LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); /* pass all packets to ethernet_input, which decides what packets it supports */
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p); if ((ret = netif->input(p, netif)) != ERR_OK)
pbuf_free(p); {
p = NULL; LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
lw_print("lw: [%s] ret %d p %p\n", __func__, ret, p);
pbuf_free(p);
p = NULL;
}
} }
} }
} }

View File

@ -58,22 +58,9 @@
#include "netif/ppp/pppoe.h" #include "netif/ppp/pppoe.h"
#include "lwip/igmp.h" #include "lwip/igmp.h"
#include "lwip/mld6.h" #include "lwip/mld6.h"
#include "lwip/sys.h"
#ifdef FSL_RTOS_XIUOS #include <xs_sem.h>
#define USE_RTOS 1
#define FSL_RTOS_FREE_RTOS
#endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
#include "xs_sem.h"
#else
#include "FreeRTOS.h"
#include "event_groups.h"
#include "list.h"
#endif
typedef uint32_t TickType_t; typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
@ -91,27 +78,6 @@ typedef unsigned long UBaseType_t;
#define pdPASS ( pdTRUE ) #define pdPASS ( pdTRUE )
#define pdFAIL ( pdFALSE ) #define pdFAIL ( pdFALSE )
#ifndef FSL_RTOS_XIUOS
typedef struct EventGroupDef_t
{
EventBits_t uxEventBits;
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
#if ( configUSE_TRACE_FACILITY == 1 )
UBaseType_t uxEventGroupNumber;
#endif
#if ( ( configSUPPORT_STATIC_ALLOCATION == 1 ) && ( configSUPPORT_DYNAMIC_ALLOCATION == 1 ) )
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the event group is statically allocated to ensure no attempt is made to free the memory. */
#endif
} EventGroup_t;
struct EventGroupDef_t;
typedef struct EventGroupDef_t * EventGroupHandle_t;
#endif
#endif
#include "enet_ethernetif.h" #include "enet_ethernetif.h"
#include "enet_ethernetif_priv.h" #include "enet_ethernetif_priv.h"
@ -130,19 +96,13 @@ typedef struct EventGroupDef_t * EventGroupHandle_t;
struct ethernetif struct ethernetif
{ {
ENET_Type *base; ENET_Type *base;
#if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0)) || \ #if (defined(FSL_FEATURE_SOC_ENET_COUNT) && (FSL_FEATURE_SOC_ENET_COUNT > 0))
(USE_RTOS && defined(FSL_RTOS_FREE_RTOS))
enet_handle_t handle; enet_handle_t handle;
#endif #endif
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
#ifdef FSL_RTOS_XIUOS
int enetSemaphore; int enetSemaphore;
#else
EventGroupHandle_t enetTransmitAccessEvent;
#endif
EventBits_t txFlag; EventBits_t txFlag;
#endif
enet_rx_bd_struct_t *RxBuffDescrip; enet_rx_bd_struct_t *RxBuffDescrip;
enet_tx_bd_struct_t *TxBuffDescrip; enet_tx_bd_struct_t *TxBuffDescrip;
rx_buffer_t *RxDataBuff; rx_buffer_t *RxDataBuff;
@ -153,14 +113,6 @@ struct ethernetif
/******************************************************************************* /*******************************************************************************
* Code * Code
******************************************************************************/ ******************************************************************************/
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
int32 lwip_obtain_semaphore(struct netif *netif)
{
struct ethernetif *ethernetif = netif->state;
return (KSemaphoreObtain(ethernetif->enetSemaphore, WAITING_FOREVER) == EOK);
}
#if FSL_FEATURE_ENET_QUEUE > 1 #if FSL_FEATURE_ENET_QUEUE > 1
static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param) static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, uint32_t ringId, enet_event_t event, void *param)
#else #else
@ -169,44 +121,19 @@ static void ethernet_callback(ENET_Type *base, enet_handle_t *handle, enet_event
{ {
struct netif *netif = (struct netif *)param; struct netif *netif = (struct netif *)param;
struct ethernetif *ethernetif = netif->state; struct ethernetif *ethernetif = netif->state;
BaseType_t xResult;
switch (event) switch (event)
{ {
case kENET_RxEvent: case kENET_RxEvent:
ethernetif_input(netif); ENET_DisableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
sys_sem_signal(get_eth_recv_sem());
break; break;
case kENET_TxEvent: case kENET_TxEvent:
#ifndef FSL_RTOS_XIUOS break;
{
portBASE_TYPE taskToWake = pdFALSE;
#ifdef __CA7_REV
if (SystemGetIRQNestingLevel())
#else
if (__get_IPSR())
#endif
{
xResult = xEventGroupSetBitsFromISR(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, &taskToWake);
if ((pdPASS == xResult) && (pdTRUE == taskToWake))
{
portYIELD_FROM_ISR(taskToWake);
}
}
else
{
xEventGroupSetBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag);
}
}
#endif
break;
default: default:
break; break;
} }
KSemaphoreAbandon(ethernetif->enetSemaphore);
} }
#endif
#if LWIP_IPV4 && LWIP_IGMP #if LWIP_IPV4 && LWIP_IGMP
err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group, err_t ethernetif_igmp_mac_filter(struct netif *netif, const ip4_addr_t *group,
@ -315,7 +242,6 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
ethernetif_phy_init(ethernetif, ethernetifConfig, &config); ethernetif_phy_init(ethernetif, ethernetifConfig, &config);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
uint32_t instance; uint32_t instance;
static ENET_Type *const enetBases[] = ENET_BASE_PTRS; static ENET_Type *const enetBases[] = ENET_BASE_PTRS;
static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS; static const IRQn_Type enetTxIrqId[] = ENET_Transmit_IRQS;
@ -327,51 +253,37 @@ void ethernetif_enet_init(struct netif *netif, struct ethernetif *ethernetif,
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
/* Create the Event for transmit busy release trigger. */ /* Create the Event for transmit busy release trigger. */
#ifdef FSL_RTOS_XIUOS
if(ethernetif->enetSemaphore < 0) if(ethernetif->enetSemaphore < 0)
{ {
ethernetif->enetSemaphore = KSemaphoreCreate(0); ethernetif->enetSemaphore = KSemaphoreCreate(0);
} }
#else
ethernetif->enetTransmitAccessEvent = xEventGroupCreate();
#endif
ethernetif->txFlag = 0x1; ethernetif->txFlag = 0x1;
sys_sem_new(get_eth_recv_sem(), 0);
config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt; config.interrupt |= kENET_RxFrameInterrupt | kENET_TxFrameInterrupt | kENET_TxBufferInterrupt;
for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++) for (instance = 0; instance < ARRAY_SIZE(enetBases); instance++)
{ {
if (enetBases[instance] == ethernetif->base) if (enetBases[instance] == ethernetif->base)
{ {
#ifdef __CA7_REV
GIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
GIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
GIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#else
NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetRxIrqId[instance], ENET_PRIORITY);
NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY); NVIC_SetPriority(enetTxIrqId[instance], ENET_PRIORITY);
#if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE #if defined(ENET_ENHANCEDBUFFERDESCRIPTOR_MODE) && ENET_ENHANCEDBUFFERDESCRIPTOR_MODE
NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY); NVIC_SetPriority(enetTsIrqId[instance], ENET_1588_PRIORITY);
#endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */ #endif /* ENET_ENHANCEDBUFFERDESCRIPTOR_MODE */
#endif /* __CA7_REV */
break; break;
} }
} }
LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases))); LWIP_ASSERT("Input Ethernet base error!", (instance != ARRAY_SIZE(enetBases)));
#endif /* USE_RTOS */
config.txAccelerConfig = kENET_TxAccelIpCheckEnabled | kENET_TxAccelProtoCheckEnabled;
/* Initialize the ENET module.*/ /* Initialize the ENET module.*/
ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock); ENET_Init(ethernetif->base, &ethernetif->handle, &config, &buffCfg[0], netif->hwaddr, sysClock);
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS)
ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif); ENET_SetCallback(&ethernetif->handle, ethernet_callback, netif);
#endif
ENET_ActiveRead(ethernetif->base); ENET_ActiveRead(ethernetif->base);
// low_level_init();
} }
ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif) ENET_Type **ethernetif_enet_ptr(struct ethernetif *ethernetif)
@ -394,45 +306,17 @@ static unsigned char *enet_get_tx_buffer(struct ethernetif *ethernetif)
*/ */
static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length) static err_t enet_send_frame(struct ethernetif *ethernetif, unsigned char *data, const uint32_t length)
{ {
#if USE_RTOS && defined(FSL_RTOS_FREE_RTOS) uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{ {
status_t result; if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
lw_print("lw: [%s] len %d\n", __func__, length);
do
{ {
result = ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length); return ERR_OK;
if (result == kStatus_ENET_TxFrameBusy)
{
#ifdef FSL_RTOS_XIUOS
KSemaphoreObtain(ethernetif->enetSemaphore, portMAX_DELAY);
#else
xEventGroupWaitBits(ethernetif->enetTransmitAccessEvent, ethernetif->txFlag, pdTRUE, (BaseType_t) false,
portMAX_DELAY);
#endif
}
} while (result == kStatus_ENET_TxFrameBusy);
return ERR_OK;
}
#else
{
uint32_t counter;
for (counter = ENET_TIMEOUT; counter != 0U; counter--)
{
if (ENET_SendFrame(ethernetif->base, &ethernetif->handle, data, length) != kStatus_ENET_TxFrameBusy)
{
return ERR_OK;
}
} }
return ERR_TIMEOUT;
} }
#endif
return ERR_TIMEOUT;
} }
struct pbuf *ethernetif_linkinput(struct netif *netif) struct pbuf *ethernetif_linkinput(struct netif *netif)
@ -537,6 +421,7 @@ struct pbuf *ethernetif_linkinput(struct netif *netif)
} }
} }
ENET_EnableInterrupts(ethernetif->base, kENET_RxFrameInterrupt);
return p; return p;
} }

View File

@ -535,10 +535,10 @@ The STM32F4x7 allows computing and verifying the IP, UDP, TCP and ICMP checksums
#define DEFAULT_ACCEPTMBOX_SIZE 10 #define DEFAULT_ACCEPTMBOX_SIZE 10
#define DEFAULT_THREAD_PRIO 20 #define DEFAULT_THREAD_PRIO 20
#define DEFAULT_THREAD_STACKSIZE 1024 #define DEFAULT_THREAD_STACKSIZE 2048
#define TCPIP_THREAD_NAME "tcp" #define TCPIP_THREAD_NAME "tcp"
#define TCPIP_THREAD_STACKSIZE 1024 #define TCPIP_THREAD_STACKSIZE 2048
#define TCPIP_MBOX_SIZE 16 #define TCPIP_MBOX_SIZE 16
#define TCPIP_THREAD_PRIO 20 #define TCPIP_THREAD_PRIO 20

View File

@ -54,7 +54,7 @@
#define LWIP_TARGET_PORT LWIP_LOCAL_PORT #define LWIP_TARGET_PORT LWIP_LOCAL_PORT
#define LWIP_DEMO_TIMES 10 #define LWIP_DEMO_TIMES 10
#define LWIP_TASK_STACK_SIZE 1536 #define LWIP_TASK_STACK_SIZE 4096
#define LWIP_DEMO_TASK_PRIO 20 #define LWIP_DEMO_TASK_PRIO 20
// /* MAC address configuration. */ // /* MAC address configuration. */