[PATCH rtems-lwip v2 5/7] RTEMS port of lwIP for STM32 and STM32F4 BSP
Duc Doan
dtbpkmte at gmail.com
Tue Sep 6 16:20:34 UTC 2022
---
rtemslwip/stm32f4/lwipopts.h | 24 ++-
rtemslwip/stm32f4/netstart.c | 29 +++-
rtemslwip/stm32f4/stm32f4_lwip.c | 14 ++
rtemslwip/stm32f4/stm32f4_lwip.h | 9 +
stm32/ethernetif.c | 288 +++++++++++++++++++++++++++++--
stm32/ethernetif.h | 14 +-
stm32/lwip.c | 103 +++--------
stm32/lwip.h | 2 +
8 files changed, 374 insertions(+), 109 deletions(-)
create mode 100644 rtemslwip/stm32f4/stm32f4_lwip.c
create mode 100644 rtemslwip/stm32f4/stm32f4_lwip.h
diff --git a/rtemslwip/stm32f4/lwipopts.h b/rtemslwip/stm32f4/lwipopts.h
index 49a19e4..41cc68f 100644
--- a/rtemslwip/stm32f4/lwipopts.h
+++ b/rtemslwip/stm32f4/lwipopts.h
@@ -28,7 +28,7 @@
/* Within 'USER CODE' section, code will be kept by default at each generation */
/* USER CODE BEGIN 0 */
-
+#include <stm32f4xx_hal.h>
/* USER CODE END 0 */
#ifdef __cplusplus
@@ -38,7 +38,7 @@
/* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/
/*----- WITH_RTOS disabled (Since FREERTOS is not set) -----*/
-#define WITH_RTOS 0
+#define WITH_RTOS 1
/*----- CHECKSUM_BY_HARDWARE disabled -----*/
#define CHECKSUM_BY_HARDWARE 0
/*-----------------------------------------------------------------------------*/
@@ -50,11 +50,11 @@
/*----- Value in opt.h for NO_SYS: 0 -----*/
#define NO_SYS 0
/*----- Value in opt.h for SYS_LIGHTWEIGHT_PROT: 1 -----*/
-#define SYS_LIGHTWEIGHT_PROT 0
+#define SYS_LIGHTWEIGHT_PROT 1
/*----- Value in opt.h for MEM_ALIGNMENT: 1 -----*/
#define MEM_ALIGNMENT 4
/*----- Default Value for H7 devices: 0x30044000 -----*/
-#define LWIP_RAM_HEAP_POINTER 0x20017f58
+//#define LWIP_RAM_HEAP_POINTER 0x20017f58
/*----- Value supported for H7 devices: 1 -----*/
#define LWIP_SUPPORT_CUSTOM_PBUF 1
/*----- Value in opt.h for LWIP_ETHERNET: LWIP_ARP || PPPOE_SUPPORT -*/
@@ -70,13 +70,13 @@
/*----- Value in opt.h for TCP_WND_UPDATE_THRESHOLD: LWIP_MIN(TCP_WND/4, TCP_MSS*4) -----*/
#define TCP_WND_UPDATE_THRESHOLD 536
/*----- Value in opt.h for LWIP_NETIF_LINK_CALLBACK: 0 -----*/
-#define LWIP_NETIF_LINK_CALLBACK 1
+//#define LWIP_NETIF_LINK_CALLBACK 0
/*----- Value in opt.h for LWIP_NETCONN: 1 -----*/
#define LWIP_NETCONN 1
/*----- Value in opt.h for LWIP_SOCKET: 1 -----*/
#define LWIP_SOCKET 1
/*----- Value in opt.h for RECV_BUFSIZE_DEFAULT: INT_MAX -----*/
-#define RECV_BUFSIZE_DEFAULT 2000000000
+//#define RECV_BUFSIZE_DEFAULT 2000000000
/*----- Value in opt.h for LWIP_STATS: 1 -----*/
#define LWIP_STATS 0
/*----- Value in opt.h for CHECKSUM_GEN_IP: 1 -----*/
@@ -115,9 +115,19 @@
#define LWIP_IPV6 1
#define LWIP_TCPIP_CORE_LOCKING 1
+#define TCPIP_THREAD_STACKSIZE 1024
+#define TCPIP_THREAD_PRIO 24
+#define TCPIP_MBOX_SIZE 6
+#define SLIPIF_THREAD_STACKSIZE 1024
+#define SLIPIF_THREAD_PRIO 3
+#define DEFAULT_THREAD_STACKSIZE 1024
+#define DEFAULT_THREAD_PRIO 3
+#define DEFAULT_UDP_RECVMBOX_SIZE 6
+#define DEFAULT_TCP_RECVMBOX_SIZE 6
+#define DEFAULT_ACCEPTMBOX_SIZE 6
#define LWIP_DHCP 1
-#define DHCP_DOES_ARP_CHECK 0
+#define DHCP_DOES_ARP_CHECK 1
#define LWIP_DNS 1
diff --git a/rtemslwip/stm32f4/netstart.c b/rtemslwip/stm32f4/netstart.c
index 88e846a..6ddcc81 100644
--- a/rtemslwip/stm32f4/netstart.c
+++ b/rtemslwip/stm32f4/netstart.c
@@ -26,7 +26,10 @@
#include <netstart.h>
#include <lwip/tcpip.h>
-#include <ethernetif.h>
+#include "lwip.h"
+#include "lwip/init.h"
+#include "lwip/netif.h"
+#include "ethernetif.h"
int start_networking(
struct netif *net_interface,
@@ -38,15 +41,35 @@ int start_networking(
{
tcpip_init( NULL, NULL );
- netif_add(net_interface, ipaddr, netmask, gw, NULL, ðernetif_init, &tcpip_input);
+ set_mac_addr(mac_ethernet_address);
+
+ netif_add(
+ net_interface,
+ &ipaddr->u_addr.ip4,
+ &netmask->u_addr.ip4,
+ &gateway->u_addr.ip4,
+ NULL,
+ ethernetif_init,
+ tcpip_input
+ );
netif_set_default(net_interface);
if (netif_is_link_up(net_interface)) {
netif_set_up(net_interface);
+
+ sys_thread_new(
+ "stm32f4_ethernet_link_thread",
+ ethernet_link_thread,
+ net_interface,
+ 1024,
+ DEFAULT_THREAD_PRIO
+ );
+
+ return 0;
} else {
netif_set_down(net_interface);
}
- return 0;
+ return -1;
}
diff --git a/rtemslwip/stm32f4/stm32f4_lwip.c b/rtemslwip/stm32f4/stm32f4_lwip.c
new file mode 100644
index 0000000..1f4f07e
--- /dev/null
+++ b/rtemslwip/stm32f4/stm32f4_lwip.c
@@ -0,0 +1,14 @@
+#include "stm32f4_lwip.h"
+
+extern ETH_HandleTypeDef heth;
+
+__attribute__((weak)) void Error_Handler(void) {
+ __disable_irq();
+ while (1)
+ {
+ }
+}
+
+void ETH_IRQHandler(void) {
+ HAL_ETH_IRQHandler(&heth);
+}
diff --git a/rtemslwip/stm32f4/stm32f4_lwip.h b/rtemslwip/stm32f4/stm32f4_lwip.h
new file mode 100644
index 0000000..8a2b03a
--- /dev/null
+++ b/rtemslwip/stm32f4/stm32f4_lwip.h
@@ -0,0 +1,9 @@
+#ifndef LIPLWIP_RTEMSLWIP_STM32F4_STM32F4_LWIP_H
+#define LIPLWIP_RTEMSLWIP_STM32F4_STM32F4_LWIP_H
+
+#include <stm32f4xx_hal.h>
+
+void ErrorHandler(void);
+void ETH_IRQHandler(void);
+
+#endif /* LIPLWIP_RTEMSLWIP_STM32F4_STM32F4_LWIP_H */
diff --git a/stm32/ethernetif.c b/stm32/ethernetif.c
index e54c8b6..a8e9f76 100644
--- a/stm32/ethernetif.c
+++ b/stm32/ethernetif.c
@@ -19,10 +19,14 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
+#ifndef __rtems__
#include "main.h"
+#endif /* __rtems__ */
+#ifdef __rtems__
+#include <bsp.h>
+#include <bsp/irq.h>
+#endif /* __rtems__ */
#include "lwip/opt.h"
-#include "lwip/mem.h"
-#include "lwip/memp.h"
#include "lwip/timeouts.h"
#include "netif/ethernet.h"
#include "netif/etharp.h"
@@ -30,6 +34,10 @@
#include "ethernetif.h"
#include "dp83848.h"
#include <string.h>
+#ifndef __rtems__
+#include "cmsis_os.h"
+#endif /* __rtems__ */
+#include "lwip/tcpip.h"
/* Within 'USER CODE' section, code will be kept by default at each generation */
/* USER CODE BEGIN 0 */
@@ -37,7 +45,18 @@
/* USER CODE END 0 */
/* Private define ------------------------------------------------------------*/
-
+/* The time to block waiting for input. */
+#ifndef __rtems__
+#define TIME_WAITING_FOR_INPUT ( portMAX_DELAY )
+#endif /* __rtems__ */
+#ifdef __rtems__
+#define TIME_WAITING_FOR_INPUT ( RTEMS_NO_TIMEOUT )
+#endif /* __rtems__ */
+
+/* USER CODE BEGIN OS_THREAD_STACK_SIZE_WITH_RTOS */
+/* Stack size of the interface thread */
+#define INTERFACE_THREAD_STACK_SIZE ( 350 )
+/* USER CODE END OS_THREAD_STACK_SIZE_WITH_RTOS */
/* Network interface name */
#define IFNAME0 's'
#define IFNAME1 't'
@@ -104,9 +123,20 @@ ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptor
/* USER CODE END 2 */
+#ifndef __rtems__
+osSemaphoreId RxPktSemaphore = NULL; /* Semaphore to signal incoming packets */
+osSemaphoreId TxPktSemaphore = NULL; /* Semaphore to signal transmit packet complete */
+#else
+rtems_id RxPktSemaphore; /* Semaphore to signal incoming packets */
+rtems_id TxPktSemaphore; /* Semaphore to signal transmit packet complete */
+#endif /* __rtems__ */
+
/* Global Ethernet handle */
ETH_HandleTypeDef heth;
ETH_TxPacketConfig TxConfig;
+#ifdef __rtems__
+static uint8_t *MACAddr;
+#endif /* __rtems__ */
/* Private function prototypes -----------------------------------------------*/
int32_t ETH_PHY_IO_Init(void);
@@ -129,8 +159,56 @@ dp83848_IOCtx_t DP83848_IOCtx = {ETH_PHY_IO_Init,
/* Private functions ---------------------------------------------------------*/
void pbuf_free_custom(struct pbuf *p);
-/* USER CODE BEGIN 4 */
+/**
+ * @brief Ethernet Rx Transfer completed callback
+ * @param handlerEth: ETH handler
+ * @retval None
+ */
+void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth)
+{
+#ifndef __rtems__
+ osSemaphoreRelease(RxPktSemaphore);
+#else
+ rtems_semaphore_release(RxPktSemaphore);
+#endif /* __rtems__ */
+}
+/**
+ * @brief Ethernet Tx Transfer completed callback
+ * @param handlerEth: ETH handler
+ * @retval None
+ */
+void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *handlerEth)
+{
+#ifndef __rtems__
+ osSemaphoreRelease(TxPktSemaphore);
+#else
+ rtems_semaphore_release(TxPktSemaphore);
+#endif /* __rtems__ */
+}
+/**
+ * @brief Ethernet DMA transfer error callback
+ * @param handlerEth: ETH handler
+ * @retval None
+ */
+void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *handlerEth)
+{
+ if((HAL_ETH_GetDMAError(handlerEth) & ETH_DMASR_RBUS) == ETH_DMASR_RBUS)
+ {
+#ifndef __rtems__
+ osSemaphoreRelease(RxPktSemaphore);
+#else
+ rtems_semaphore_release(RxPktSemaphore);
+#endif /* __rtems__ */
+ }
+}
+/* USER CODE BEGIN 4 */
+#ifdef __rtems__
+void set_mac_addr(uint8_t *mac_addr)
+{
+ MACAddr = mac_addr;
+}
+#endif /* __rtems__ */
/* USER CODE END 4 */
/*******************************************************************************
@@ -146,17 +224,33 @@ void pbuf_free_custom(struct pbuf *p);
static void low_level_init(struct netif *netif)
{
HAL_StatusTypeDef hal_eth_init_status = HAL_OK;
+/* USER CODE BEGIN OS_THREAD_ATTR_CMSIS_RTOS_V2 */
+#ifndef __rtems__
+ osThreadAttr_t attributes;
+#endif /* __rtems__ */
+/* USER CODE END OS_THREAD_ATTR_CMSIS_RTOS_V2 */
+ uint32_t duplex, speed = 0;
+ int32_t PHYLinkState = 0;
+ ETH_MACConfigTypeDef MACConf = {0};
/* Start ETH HAL Init */
+#ifndef __rtems__
uint8_t MACAddr[6] ;
+#endif /* __rtems__ */
heth.Instance = ETH;
+#ifndef __rtems__
MACAddr[0] = 0x02;
MACAddr[1] = 0x00;
MACAddr[2] = 0x00;
MACAddr[3] = 0x00;
MACAddr[4] = 0x00;
MACAddr[5] = 0x01;
+#endif /* __rtems__ */
+#ifndef __rtems__
heth.Init.MACAddr = &MACAddr[0];
+#else
+ heth.Init.MACAddr = MACAddr;
+#endif /* __rtems__ */
heth.Init.MediaInterface = HAL_ETH_RMII_MODE;
heth.Init.TxDesc = DMATxDscrTab;
heth.Init.RxDesc = DMARxDscrTab;
@@ -202,6 +296,51 @@ static void low_level_init(struct netif *netif)
netif->flags |= NETIF_FLAG_BROADCAST;
#endif /* LWIP_ARP */
+ /* create a binary semaphore used for informing ethernetif of frame reception */
+#ifndef __rtems__
+ RxPktSemaphore = osSemaphoreNew(1, 1, NULL);
+#else
+ rtems_semaphore_create(
+ rtems_build_name('R', 'x', 'p', 'k'),
+ 1,
+ RTEMS_SIMPLE_BINARY_SEMAPHORE,
+ 0,
+ &RxPktSemaphore
+ );
+#endif /* __rtems__ */
+
+ /* create a binary semaphore used for informing ethernetif of frame transmission */
+#ifndef __rtems__
+ TxPktSemaphore = osSemaphoreNew(1, 1, NULL);
+#else
+ rtems_semaphore_create(
+ rtems_build_name('T', 'x', 'p', 'k'),
+ 1,
+ RTEMS_SIMPLE_BINARY_SEMAPHORE,
+ 0,
+ &TxPktSemaphore
+ );
+#endif /* __rtems__ */
+
+ /* create the task that handles the ETH_MAC */
+/* USER CODE BEGIN OS_THREAD_NEW_CMSIS_RTOS_V2 */
+#ifndef __rtems__
+ memset(&attributes, 0x0, sizeof(osThreadAttr_t));
+ attributes.name = "EthIf";
+ attributes.stack_size = INTERFACE_THREAD_STACK_SIZE;
+ attributes.priority = osPriorityRealtime;
+ osThreadNew(ethernetif_input, netif, &attributes);
+#else
+ sys_thread_new(
+ "ethernetif_input_thread",
+ ethernetif_input,
+ netif,
+ RTEMS_MINIMUM_STACK_SIZE,
+ DEFAULT_THREAD_PRIO
+ );
+#endif /* __rtem__ */
+/* USER CODE END OS_THREAD_NEW_CMSIS_RTOS_V2 */
+
/* USER CODE BEGIN PHY_PRE_CONFIG */
/* USER CODE END PHY_PRE_CONFIG */
@@ -213,8 +352,64 @@ static void low_level_init(struct netif *netif)
if (hal_eth_init_status == HAL_OK)
{
- /* Get link state */
- ethernet_link_check_state(netif);
+ PHYLinkState = DP83848_GetLinkState(&DP83848);
+
+ /* Get link state */
+ if(PHYLinkState <= DP83848_STATUS_LINK_DOWN)
+ {
+ netif_set_link_down(netif);
+ netif_set_down(netif);
+ }
+ else
+ {
+ switch (PHYLinkState)
+ {
+ case DP83848_STATUS_100MBITS_FULLDUPLEX:
+ duplex = ETH_FULLDUPLEX_MODE;
+ speed = ETH_SPEED_100M;
+ break;
+ case DP83848_STATUS_100MBITS_HALFDUPLEX:
+ duplex = ETH_HALFDUPLEX_MODE;
+ speed = ETH_SPEED_100M;
+ break;
+ case DP83848_STATUS_10MBITS_FULLDUPLEX:
+ duplex = ETH_FULLDUPLEX_MODE;
+ speed = ETH_SPEED_10M;
+ break;
+ case DP83848_STATUS_10MBITS_HALFDUPLEX:
+ duplex = ETH_HALFDUPLEX_MODE;
+ speed = ETH_SPEED_10M;
+ break;
+ default:
+ duplex = ETH_FULLDUPLEX_MODE;
+ speed = ETH_SPEED_100M;
+ break;
+ }
+
+ /* Get MAC Config MAC */
+ HAL_ETH_GetMACConfig(&heth, &MACConf);
+ MACConf.DuplexMode = duplex;
+ MACConf.Speed = speed;
+ HAL_ETH_SetMACConfig(&heth, &MACConf);
+
+#ifdef __rtems__
+ rtems_interrupt_handler_install(
+ STM32F4_IRQ_ETH,
+ NULL,
+ RTEMS_INTERRUPT_UNIQUE,
+ HAL_ETH_IRQHandler,
+ &heth
+ );
+#endif /* __rtems__ */
+ HAL_ETH_Start_IT(&heth);
+ netif_set_up(netif);
+ netif_set_link_up(netif);
+
+/* USER CODE BEGIN PHY_POST_CONFIG */
+
+/* USER CODE END PHY_POST_CONFIG */
+ }
+
}
else
{
@@ -277,7 +472,20 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p)
TxConfig.TxBuffer = Txbuffer;
TxConfig.pData = p;
- HAL_ETH_Transmit(&heth, &TxConfig, ETH_DMA_TRANSMIT_TIMEOUT);
+ pbuf_ref(p);
+
+ HAL_ETH_Transmit_IT(&heth, &TxConfig);
+#ifndef __rtems__
+ while(osSemaphoreAcquire(TxPktSemaphore, TIME_WAITING_FOR_INPUT)!=osOK)
+#else
+ while (rtems_semaphore_obtain(TxPktSemaphore, RTEMS_DEFAULT_OPTIONS,
+ TIME_WAITING_FOR_INPUT) != RTEMS_SUCCESSFUL)
+#endif /* __rtems__ */
+
+ {
+ }
+
+ HAL_ETH_ReleaseTxPacket(&heth);
return errval;
}
@@ -311,21 +519,33 @@ static struct pbuf * low_level_input(struct netif *netif)
*
* @param netif the lwip network interface structure for this ethernetif
*/
-void ethernetif_input(struct netif *netif)
+void ethernetif_input(void* argument)
{
struct pbuf *p = NULL;
+ struct netif *netif = (struct netif *) argument;
- do
+ for( ;; )
{
- p = low_level_input( netif );
- if (p != NULL)
+#ifndef __rtems__
+ if (osSemaphoreAcquire(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK)
+#else
+ if (rtems_semaphore_obtain(RxPktSemaphore, RTEMS_DEFAULT_OPTIONS,
+ TIME_WAITING_FOR_INPUT) == RTEMS_SUCCESSFUL)
+#endif /* __rtems__ */
{
- if (netif->input( p, netif) != ERR_OK )
+ do
{
- pbuf_free(p);
- }
+ p = low_level_input( netif );
+ if (p != NULL)
+ {
+ if (netif->input( p, netif) != ERR_OK )
+ {
+ pbuf_free(p);
+ }
+ }
+ } while(p!=NULL);
}
- } while(p!=NULL);
+ }
}
#if !LWIP_ARP
@@ -423,12 +643,17 @@ void pbuf_free_custom(struct pbuf *p)
if (RxAllocStatus == RX_ALLOC_ERROR)
{
RxAllocStatus = RX_ALLOC_OK;
- RxPkt = 1 ;
+#ifndef __rtems__
+ osSemaphoreRelease(RxPktSemaphore);
+#else
+ rtems_semaphore_release(RxPktSemaphore);
+#endif /* __rtems__ */
}
}
/* USER CODE BEGIN 6 */
+#ifndef __rtems__
/**
* @brief Returns the current time in milliseconds
* when LWIP_TIMERS == 1 and NO_SYS == 1
@@ -439,6 +664,7 @@ u32_t sys_now(void)
{
return HAL_GetTick();
}
+#endif /* __rtems__ */
/* USER CODE END 6 */
@@ -488,6 +714,11 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ /* Peripheral interrupt init */
+#ifndef __rtems__
+ HAL_NVIC_SetPriority(ETH_IRQn, 5, 0);
+ HAL_NVIC_EnableIRQ(ETH_IRQn);
+#endif /* __rtems__ */
/* USER CODE BEGIN ETH_MspInit 1 */
/* USER CODE END ETH_MspInit 1 */
@@ -521,6 +752,9 @@ void HAL_ETH_MspDeInit(ETH_HandleTypeDef* ethHandle)
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13);
+ /* Peripheral interrupt Deinit*/
+ HAL_NVIC_DisableIRQ(ETH_IRQn);
+
/* USER CODE BEGIN ETH_MspDeInit 1 */
/* USER CODE END ETH_MspDeInit 1 */
@@ -605,17 +839,24 @@ int32_t ETH_PHY_IO_GetTick(void)
* @param argument: netif
* @retval None
*/
-void ethernet_link_check_state(struct netif *netif)
+void ethernet_link_thread(void* argument)
{
ETH_MACConfigTypeDef MACConf = {0};
int32_t PHYLinkState = 0;
uint32_t linkchanged = 0U, speed = 0U, duplex = 0U;
+ struct netif *netif = (struct netif *) argument;
+/* USER CODE BEGIN ETH link init */
+
+/* USER CODE END ETH link init */
+
+ for(;;)
+ {
PHYLinkState = DP83848_GetLinkState(&DP83848);
if(netif_is_link_up(netif) && (PHYLinkState <= DP83848_STATUS_LINK_DOWN))
{
- HAL_ETH_Stop(&heth);
+ HAL_ETH_Stop_IT(&heth);
netif_set_down(netif);
netif_set_link_down(netif);
}
@@ -660,6 +901,16 @@ void ethernet_link_check_state(struct netif *netif)
}
}
+/* USER CODE BEGIN ETH link Thread core code for User BSP */
+
+/* USER CODE END ETH link Thread core code for User BSP */
+
+#ifndef __rtems__
+ osDelay(100);
+#else
+ sys_arch_delay(100);
+#endif /* __rtems__ */
+ }
}
void HAL_ETH_RxAllocateCallback(uint8_t **buff)
@@ -735,3 +986,4 @@ void HAL_ETH_TxFreeCallback(uint32_t * buff)
/* USER CODE END 8 */
+
diff --git a/stm32/ethernetif.h b/stm32/ethernetif.h
index 76eb91b..552671a 100644
--- a/stm32/ethernetif.h
+++ b/stm32/ethernetif.h
@@ -23,23 +23,31 @@
#include "lwip/err.h"
#include "lwip/netif.h"
+#ifndef __rtems__
+#include "cmsis_os.h"
+#endif /* __rtems__ */
/* Within 'USER CODE' section, code will be kept by default at each generation */
/* USER CODE BEGIN 0 */
-
+#ifdef __rtems__
+void set_mac_addr(uint8_t *mac_addr);
+#endif /* __rtems__ */
/* USER CODE END 0 */
/* Exported functions ------------------------------------------------------- */
err_t ethernetif_init(struct netif *netif);
-void ethernetif_input(struct netif *netif);
-void ethernet_link_check_state(struct netif *netif);
+void ethernetif_input(void* argument);
+void ethernet_link_thread(void* argument );
void Error_Handler(void);
u32_t sys_jiffies(void);
+#ifndef __rtems__
u32_t sys_now(void);
+#endif /* __rtems__ */
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
#endif
+
diff --git a/stm32/lwip.c b/stm32/lwip.c
index 9b2af8a..82a09fe 100644
--- a/stm32/lwip.c
+++ b/stm32/lwip.c
@@ -19,6 +19,7 @@
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
+#ifndef __rtems__
#include "lwip.h"
#include "lwip/init.h"
#include "lwip/netif.h"
@@ -26,29 +27,29 @@
#include "lwip/sio.h"
#endif /* MDK ARM Compiler */
#include "ethernetif.h"
+#include <string.h>
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/* Private function prototypes -----------------------------------------------*/
static void ethernet_link_status_updated(struct netif *netif);
-static void Ethernet_Link_Periodic_Handle(struct netif *netif);
/* ETH Variables initialization ----------------------------------------------*/
void Error_Handler(void);
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
-uint32_t EthernetLinkTimer;
/* Variables Initialization */
struct netif gnetif;
ip4_addr_t ipaddr;
ip4_addr_t netmask;
ip4_addr_t gw;
-uint8_t IP_ADDRESS[4];
-uint8_t NETMASK_ADDRESS[4];
-uint8_t GATEWAY_ADDRESS[4];
+/* USER CODE BEGIN OS_THREAD_ATTR_CMSIS_RTOS_V2 */
+#define INTERFACE_THREAD_STACK_SIZE ( 1024 )
+osThreadAttr_t attributes;
+/* USER CODE END OS_THREAD_ATTR_CMSIS_RTOS_V2 */
/* USER CODE BEGIN 2 */
@@ -59,33 +60,16 @@ uint8_t GATEWAY_ADDRESS[4];
*/
void MX_LWIP_Init(void)
{
- /* IP addresses initialization */
- IP_ADDRESS[0] = 192;
- IP_ADDRESS[1] = 168;
- IP_ADDRESS[2] = 68;
- IP_ADDRESS[3] = 22;
- NETMASK_ADDRESS[0] = 255;
- NETMASK_ADDRESS[1] = 255;
- NETMASK_ADDRESS[2] = 255;
- NETMASK_ADDRESS[3] = 0;
- GATEWAY_ADDRESS[0] = 192;
- GATEWAY_ADDRESS[1] = 168;
- GATEWAY_ADDRESS[2] = 68;
- GATEWAY_ADDRESS[3] = 1;
+ /* Initilialize the LwIP stack with RTOS */
+ tcpip_init( NULL, NULL );
-/* USER CODE BEGIN IP_ADDRESSES */
-/* USER CODE END IP_ADDRESSES */
+ /* IP addresses initialization with DHCP (IPv4) */
+ ipaddr.addr = 0;
+ netmask.addr = 0;
+ gw.addr = 0;
- /* Initilialize the LwIP stack without RTOS */
- lwip_init();
-
- /* IP addresses initialization without DHCP (IPv4) */
- IP4_ADDR(&ipaddr, IP_ADDRESS[0], IP_ADDRESS[1], IP_ADDRESS[2], IP_ADDRESS[3]);
- IP4_ADDR(&netmask, NETMASK_ADDRESS[0], NETMASK_ADDRESS[1] , NETMASK_ADDRESS[2], NETMASK_ADDRESS[3]);
- IP4_ADDR(&gw, GATEWAY_ADDRESS[0], GATEWAY_ADDRESS[1], GATEWAY_ADDRESS[2], GATEWAY_ADDRESS[3]);
-
- /* add the network interface (IPv4/IPv6) without RTOS */
- netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
+ /* add the network interface (IPv4/IPv6) with RTOS */
+ netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input);
/* Registers the default network interface */
netif_set_default(&gnetif);
@@ -105,6 +89,16 @@ void MX_LWIP_Init(void)
netif_set_link_callback(&gnetif, ethernet_link_status_updated);
/* Create the Ethernet link handler thread */
+/* USER CODE BEGIN H7_OS_THREAD_NEW_CMSIS_RTOS_V2 */
+ memset(&attributes, 0x0, sizeof(osThreadAttr_t));
+ attributes.name = "EthLink";
+ attributes.stack_size = INTERFACE_THREAD_STACK_SIZE;
+ attributes.priority = osPriorityBelowNormal;
+ osThreadNew(ethernet_link_thread, &gnetif, &attributes);
+/* USER CODE END H7_OS_THREAD_NEW_CMSIS_RTOS_V2 */
+
+ /* Start DHCP negotiation for a network interface (IPv4) */
+ dhcp_start(&gnetif);
/* USER CODE BEGIN 3 */
@@ -118,54 +112,6 @@ void MX_LWIP_Init(void)
/* USER CODE END 4 */
#endif
-/**
- * @brief Ethernet Link periodic check
- * @param netif
- * @retval None
- */
-static void Ethernet_Link_Periodic_Handle(struct netif *netif)
-{
-/* USER CODE BEGIN 4_4_1 */
-/* USER CODE END 4_4_1 */
-
- /* Ethernet Link every 100ms */
- if (HAL_GetTick() - EthernetLinkTimer >= 100)
- {
- EthernetLinkTimer = HAL_GetTick();
- ethernet_link_check_state(netif);
- }
-/* USER CODE BEGIN 4_4 */
-/* USER CODE END 4_4 */
-}
-
-/**
- * ----------------------------------------------------------------------
- * Function given to help user to continue LwIP Initialization
- * Up to user to complete or change this function ...
- * Up to user to call this function in main.c in while (1) of main(void)
- *-----------------------------------------------------------------------
- * Read a received packet from the Ethernet buffers
- * Send it to the lwIP stack for handling
- * Handle timeouts if LWIP_TIMERS is set and without RTOS
- * Handle the llink status if LWIP_NETIF_LINK_CALLBACK is set and without RTOS
- */
-void MX_LWIP_Process(void)
-{
-/* USER CODE BEGIN 4_1 */
-/* USER CODE END 4_1 */
- ethernetif_input(&gnetif);
-
-/* USER CODE BEGIN 4_2 */
-/* USER CODE END 4_2 */
- /* Handle timeouts */
- sys_check_timeouts();
-
- Ethernet_Link_Periodic_Handle(&gnetif);
-
-/* USER CODE BEGIN 4_3 */
-/* USER CODE END 4_3 */
-}
-
/**
* @brief Notify the User about the network interface config status
* @param netif: the network interface
@@ -258,3 +204,4 @@ u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len)
}
#endif /* MDK ARM Compiler */
+#endif /* __rtems__ */
diff --git a/stm32/lwip.h b/stm32/lwip.h
index 02df90e..fbaf786 100644
--- a/stm32/lwip.h
+++ b/stm32/lwip.h
@@ -47,6 +47,7 @@
/* Global Variables ----------------------------------------------------------*/
extern ETH_HandleTypeDef heth;
+#ifndef __rtems__
/* LWIP init function */
void MX_LWIP_Init(void);
@@ -62,6 +63,7 @@ void MX_LWIP_Process(void);
/* USER CODE END 1 */
#endif /* WITH_RTOS */
+#endif /* __rtems__ */
#ifdef __cplusplus
}
#endif
--
2.37.2
More information about the devel
mailing list