[PATCH rtems-lwip v3 5/7] RTEMS port of lwIP for STM32 and STM32F4 BSP

Kinsey Moore kinsey.moore at oarcorp.com
Thu Sep 8 17:11:02 UTC 2022


There are a few places noted below where the code import rules aren't 
being followed.

On 9/8/2022 11:34, Duc Doan wrote:
> ---
>   rtemslwip/stm32f4/stm32f4_lwip.c |  14 ++++
>   rtemslwip/stm32f4/stm32f4_lwip.h |   9 +++
>   stm32/ethernetif.c               | 110 ++++++++++++++++++++++++++++++-
>   stm32/ethernetif.h               |   8 ++-
>   stm32/lwip.h                     |   2 +
>   5 files changed, 140 insertions(+), 3 deletions(-)
>   create mode 100644 rtemslwip/stm32f4/stm32f4_lwip.c
>   create mode 100644 rtemslwip/stm32f4/stm32f4_lwip.h
>
> 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 7a82c51..e71ac8f 100644
> --- a/stm32/ethernetif.c
> +++ b/stm32/ethernetif.c
> @@ -19,7 +19,12 @@
>   /* USER CODE END Header */
>   
>   /* Includes ------------------------------------------------------------------*/
> +#ifndef __rtems__
>   #include "main.h"
> +#else
> +#include <bsp.h>
> +#include <bsp/irq.h>
> +#endif /* __rtems__ */
>   #include "lwip/opt.h"
>   #include "lwip/timeouts.h"
>   #include "netif/ethernet.h"
> @@ -28,7 +33,9 @@
>   #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 */
> @@ -38,7 +45,12 @@
>   
>   /* Private define ------------------------------------------------------------*/
>   /* The time to block waiting for input. */
> +#ifndef __rtems__
>   #define TIME_WAITING_FOR_INPUT ( portMAX_DELAY )
> +#else
> +#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 )
> @@ -109,12 +121,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);
> @@ -144,7 +164,11 @@ void pbuf_free_custom(struct pbuf *p);
>     */
>   void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth)
>   {
> +#ifndef __rtems__
>     osSemaphoreRelease(RxPktSemaphore);
> +#else
> +  rtems_semaphore_release(RxPktSemaphore);
> +#endif /* __rtems__ */
>   }
>   /**
>     * @brief  Ethernet Tx Transfer completed callback
> @@ -153,7 +177,11 @@ void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth)
>     */
>   void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *handlerEth)
>   {
> +#ifndef __rtems__
>     osSemaphoreRelease(TxPktSemaphore);
> +#else
> +  rtems_semaphore_release(TxPktSemaphore);
> +#endif /* __rtems__ */
>   }
>   /**
>     * @brief  Ethernet DMA transfer error callback
> @@ -164,12 +192,21 @@ void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *handlerEth)
>   {
>     if((HAL_ETH_GetDMAError(handlerEth) & ETH_DMASR_RBUS) == ETH_DMASR_RBUS)
>     {
> -     osSemaphoreRelease(RxPktSemaphore);
It looks like this was just an accidental spacing issue.
> +#ifndef __rtems__
> +    osSemaphoreRelease(RxPktSemaphore);
> +#else
> +    rtems_semaphore_release(RxPktSemaphore);
> +#endif /* __rtems__ */
>     }
>   }
>   
>   /* USER CODE BEGIN 4 */
> -
Removed newline.
> +#ifdef __rtems__
> +void set_mac_addr(uint8_t *mac_addr)
> +{
> +  MACAddr = mac_addr;
> +}
> +#endif /* __rtems__ */
>   /* USER CODE END 4 */
>   
>   /*******************************************************************************
> @@ -186,15 +223,20 @@ 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;
> @@ -202,6 +244,9 @@ static void low_level_init(struct netif *netif)
>     MACAddr[4] = 0x00;
>     MACAddr[5] = 0x01;
>     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;
> @@ -248,18 +293,48 @@ static void low_level_init(struct netif *netif)
>     #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 */
> @@ -313,6 +388,15 @@ static void low_level_init(struct netif *netif)
>       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);
> @@ -387,7 +471,12 @@ static err_t low_level_output(struct netif *netif, struct pbuf *p)
>     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__ */
>   
>     {
>     }
> @@ -433,7 +522,12 @@ void ethernetif_input(void* argument)
>   
>     for( ;; )
>     {
> +#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__ */
>       {
>         do
>         {
> @@ -545,12 +639,17 @@ void pbuf_free_custom(struct pbuf *p)
>     if (RxAllocStatus == RX_ALLOC_ERROR)
>     {
>       RxAllocStatus = RX_ALLOC_OK;
> +#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
> @@ -561,6 +660,7 @@ u32_t sys_now(void)
>   {
>     return HAL_GetTick();
>   }
> +#endif /* __rtems__ */
>   
>   /* USER CODE END 6 */
>   
> @@ -611,8 +711,10 @@ void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
>       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 */
> @@ -799,7 +901,11 @@ void ethernet_link_thread(void* argument)
>   
>   /* USER CODE END ETH link Thread core code for User BSP */
>   
> +#ifndef __rtems__
>       osDelay(100);
> +#else
> +    sys_arch_delay(100);
> +#endif /* __rtems__ */
>     }
>   }
>   
> diff --git a/stm32/ethernetif.h b/stm32/ethernetif.h
> index 85c1acf..552671a 100644
> --- a/stm32/ethernetif.h
> +++ b/stm32/ethernetif.h
> @@ -23,11 +23,15 @@
>   
>   #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 */
> -
Removed newline.
> +#ifdef __rtems__
> +void set_mac_addr(uint8_t *mac_addr);
> +#endif /* __rtems__ */
>   /* USER CODE END 0 */
>   
>   /* Exported functions ------------------------------------------------------- */
> @@ -38,7 +42,9 @@ 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 */
>   
> 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


More information about the devel mailing list