Port to freeRTOS
UNTESTED
This commit is contained in:
@@ -32,14 +32,12 @@
|
||||
/* 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;
|
||||
@@ -76,16 +74,16 @@ void MX_LWIP_Init(void)
|
||||
/* USER CODE BEGIN IP_ADDRESSES */
|
||||
/* USER CODE END IP_ADDRESSES */
|
||||
|
||||
/* Initilialize the LwIP stack without RTOS */
|
||||
lwip_init();
|
||||
/* Initilialize the LwIP stack with RTOS */
|
||||
tcpip_init( NULL, NULL );
|
||||
|
||||
/* 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 +103,10 @@ 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_DEF_CREATE_CMSIS_RTOS_V1 */
|
||||
osThreadDef(EthLink, ethernet_link_thread, osPriorityBelowNormal, 0, configMINIMAL_STACK_SIZE *2);
|
||||
osThreadCreate (osThread(EthLink), &gnetif);
|
||||
/* USER CODE END H7_OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */
|
||||
|
||||
/* USER CODE BEGIN 3 */
|
||||
|
||||
@@ -118,54 +120,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
|
||||
|
||||
@@ -21,8 +21,6 @@
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
#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 +28,8 @@
|
||||
#include "ethernetif.h"
|
||||
#include "lan8742.h"
|
||||
#include <string.h>
|
||||
#include "cmsis_os.h"
|
||||
#include "lwip/tcpip.h"
|
||||
|
||||
/* Within 'USER CODE' section, code will be kept by default at each generation */
|
||||
/* USER CODE BEGIN 0 */
|
||||
@@ -37,7 +37,12 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* Private define ------------------------------------------------------------*/
|
||||
|
||||
/* The time to block waiting for input. */
|
||||
#define TIME_WAITING_FOR_INPUT ( portMAX_DELAY )
|
||||
/* 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'
|
||||
@@ -116,11 +121,15 @@ ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT] __attribute__((section(".TxDecr
|
||||
|
||||
/* USER CODE END 2 */
|
||||
|
||||
osSemaphoreId RxPktSemaphore = NULL; /* Semaphore to signal incoming packets */
|
||||
osSemaphoreId TxPktSemaphore = NULL; /* Semaphore to signal transmit packet complete */
|
||||
|
||||
/* Global Ethernet handle */
|
||||
ETH_HandleTypeDef heth;
|
||||
ETH_TxPacketConfig TxConfig;
|
||||
|
||||
/* Private function prototypes -----------------------------------------------*/
|
||||
static void ethernetif_input(void const * argument);
|
||||
int32_t ETH_PHY_IO_Init(void);
|
||||
int32_t ETH_PHY_IO_DeInit (void);
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal);
|
||||
@@ -141,6 +150,37 @@ lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init,
|
||||
/* Private functions ---------------------------------------------------------*/
|
||||
void pbuf_free_custom(struct pbuf *p);
|
||||
|
||||
/**
|
||||
* @brief Ethernet Rx Transfer completed callback
|
||||
* @param handlerEth: ETH handler
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ETH_RxCpltCallback(ETH_HandleTypeDef *handlerEth)
|
||||
{
|
||||
osSemaphoreRelease(RxPktSemaphore);
|
||||
}
|
||||
/**
|
||||
* @brief Ethernet Tx Transfer completed callback
|
||||
* @param handlerEth: ETH handler
|
||||
* @retval None
|
||||
*/
|
||||
void HAL_ETH_TxCpltCallback(ETH_HandleTypeDef *handlerEth)
|
||||
{
|
||||
osSemaphoreRelease(TxPktSemaphore);
|
||||
}
|
||||
/**
|
||||
* @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)
|
||||
{
|
||||
osSemaphoreRelease(RxPktSemaphore);
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 4 */
|
||||
|
||||
/* USER CODE END 4 */
|
||||
@@ -158,6 +198,9 @@ void pbuf_free_custom(struct pbuf *p);
|
||||
static void low_level_init(struct netif *netif)
|
||||
{
|
||||
HAL_StatusTypeDef hal_eth_init_status = HAL_OK;
|
||||
uint32_t duplex, speed = 0;
|
||||
int32_t PHYLinkState = 0;
|
||||
ETH_MACConfigTypeDef MACConf = {0};
|
||||
/* Start ETH HAL Init */
|
||||
|
||||
uint8_t MACAddr[6] ;
|
||||
@@ -214,6 +257,18 @@ 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 */
|
||||
RxPktSemaphore = xSemaphoreCreateBinary();
|
||||
|
||||
/* create a binary semaphore used for informing ethernetif of frame transmission */
|
||||
TxPktSemaphore = xSemaphoreCreateBinary();
|
||||
|
||||
/* create the task that handles the ETH_MAC */
|
||||
/* USER CODE BEGIN OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */
|
||||
osThreadDef(EthIf, ethernetif_input, osPriorityRealtime, 0, INTERFACE_THREAD_STACK_SIZE);
|
||||
osThreadCreate (osThread(EthIf), netif);
|
||||
/* USER CODE END OS_THREAD_DEF_CREATE_CMSIS_RTOS_V1 */
|
||||
|
||||
/* USER CODE BEGIN PHY_PRE_CONFIG */
|
||||
|
||||
/* USER CODE END PHY_PRE_CONFIG */
|
||||
@@ -225,8 +280,55 @@ static void low_level_init(struct netif *netif)
|
||||
|
||||
if (hal_eth_init_status == HAL_OK)
|
||||
{
|
||||
/* Get link state */
|
||||
ethernet_link_check_state(netif);
|
||||
PHYLinkState = LAN8742_GetLinkState(&LAN8742);
|
||||
|
||||
/* Get link state */
|
||||
if(PHYLinkState <= LAN8742_STATUS_LINK_DOWN)
|
||||
{
|
||||
netif_set_link_down(netif);
|
||||
netif_set_down(netif);
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (PHYLinkState)
|
||||
{
|
||||
case LAN8742_STATUS_100MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
break;
|
||||
case LAN8742_STATUS_100MBITS_HALFDUPLEX:
|
||||
duplex = ETH_HALFDUPLEX_MODE;
|
||||
speed = ETH_SPEED_100M;
|
||||
break;
|
||||
case LAN8742_STATUS_10MBITS_FULLDUPLEX:
|
||||
duplex = ETH_FULLDUPLEX_MODE;
|
||||
speed = ETH_SPEED_10M;
|
||||
break;
|
||||
case LAN8742_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);
|
||||
|
||||
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
|
||||
{
|
||||
@@ -289,7 +391,15 @@ 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);
|
||||
while(osSemaphoreWait(TxPktSemaphore, TIME_WAITING_FOR_INPUT)!=osOK)
|
||||
|
||||
{
|
||||
}
|
||||
|
||||
HAL_ETH_ReleaseTxPacket(&heth);
|
||||
|
||||
return errval;
|
||||
}
|
||||
@@ -323,21 +433,28 @@ 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)
|
||||
static void ethernetif_input(void const * argument)
|
||||
{
|
||||
struct pbuf *p = NULL;
|
||||
struct netif *netif = (struct netif *) argument;
|
||||
|
||||
do
|
||||
for( ;; )
|
||||
{
|
||||
p = low_level_input( netif );
|
||||
if (p != NULL)
|
||||
if (osSemaphoreWait(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK)
|
||||
{
|
||||
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
|
||||
@@ -435,6 +552,7 @@ void pbuf_free_custom(struct pbuf *p)
|
||||
if (RxAllocStatus == RX_ALLOC_ERROR)
|
||||
{
|
||||
RxAllocStatus = RX_ALLOC_OK;
|
||||
osSemaphoreRelease(RxPktSemaphore);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -621,17 +739,25 @@ int32_t ETH_PHY_IO_GetTick(void)
|
||||
* @brief Check the ETH link state then update ETH driver and netif link accordingly.
|
||||
* @retval None
|
||||
*/
|
||||
void ethernet_link_check_state(struct netif *netif)
|
||||
|
||||
void ethernet_link_thread(void const * 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 = LAN8742_GetLinkState(&LAN8742);
|
||||
|
||||
if(netif_is_link_up(netif) && (PHYLinkState <= LAN8742_STATUS_LINK_DOWN))
|
||||
{
|
||||
HAL_ETH_Stop(&heth);
|
||||
HAL_ETH_Stop_IT(&heth);
|
||||
netif_set_down(netif);
|
||||
netif_set_link_down(netif);
|
||||
}
|
||||
@@ -670,12 +796,18 @@ void ethernet_link_check_state(struct netif *netif)
|
||||
MACConf.DuplexMode = duplex;
|
||||
MACConf.Speed = speed;
|
||||
HAL_ETH_SetMACConfig(&heth, &MACConf);
|
||||
HAL_ETH_Start(&heth);
|
||||
HAL_ETH_Start_IT(&heth);
|
||||
netif_set_up(netif);
|
||||
netif_set_link_up(netif);
|
||||
}
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN ETH link Thread core code for User BSP */
|
||||
|
||||
/* USER CODE END ETH link Thread core code for User BSP */
|
||||
|
||||
osDelay(100);
|
||||
}
|
||||
}
|
||||
|
||||
void HAL_ETH_RxAllocateCallback(uint8_t **buff)
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
|
||||
#include "lwip/err.h"
|
||||
#include "lwip/netif.h"
|
||||
#include "cmsis_os.h"
|
||||
|
||||
/* Within 'USER CODE' section, code will be kept by default at each generation */
|
||||
/* USER CODE BEGIN 0 */
|
||||
@@ -32,8 +33,7 @@
|
||||
/* Exported functions ------------------------------------------------------- */
|
||||
err_t ethernetif_init(struct netif *netif);
|
||||
|
||||
void ethernetif_input(struct netif *netif);
|
||||
void ethernet_link_check_state(struct netif *netif);
|
||||
void ethernet_link_thread(void const * argument);
|
||||
|
||||
void Error_Handler(void);
|
||||
u32_t sys_jiffies(void);
|
||||
|
||||
@@ -39,8 +39,10 @@
|
||||
|
||||
/* 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
|
||||
/*----- WITH_RTOS enabled (Since FREERTOS is set) -----*/
|
||||
#define WITH_RTOS 1
|
||||
/* Temporary workaround to avoid conflict on errno defined in STM32CubeIDE and lwip sys_arch.c errno */
|
||||
#undef LWIP_PROVIDE_ERRNO
|
||||
/*----- CHECKSUM_BY_HARDWARE enabled -----*/
|
||||
#define CHECKSUM_BY_HARDWARE 1
|
||||
/*-----------------------------------------------------------------------------*/
|
||||
@@ -51,10 +53,6 @@
|
||||
#define LWIP_IGMP 1
|
||||
/*----- Default Value for LWIP_DNS: 0 ---*/
|
||||
#define LWIP_DNS 1
|
||||
/*----- Value in opt.h for NO_SYS: 0 -----*/
|
||||
#define NO_SYS 1
|
||||
/*----- Value in opt.h for SYS_LIGHTWEIGHT_PROT: 1 -----*/
|
||||
#define SYS_LIGHTWEIGHT_PROT 0
|
||||
/*----- Default Value for MEM_LIBC_MALLOC: 0 ---*/
|
||||
#define MEM_LIBC_MALLOC 1
|
||||
/*----- Default Value for MEMP_MEM_MALLOC: 0 ---*/
|
||||
@@ -77,10 +75,26 @@
|
||||
#define TCP_WND_UPDATE_THRESHOLD 536
|
||||
/*----- Value in opt.h for LWIP_NETIF_LINK_CALLBACK: 0 -----*/
|
||||
#define LWIP_NETIF_LINK_CALLBACK 1
|
||||
/*----- Value in opt.h for LWIP_NETCONN: 1 -----*/
|
||||
#define LWIP_NETCONN 0
|
||||
/*----- Value in opt.h for LWIP_SOCKET: 1 -----*/
|
||||
#define LWIP_SOCKET 0
|
||||
/*----- Value in opt.h for TCPIP_THREAD_STACKSIZE: 0 -----*/
|
||||
#define TCPIP_THREAD_STACKSIZE 1024
|
||||
/*----- Value in opt.h for TCPIP_THREAD_PRIO: 1 -----*/
|
||||
#define TCPIP_THREAD_PRIO osPriorityNormal
|
||||
/*----- Value in opt.h for TCPIP_MBOX_SIZE: 0 -----*/
|
||||
#define TCPIP_MBOX_SIZE 6
|
||||
/*----- Value in opt.h for SLIPIF_THREAD_STACKSIZE: 0 -----*/
|
||||
#define SLIPIF_THREAD_STACKSIZE 1024
|
||||
/*----- Value in opt.h for SLIPIF_THREAD_PRIO: 1 -----*/
|
||||
#define SLIPIF_THREAD_PRIO 3
|
||||
/*----- Value in opt.h for DEFAULT_THREAD_STACKSIZE: 0 -----*/
|
||||
#define DEFAULT_THREAD_STACKSIZE 1024
|
||||
/*----- Value in opt.h for DEFAULT_THREAD_PRIO: 1 -----*/
|
||||
#define DEFAULT_THREAD_PRIO 3
|
||||
/*----- Value in opt.h for DEFAULT_UDP_RECVMBOX_SIZE: 0 -----*/
|
||||
#define DEFAULT_UDP_RECVMBOX_SIZE 6
|
||||
/*----- Value in opt.h for DEFAULT_TCP_RECVMBOX_SIZE: 0 -----*/
|
||||
#define DEFAULT_TCP_RECVMBOX_SIZE 6
|
||||
/*----- Value in opt.h for DEFAULT_ACCEPTMBOX_SIZE: 0 -----*/
|
||||
#define DEFAULT_ACCEPTMBOX_SIZE 6
|
||||
/*----- Value in opt.h for RECV_BUFSIZE_DEFAULT: INT_MAX -----*/
|
||||
#define RECV_BUFSIZE_DEFAULT 2000000000
|
||||
/*----- Default Value for LWIP_HTTPD: 0 ---*/
|
||||
|
||||
Reference in New Issue
Block a user