Port to freeRTOS
UNTESTED
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user