25 changed files with 98 additions and 1396 deletions
-
62.cproject
-
18.gitmodules
-
1Core
-
1Drivers
-
214LWIP/App/lwip.c
-
76LWIP/App/lwip.h
-
897LWIP/Target/ethernetif.c
-
45LWIP/Target/ethernetif.h
-
128LWIP/Target/lwipopts.h
-
1Middlewares
-
1stm32basic
-
1stm32components
-
1stm32halport
-
4usrc/app_main.cpp
-
14usrc/base/appdep.hpp
-
4usrc/base/appthread/app_period_task_mgr.hpp
-
4usrc/base/appthread/work_queue.hpp
-
2usrc/base/config_service.cpp
-
2usrc/base/config_service.hpp
-
2usrc/base/device_info.hpp
-
2usrc/base/idtable/IdMgr.cpp
-
6usrc/base/protocol_processer_utils.hpp
-
4usrc/base/utils/halutils.hpp
-
2usrc/module/h2o2_sensor.cpp
-
2usrc/module/proportional_valve_ctrl.hpp
@ -0,0 +1,18 @@ |
|||||
|
[submodule "stm32components"] |
||||
|
path = stm32components |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/stm32components.git |
||||
|
[submodule "stm32basic"] |
||||
|
path = stm32basic |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/stm32basic.git |
||||
|
[submodule "stm32halport"] |
||||
|
path = stm32halport |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/stm32halport.git |
||||
|
[submodule "Middlewares"] |
||||
|
path = Middlewares |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/Middlewares.git |
||||
|
[submodule "Drivers"] |
||||
|
path = Drivers |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/Drivers.git |
||||
|
[submodule "Core"] |
||||
|
path = Core |
||||
|
url = zwsd@192.168.1.3:zsdk_stm32_v1/Core.git |
@ -1,214 +0,0 @@ |
|||||
/* USER CODE BEGIN Header */ |
|
||||
/** |
|
||||
****************************************************************************** |
|
||||
* File Name : LWIP.c |
|
||||
* Description : This file provides initialization code for LWIP |
|
||||
* middleWare. |
|
||||
****************************************************************************** |
|
||||
* @attention |
|
||||
* |
|
||||
* Copyright (c) 2024 STMicroelectronics. |
|
||||
* All rights reserved. |
|
||||
* |
|
||||
* This software is licensed under terms that can be found in the LICENSE file |
|
||||
* in the root directory of this software component. |
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
||||
* |
|
||||
****************************************************************************** |
|
||||
*/ |
|
||||
/* USER CODE END Header */ |
|
||||
|
|
||||
/* Includes ------------------------------------------------------------------*/ |
|
||||
#include "lwip.h" |
|
||||
#include "lwip/init.h" |
|
||||
#include "lwip/netif.h" |
|
||||
#if defined ( __CC_ARM ) /* MDK ARM Compiler */ |
|
||||
#include "lwip/sio.h" |
|
||||
#endif /* MDK ARM Compiler */ |
|
||||
#include "ethernetif.h" |
|
||||
|
|
||||
/* USER CODE BEGIN 0 */ |
|
||||
|
|
||||
/* USER CODE END 0 */ |
|
||||
/* Private function prototypes -----------------------------------------------*/ |
|
||||
static void ethernet_link_status_updated(struct netif *netif); |
|
||||
/* ETH Variables initialization ----------------------------------------------*/ |
|
||||
void Error_Handler(void); |
|
||||
|
|
||||
/* USER CODE BEGIN 1 */ |
|
||||
|
|
||||
/* USER CODE END 1 */ |
|
||||
|
|
||||
/* 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 2 */ |
|
||||
|
|
||||
/* USER CODE END 2 */ |
|
||||
|
|
||||
/** |
|
||||
* LwIP initialization function |
|
||||
*/ |
|
||||
void MX_LWIP_Init(void) |
|
||||
{ |
|
||||
/* IP addresses initialization */ |
|
||||
IP_ADDRESS[0] = 192; |
|
||||
IP_ADDRESS[1] = 168; |
|
||||
IP_ADDRESS[2] = 8; |
|
||||
IP_ADDRESS[3] = 10; |
|
||||
NETMASK_ADDRESS[0] = 255; |
|
||||
NETMASK_ADDRESS[1] = 255; |
|
||||
NETMASK_ADDRESS[2] = 255; |
|
||||
NETMASK_ADDRESS[3] = 255; |
|
||||
GATEWAY_ADDRESS[0] = 192; |
|
||||
GATEWAY_ADDRESS[1] = 168; |
|
||||
GATEWAY_ADDRESS[2] = 8; |
|
||||
GATEWAY_ADDRESS[3] = 1; |
|
||||
|
|
||||
/* USER CODE BEGIN IP_ADDRESSES */ |
|
||||
/* USER CODE END IP_ADDRESSES */ |
|
||||
|
|
||||
/* 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) with RTOS */ |
|
||||
netif_add(&gnetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, &tcpip_input); |
|
||||
|
|
||||
/* Registers the default network interface */ |
|
||||
netif_set_default(&gnetif); |
|
||||
|
|
||||
if (netif_is_link_up(&gnetif)) |
|
||||
{ |
|
||||
/* When the netif is fully configured this function must be called */ |
|
||||
netif_set_up(&gnetif); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
/* When the netif link is down this function must be called */ |
|
||||
netif_set_down(&gnetif); |
|
||||
} |
|
||||
|
|
||||
/* Set the link callback function, this function is called on change of link status*/ |
|
||||
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 */ |
|
||||
|
|
||||
/* USER CODE END 3 */ |
|
||||
} |
|
||||
|
|
||||
#ifdef USE_OBSOLETE_USER_CODE_SECTION_4 |
|
||||
/* Kept to help code migration. (See new 4_1, 4_2... sections) */ |
|
||||
/* Avoid to use this user section which will become obsolete. */ |
|
||||
/* USER CODE BEGIN 4 */ |
|
||||
/* USER CODE END 4 */ |
|
||||
#endif |
|
||||
|
|
||||
/** |
|
||||
* @brief Notify the User about the network interface config status |
|
||||
* @param netif: the network interface |
|
||||
* @retval None |
|
||||
*/ |
|
||||
static void ethernet_link_status_updated(struct netif *netif) |
|
||||
{ |
|
||||
if (netif_is_up(netif)) |
|
||||
{ |
|
||||
/* USER CODE BEGIN 5 */ |
|
||||
/* USER CODE END 5 */ |
|
||||
} |
|
||||
else /* netif is down */ |
|
||||
{ |
|
||||
/* USER CODE BEGIN 6 */ |
|
||||
/* USER CODE END 6 */ |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
#if defined ( __CC_ARM ) /* MDK ARM Compiler */ |
|
||||
/** |
|
||||
* Opens a serial device for communication. |
|
||||
* |
|
||||
* @param devnum device number |
|
||||
* @return handle to serial device if successful, NULL otherwise |
|
||||
*/ |
|
||||
sio_fd_t sio_open(u8_t devnum) |
|
||||
{ |
|
||||
sio_fd_t sd; |
|
||||
|
|
||||
/* USER CODE BEGIN 7 */ |
|
||||
sd = 0; // dummy code |
|
||||
/* USER CODE END 7 */ |
|
||||
|
|
||||
return sd; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Sends a single character to the serial device. |
|
||||
* |
|
||||
* @param c character to send |
|
||||
* @param fd serial device handle |
|
||||
* |
|
||||
* @note This function will block until the character can be sent. |
|
||||
*/ |
|
||||
void sio_send(u8_t c, sio_fd_t fd) |
|
||||
{ |
|
||||
/* USER CODE BEGIN 8 */ |
|
||||
/* USER CODE END 8 */ |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Reads from the serial device. |
|
||||
* |
|
||||
* @param fd serial device handle |
|
||||
* @param data pointer to data buffer for receiving |
|
||||
* @param len maximum length (in bytes) of data to receive |
|
||||
* @return number of bytes actually received - may be 0 if aborted by sio_read_abort |
|
||||
* |
|
||||
* @note This function will block until data can be received. The blocking |
|
||||
* can be cancelled by calling sio_read_abort(). |
|
||||
*/ |
|
||||
u32_t sio_read(sio_fd_t fd, u8_t *data, u32_t len) |
|
||||
{ |
|
||||
u32_t recved_bytes; |
|
||||
|
|
||||
/* USER CODE BEGIN 9 */ |
|
||||
recved_bytes = 0; // dummy code |
|
||||
/* USER CODE END 9 */ |
|
||||
return recved_bytes; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* Tries to read from the serial device. Same as sio_read but returns |
|
||||
* immediately if no data is available and never blocks. |
|
||||
* |
|
||||
* @param fd serial device handle |
|
||||
* @param data pointer to data buffer for receiving |
|
||||
* @param len maximum length (in bytes) of data to receive |
|
||||
* @return number of bytes actually received |
|
||||
*/ |
|
||||
u32_t sio_tryread(sio_fd_t fd, u8_t *data, u32_t len) |
|
||||
{ |
|
||||
u32_t recved_bytes; |
|
||||
|
|
||||
/* USER CODE BEGIN 10 */ |
|
||||
recved_bytes = 0; // dummy code |
|
||||
/* USER CODE END 10 */ |
|
||||
return recved_bytes; |
|
||||
} |
|
||||
#endif /* MDK ARM Compiler */ |
|
||||
|
|
@ -1,76 +0,0 @@ |
|||||
/* USER CODE BEGIN Header */ |
|
||||
/** |
|
||||
****************************************************************************** |
|
||||
* File Name : LWIP.h |
|
||||
* Description : This file provides code for the configuration |
|
||||
* of the LWIP. |
|
||||
****************************************************************************** |
|
||||
* @attention |
|
||||
* |
|
||||
* Copyright (c) 2024 STMicroelectronics. |
|
||||
* All rights reserved. |
|
||||
* |
|
||||
* This software is licensed under terms that can be found in the LICENSE file |
|
||||
* in the root directory of this software component. |
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
||||
* |
|
||||
************************************************************************* |
|
||||
|
|
||||
*/ |
|
||||
/* USER CODE END Header */ |
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/ |
|
||||
#ifndef __mx_lwip_H |
|
||||
#define __mx_lwip_H |
|
||||
#ifdef __cplusplus |
|
||||
extern "C" { |
|
||||
#endif |
|
||||
|
|
||||
/* Includes ------------------------------------------------------------------*/ |
|
||||
#include "lwip/opt.h" |
|
||||
#include "lwip/mem.h" |
|
||||
#include "lwip/memp.h" |
|
||||
#include "netif/etharp.h" |
|
||||
#include "lwip/dhcp.h" |
|
||||
#include "lwip/netif.h" |
|
||||
#include "lwip/timeouts.h" |
|
||||
#include "ethernetif.h" |
|
||||
|
|
||||
/* Includes for RTOS ---------------------------------------------------------*/ |
|
||||
#if WITH_RTOS |
|
||||
#include "lwip/tcpip.h" |
|
||||
#endif /* WITH_RTOS */ |
|
||||
|
|
||||
/* USER CODE BEGIN 0 */ |
|
||||
|
|
||||
/* USER CODE END 0 */ |
|
||||
|
|
||||
/* Global Variables ----------------------------------------------------------*/ |
|
||||
extern ETH_HandleTypeDef heth; |
|
||||
|
|
||||
/* LWIP init function */ |
|
||||
void MX_LWIP_Init(void); |
|
||||
|
|
||||
#if !WITH_RTOS |
|
||||
/* USER CODE BEGIN 1 */ |
|
||||
/* Function defined in lwip.c to: |
|
||||
* - Read a received packet from the Ethernet buffers |
|
||||
* - Send it to the lwIP stack for handling |
|
||||
* - Handle timeouts if NO_SYS_NO_TIMERS not set |
|
||||
*/ |
|
||||
void MX_LWIP_Process(void); |
|
||||
|
|
||||
/* USER CODE END 1 */ |
|
||||
#endif /* WITH_RTOS */ |
|
||||
|
|
||||
#ifdef __cplusplus |
|
||||
} |
|
||||
#endif |
|
||||
#endif /*__ mx_lwip_H */ |
|
||||
|
|
||||
/** |
|
||||
* @} |
|
||||
*/ |
|
||||
|
|
||||
/** |
|
||||
* @} |
|
||||
*/ |
|
@ -1,897 +0,0 @@ |
|||||
/* USER CODE BEGIN Header */ |
|
||||
/** |
|
||||
****************************************************************************** |
|
||||
* File Name : ethernetif.c |
|
||||
* Description : This file provides code for the configuration |
|
||||
* of the ethernetif.c MiddleWare. |
|
||||
****************************************************************************** |
|
||||
* @attention |
|
||||
* |
|
||||
* Copyright (c) 2023 STMicroelectronics. |
|
||||
* All rights reserved. |
|
||||
* |
|
||||
* This software is licensed under terms that can be found in the LICENSE file |
|
||||
* in the root directory of this software component. |
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
||||
* |
|
||||
****************************************************************************** |
|
||||
*/ |
|
||||
/* USER CODE END Header */ |
|
||||
|
|
||||
/* Includes ------------------------------------------------------------------*/ |
|
||||
#include "main.h" |
|
||||
#include "lwip/opt.h" |
|
||||
#include "lwip/timeouts.h" |
|
||||
#include "netif/ethernet.h" |
|
||||
#include "netif/etharp.h" |
|
||||
#include "lwip/ethip6.h" |
|
||||
#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 */ |
|
||||
|
|
||||
/* 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' |
|
||||
|
|
||||
/* ETH Setting */ |
|
||||
#define ETH_DMA_TRANSMIT_TIMEOUT ( 20U ) |
|
||||
#define ETH_TX_BUFFER_MAX ((ETH_TX_DESC_CNT) * 2U) |
|
||||
|
|
||||
/* USER CODE BEGIN 1 */ |
|
||||
|
|
||||
/* USER CODE END 1 */ |
|
||||
|
|
||||
/* Private variables ---------------------------------------------------------*/ |
|
||||
/* |
|
||||
@Note: This interface is implemented to operate in zero-copy mode only: |
|
||||
- Rx buffers will be allocated from LwIP stack memory heap, |
|
||||
then passed to ETH HAL driver. |
|
||||
- Tx buffers will be allocated from LwIP stack memory heap, |
|
||||
then passed to ETH HAL driver. |
|
||||
|
|
||||
@Notes: |
|
||||
1.a. ETH DMA Rx descriptors must be contiguous, the default count is 4, |
|
||||
to customize it please redefine ETH_RX_DESC_CNT in ETH GUI (Rx Descriptor Length) |
|
||||
so that updated value will be generated in stm32xxxx_hal_conf.h |
|
||||
1.b. ETH DMA Tx descriptors must be contiguous, the default count is 4, |
|
||||
to customize it please redefine ETH_TX_DESC_CNT in ETH GUI (Tx Descriptor Length) |
|
||||
so that updated value will be generated in stm32xxxx_hal_conf.h |
|
||||
|
|
||||
2.a. Rx Buffers number must be between ETH_RX_DESC_CNT and 2*ETH_RX_DESC_CNT |
|
||||
2.b. Rx Buffers must have the same size: ETH_RX_BUF_SIZE, this value must |
|
||||
passed to ETH DMA in the init field (heth.Init.RxBuffLen) |
|
||||
2.c The RX Ruffers addresses and sizes must be properly defined to be aligned |
|
||||
to L1-CACHE line size (32 bytes). |
|
||||
*/ |
|
||||
|
|
||||
/* Data Type Definitions */ |
|
||||
typedef enum |
|
||||
{ |
|
||||
RX_ALLOC_OK = 0x00, |
|
||||
RX_ALLOC_ERROR = 0x01 |
|
||||
} RxAllocStatusTypeDef; |
|
||||
|
|
||||
typedef struct |
|
||||
{ |
|
||||
struct pbuf_custom pbuf_custom; |
|
||||
uint8_t buff[(ETH_RX_BUF_SIZE + 31) & ~31] __ALIGNED(32); |
|
||||
} RxBuff_t; |
|
||||
|
|
||||
/* Memory Pool Declaration */ |
|
||||
#define ETH_RX_BUFFER_CNT 12U |
|
||||
LWIP_MEMPOOL_DECLARE(RX_POOL, ETH_RX_BUFFER_CNT, sizeof(RxBuff_t), "Zero-copy RX PBUF pool"); |
|
||||
|
|
||||
/* Variable Definitions */ |
|
||||
static uint8_t RxAllocStatus; |
|
||||
|
|
||||
ETH_DMADescTypeDef DMARxDscrTab[ETH_RX_DESC_CNT]; /* Ethernet Rx DMA Descriptors */ |
|
||||
ETH_DMADescTypeDef DMATxDscrTab[ETH_TX_DESC_CNT]; /* Ethernet Tx DMA Descriptors */ |
|
||||
|
|
||||
/* USER CODE BEGIN 2 */ |
|
||||
|
|
||||
/* 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); |
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal); |
|
||||
int32_t ETH_PHY_IO_GetTick(void); |
|
||||
|
|
||||
lan8742_Object_t LAN8742; |
|
||||
lan8742_IOCtx_t LAN8742_IOCtx = {ETH_PHY_IO_Init, |
|
||||
ETH_PHY_IO_DeInit, |
|
||||
ETH_PHY_IO_WriteReg, |
|
||||
ETH_PHY_IO_ReadReg, |
|
||||
ETH_PHY_IO_GetTick}; |
|
||||
|
|
||||
/* USER CODE BEGIN 3 */ |
|
||||
|
|
||||
/* USER CODE END 3 */ |
|
||||
|
|
||||
/* 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 */ |
|
||||
// add by zhaohe |
|
||||
extern uint8_t g_mac[]; |
|
||||
|
|
||||
/* USER CODE END 4 */ |
|
||||
|
|
||||
/******************************************************************************* |
|
||||
LL Driver Interface ( LwIP stack --> ETH) |
|
||||
*******************************************************************************/ |
|
||||
/** |
|
||||
* @brief In this function, the hardware should be initialized. |
|
||||
* Called from ethernetif_init(). |
|
||||
* |
|
||||
* @param netif the already initialized lwip network interface structure |
|
||||
* for this ethernetif |
|
||||
*/ |
|
||||
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] ; |
|
||||
heth.Instance = ETH; |
|
||||
MACAddr[0] = 0x00; |
|
||||
MACAddr[1] = 0x80; |
|
||||
MACAddr[2] = 0xE1; |
|
||||
MACAddr[3] = 0x00; |
|
||||
MACAddr[4] = 0x00; |
|
||||
MACAddr[5] = 0x01; |
|
||||
heth.Init.MACAddr = &MACAddr[0]; |
|
||||
heth.Init.MediaInterface = HAL_ETH_RMII_MODE; |
|
||||
heth.Init.TxDesc = DMATxDscrTab; |
|
||||
heth.Init.RxDesc = DMARxDscrTab; |
|
||||
heth.Init.RxBuffLen = 1536; |
|
||||
|
|
||||
/* USER CODE BEGIN MACADDRESS */ |
|
||||
// add by zhaohe |
|
||||
MACAddr[0] = g_mac[0]; |
|
||||
MACAddr[1] = g_mac[1]; |
|
||||
MACAddr[2] = g_mac[2]; |
|
||||
MACAddr[3] = g_mac[3]; |
|
||||
MACAddr[4] = g_mac[4]; |
|
||||
MACAddr[5] = g_mac[5]; |
|
||||
/* USER CODE END MACADDRESS */ |
|
||||
|
|
||||
hal_eth_init_status = HAL_ETH_Init(&heth); |
|
||||
|
|
||||
memset(&TxConfig, 0 , sizeof(ETH_TxPacketConfig)); |
|
||||
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD; |
|
||||
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC; |
|
||||
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT; |
|
||||
|
|
||||
/* End ETH HAL Init */ |
|
||||
|
|
||||
/* Initialize the RX POOL */ |
|
||||
LWIP_MEMPOOL_INIT(RX_POOL); |
|
||||
|
|
||||
#if LWIP_ARP || LWIP_ETHERNET |
|
||||
|
|
||||
/* set MAC hardware address length */ |
|
||||
netif->hwaddr_len = ETH_HWADDR_LEN; |
|
||||
|
|
||||
/* set MAC hardware address */ |
|
||||
netif->hwaddr[0] = heth.Init.MACAddr[0]; |
|
||||
netif->hwaddr[1] = heth.Init.MACAddr[1]; |
|
||||
netif->hwaddr[2] = heth.Init.MACAddr[2]; |
|
||||
netif->hwaddr[3] = heth.Init.MACAddr[3]; |
|
||||
netif->hwaddr[4] = heth.Init.MACAddr[4]; |
|
||||
netif->hwaddr[5] = heth.Init.MACAddr[5]; |
|
||||
|
|
||||
/* maximum transfer unit */ |
|
||||
netif->mtu = ETH_MAX_PAYLOAD; |
|
||||
|
|
||||
/* Accept broadcast address and ARP traffic */ |
|
||||
/* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ |
|
||||
#if LWIP_ARP |
|
||||
netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; |
|
||||
#else |
|
||||
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 */ |
|
||||
/* Set PHY IO functions */ |
|
||||
LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx); |
|
||||
|
|
||||
/* Initialize the LAN8742 ETH PHY */ |
|
||||
LAN8742_Init(&LAN8742); |
|
||||
|
|
||||
if (hal_eth_init_status == HAL_OK) |
|
||||
{ |
|
||||
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 |
|
||||
{ |
|
||||
Error_Handler(); |
|
||||
} |
|
||||
#endif /* LWIP_ARP || LWIP_ETHERNET */ |
|
||||
|
|
||||
/* USER CODE BEGIN LOW_LEVEL_INIT */ |
|
||||
|
|
||||
/* USER CODE END LOW_LEVEL_INIT */ |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief This function should do the actual transmission of the packet. The packet is |
|
||||
* contained in the pbuf that is passed to the function. This pbuf |
|
||||
* might be chained. |
|
||||
* |
|
||||
* @param netif the lwip network interface structure for this ethernetif |
|
||||
* @param p the MAC packet to send (e.g. IP packet including MAC addresses and type) |
|
||||
* @return ERR_OK if the packet could be sent |
|
||||
* an err_t value if the packet couldn't be sent |
|
||||
* |
|
||||
* @note Returning ERR_MEM here if a DMA queue of your MAC is full can lead to |
|
||||
* strange results. You might consider waiting for space in the DMA queue |
|
||||
* to become available since the stack doesn't retry to send a packet |
|
||||
* dropped because of memory failure (except for the TCP timers). |
|
||||
*/ |
|
||||
|
|
||||
static err_t low_level_output(struct netif *netif, struct pbuf *p) |
|
||||
{ |
|
||||
uint32_t i = 0U; |
|
||||
struct pbuf *q = NULL; |
|
||||
err_t errval = ERR_OK; |
|
||||
ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT] = {0}; |
|
||||
|
|
||||
memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef)); |
|
||||
|
|
||||
for(q = p; q != NULL; q = q->next) |
|
||||
{ |
|
||||
if(i >= ETH_TX_DESC_CNT) |
|
||||
return ERR_IF; |
|
||||
|
|
||||
Txbuffer[i].buffer = q->payload; |
|
||||
Txbuffer[i].len = q->len; |
|
||||
|
|
||||
if(i>0) |
|
||||
{ |
|
||||
Txbuffer[i-1].next = &Txbuffer[i]; |
|
||||
} |
|
||||
|
|
||||
if(q->next == NULL) |
|
||||
{ |
|
||||
Txbuffer[i].next = NULL; |
|
||||
} |
|
||||
|
|
||||
i++; |
|
||||
} |
|
||||
|
|
||||
TxConfig.Length = p->tot_len; |
|
||||
TxConfig.TxBuffer = Txbuffer; |
|
||||
TxConfig.pData = p; |
|
||||
|
|
||||
pbuf_ref(p); |
|
||||
|
|
||||
HAL_ETH_Transmit_IT(&heth, &TxConfig); |
|
||||
while(osSemaphoreWait(TxPktSemaphore, TIME_WAITING_FOR_INPUT)!=osOK) |
|
||||
|
|
||||
{ |
|
||||
} |
|
||||
|
|
||||
HAL_ETH_ReleaseTxPacket(&heth); |
|
||||
|
|
||||
return errval; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Should allocate a pbuf and transfer the bytes of the incoming |
|
||||
* packet from the interface into the pbuf. |
|
||||
* |
|
||||
* @param netif the lwip network interface structure for this ethernetif |
|
||||
* @return a pbuf filled with the received packet (including MAC header) |
|
||||
* NULL on memory error |
|
||||
*/ |
|
||||
static struct pbuf * low_level_input(struct netif *netif) |
|
||||
{ |
|
||||
struct pbuf *p = NULL; |
|
||||
|
|
||||
if(RxAllocStatus == RX_ALLOC_OK) |
|
||||
{ |
|
||||
HAL_ETH_ReadData(&heth, (void **)&p); |
|
||||
} |
|
||||
|
|
||||
return p; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief This function should be called when a packet is ready to be read |
|
||||
* from the interface. It uses the function low_level_input() that |
|
||||
* should handle the actual reception of bytes from the network |
|
||||
* interface. Then the type of the received packet is determined and |
|
||||
* the appropriate input function is called. |
|
||||
* |
|
||||
* @param netif the lwip network interface structure for this ethernetif |
|
||||
*/ |
|
||||
static void ethernetif_input(void const * argument) |
|
||||
{ |
|
||||
struct pbuf *p = NULL; |
|
||||
struct netif *netif = (struct netif *) argument; |
|
||||
|
|
||||
for( ;; ) |
|
||||
{ |
|
||||
if (osSemaphoreWait(RxPktSemaphore, TIME_WAITING_FOR_INPUT) == osOK) |
|
||||
{ |
|
||||
do |
|
||||
{ |
|
||||
p = low_level_input( netif ); |
|
||||
if (p != NULL) |
|
||||
{ |
|
||||
if (netif->input( p, netif) != ERR_OK ) |
|
||||
{ |
|
||||
pbuf_free(p); |
|
||||
} |
|
||||
} |
|
||||
} while(p!=NULL); |
|
||||
} |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
#if !LWIP_ARP |
|
||||
/** |
|
||||
* This function has to be completed by user in case of ARP OFF. |
|
||||
* |
|
||||
* @param netif the lwip network interface structure for this ethernetif |
|
||||
* @return ERR_OK if ... |
|
||||
*/ |
|
||||
static err_t low_level_output_arp_off(struct netif *netif, struct pbuf *q, const ip4_addr_t *ipaddr) |
|
||||
{ |
|
||||
err_t errval; |
|
||||
errval = ERR_OK; |
|
||||
|
|
||||
/* USER CODE BEGIN 5 */ |
|
||||
|
|
||||
/* USER CODE END 5 */ |
|
||||
|
|
||||
return errval; |
|
||||
|
|
||||
} |
|
||||
#endif /* LWIP_ARP */ |
|
||||
|
|
||||
/** |
|
||||
* @brief Should be called at the beginning of the program to set up the |
|
||||
* network interface. It calls the function low_level_init() to do the |
|
||||
* actual setup of the hardware. |
|
||||
* |
|
||||
* This function should be passed as a parameter to netif_add(). |
|
||||
* |
|
||||
* @param netif the lwip network interface structure for this ethernetif |
|
||||
* @return ERR_OK if the loopif is initialized |
|
||||
* ERR_MEM if private data couldn't be allocated |
|
||||
* any other err_t on error |
|
||||
*/ |
|
||||
err_t ethernetif_init(struct netif *netif) |
|
||||
{ |
|
||||
LWIP_ASSERT("netif != NULL", (netif != NULL)); |
|
||||
|
|
||||
#if LWIP_NETIF_HOSTNAME |
|
||||
/* Initialize interface hostname */ |
|
||||
netif->hostname = "lwip"; |
|
||||
#endif /* LWIP_NETIF_HOSTNAME */ |
|
||||
|
|
||||
/* |
|
||||
* Initialize the snmp variables and counters inside the struct netif. |
|
||||
* The last argument should be replaced with your link speed, in units |
|
||||
* of bits per second. |
|
||||
*/ |
|
||||
// MIB2_INIT_NETIF(netif, snmp_ifType_ethernet_csmacd, LINK_SPEED_OF_YOUR_NETIF_IN_BPS); |
|
||||
|
|
||||
netif->name[0] = IFNAME0; |
|
||||
netif->name[1] = IFNAME1; |
|
||||
/* We directly use etharp_output() here to save a function call. |
|
||||
* You can instead declare your own function an call etharp_output() |
|
||||
* from it if you have to do some checks before sending (e.g. if link |
|
||||
* is available...) */ |
|
||||
|
|
||||
#if LWIP_IPV4 |
|
||||
#if LWIP_ARP || LWIP_ETHERNET |
|
||||
#if LWIP_ARP |
|
||||
netif->output = etharp_output; |
|
||||
#else |
|
||||
/* The user should write its own code in low_level_output_arp_off function */ |
|
||||
netif->output = low_level_output_arp_off; |
|
||||
#endif /* LWIP_ARP */ |
|
||||
#endif /* LWIP_ARP || LWIP_ETHERNET */ |
|
||||
#endif /* LWIP_IPV4 */ |
|
||||
|
|
||||
#if LWIP_IPV6 |
|
||||
netif->output_ip6 = ethip6_output; |
|
||||
#endif /* LWIP_IPV6 */ |
|
||||
|
|
||||
netif->linkoutput = low_level_output; |
|
||||
|
|
||||
/* initialize the hardware */ |
|
||||
low_level_init(netif); |
|
||||
|
|
||||
return ERR_OK; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Custom Rx pbuf free callback |
|
||||
* @param pbuf: pbuf to be freed |
|
||||
* @retval None |
|
||||
*/ |
|
||||
void pbuf_free_custom(struct pbuf *p) |
|
||||
{ |
|
||||
struct pbuf_custom* custom_pbuf = (struct pbuf_custom*)p; |
|
||||
LWIP_MEMPOOL_FREE(RX_POOL, custom_pbuf); |
|
||||
|
|
||||
/* If the Rx Buffer Pool was exhausted, signal the ethernetif_input task to |
|
||||
* call HAL_ETH_GetRxDataBuffer to rebuild the Rx descriptors. */ |
|
||||
|
|
||||
if (RxAllocStatus == RX_ALLOC_ERROR) |
|
||||
{ |
|
||||
RxAllocStatus = RX_ALLOC_OK; |
|
||||
osSemaphoreRelease(RxPktSemaphore); |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/* USER CODE BEGIN 6 */ |
|
||||
|
|
||||
/** |
|
||||
* @brief Returns the current time in milliseconds |
|
||||
* when LWIP_TIMERS == 1 and NO_SYS == 1 |
|
||||
* @param None |
|
||||
* @retval Time |
|
||||
*/ |
|
||||
u32_t sys_now(void) |
|
||||
{ |
|
||||
return HAL_GetTick(); |
|
||||
} |
|
||||
|
|
||||
/* USER CODE END 6 */ |
|
||||
|
|
||||
/** |
|
||||
* @brief Initializes the ETH MSP. |
|
||||
* @param ethHandle: ETH handle |
|
||||
* @retval None |
|
||||
*/ |
|
||||
|
|
||||
void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle) |
|
||||
{ |
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0}; |
|
||||
if(ethHandle->Instance==ETH) |
|
||||
{ |
|
||||
/* USER CODE BEGIN ETH_MspInit 0 */ |
|
||||
|
|
||||
/* USER CODE END ETH_MspInit 0 */ |
|
||||
/* Enable Peripheral clock */ |
|
||||
__HAL_RCC_ETH_CLK_ENABLE(); |
|
||||
|
|
||||
__HAL_RCC_GPIOC_CLK_ENABLE(); |
|
||||
__HAL_RCC_GPIOA_CLK_ENABLE(); |
|
||||
__HAL_RCC_GPIOB_CLK_ENABLE(); |
|
||||
/**ETH GPIO Configuration |
|
||||
PC1 ------> ETH_MDC |
|
||||
PA1 ------> ETH_REF_CLK |
|
||||
PA2 ------> ETH_MDIO |
|
||||
PA7 ------> ETH_CRS_DV |
|
||||
PC4 ------> ETH_RXD0 |
|
||||
PC5 ------> ETH_RXD1 |
|
||||
PB11 ------> ETH_TX_EN |
|
||||
PB12 ------> ETH_TXD0 |
|
||||
PB13 ------> ETH_TXD1 |
|
||||
*/ |
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; |
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
|
||||
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; |
|
||||
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); |
|
||||
|
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7; |
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
|
||||
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; |
|
||||
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); |
|
||||
|
|
||||
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13; |
|
||||
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; |
|
||||
GPIO_InitStruct.Pull = GPIO_NOPULL; |
|
||||
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; |
|
||||
GPIO_InitStruct.Alternate = GPIO_AF11_ETH; |
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); |
|
||||
|
|
||||
/* Peripheral interrupt init */ |
|
||||
HAL_NVIC_SetPriority(ETH_IRQn, 5, 0); |
|
||||
HAL_NVIC_EnableIRQ(ETH_IRQn); |
|
||||
/* USER CODE BEGIN ETH_MspInit 1 */ |
|
||||
#define ETH_RST_Pin GPIO_PIN_3 |
|
||||
#define ETH_RST_GPIO_Port GPIOD |
|
||||
HAL_GPIO_WritePin(ETH_RST_GPIO_Port,ETH_RST_Pin,GPIO_PIN_RESET); |
|
||||
HAL_Delay(50); |
|
||||
HAL_GPIO_WritePin(ETH_RST_GPIO_Port,ETH_RST_Pin,GPIO_PIN_SET); |
|
||||
/* USER CODE END ETH_MspInit 1 */ |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
void HAL_ETH_MspDeInit(ETH_HandleTypeDef* ethHandle) |
|
||||
{ |
|
||||
if(ethHandle->Instance==ETH) |
|
||||
{ |
|
||||
/* USER CODE BEGIN ETH_MspDeInit 0 */ |
|
||||
|
|
||||
/* USER CODE END ETH_MspDeInit 0 */ |
|
||||
/* Peripheral clock disable */ |
|
||||
__HAL_RCC_ETH_CLK_DISABLE(); |
|
||||
|
|
||||
/**ETH GPIO Configuration |
|
||||
PC1 ------> ETH_MDC |
|
||||
PA1 ------> ETH_REF_CLK |
|
||||
PA2 ------> ETH_MDIO |
|
||||
PA7 ------> ETH_CRS_DV |
|
||||
PC4 ------> ETH_RXD0 |
|
||||
PC5 ------> ETH_RXD1 |
|
||||
PB11 ------> ETH_TX_EN |
|
||||
PB12 ------> ETH_TXD0 |
|
||||
PB13 ------> ETH_TXD1 |
|
||||
*/ |
|
||||
HAL_GPIO_DeInit(GPIOC, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5); |
|
||||
|
|
||||
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7); |
|
||||
|
|
||||
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 */ |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
/******************************************************************************* |
|
||||
PHI IO Functions |
|
||||
*******************************************************************************/ |
|
||||
/** |
|
||||
* @brief Initializes the MDIO interface GPIO and clocks. |
|
||||
* @param None |
|
||||
* @retval 0 if OK, -1 if ERROR |
|
||||
*/ |
|
||||
int32_t ETH_PHY_IO_Init(void) |
|
||||
{ |
|
||||
/* We assume that MDIO GPIO configuration is already done |
|
||||
in the ETH_MspInit() else it should be done here |
|
||||
*/ |
|
||||
|
|
||||
/* Configure the MDIO Clock */ |
|
||||
HAL_ETH_SetMDIOClockRange(&heth); |
|
||||
|
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief De-Initializes the MDIO interface . |
|
||||
* @param None |
|
||||
* @retval 0 if OK, -1 if ERROR |
|
||||
*/ |
|
||||
int32_t ETH_PHY_IO_DeInit (void) |
|
||||
{ |
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Read a PHY register through the MDIO interface. |
|
||||
* @param DevAddr: PHY port address |
|
||||
* @param RegAddr: PHY register address |
|
||||
* @param pRegVal: pointer to hold the register value |
|
||||
* @retval 0 if OK -1 if Error |
|
||||
*/ |
|
||||
int32_t ETH_PHY_IO_ReadReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t *pRegVal) |
|
||||
{ |
|
||||
if(HAL_ETH_ReadPHYRegister(&heth, DevAddr, RegAddr, pRegVal) != HAL_OK) |
|
||||
{ |
|
||||
return -1; |
|
||||
} |
|
||||
|
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Write a value to a PHY register through the MDIO interface. |
|
||||
* @param DevAddr: PHY port address |
|
||||
* @param RegAddr: PHY register address |
|
||||
* @param RegVal: Value to be written |
|
||||
* @retval 0 if OK -1 if Error |
|
||||
*/ |
|
||||
int32_t ETH_PHY_IO_WriteReg(uint32_t DevAddr, uint32_t RegAddr, uint32_t RegVal) |
|
||||
{ |
|
||||
if(HAL_ETH_WritePHYRegister(&heth, DevAddr, RegAddr, RegVal) != HAL_OK) |
|
||||
{ |
|
||||
return -1; |
|
||||
} |
|
||||
|
|
||||
return 0; |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Get the time in millisecons used for internal PHY driver process. |
|
||||
* @retval Time value |
|
||||
*/ |
|
||||
int32_t ETH_PHY_IO_GetTick(void) |
|
||||
{ |
|
||||
return HAL_GetTick(); |
|
||||
} |
|
||||
|
|
||||
/** |
|
||||
* @brief Check the ETH link state then update ETH driver and netif link accordingly. |
|
||||
* @retval None |
|
||||
*/ |
|
||||
|
|
||||
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 */ |
|
||||
netif->link_callback(netif); |
|
||||
/* 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_IT(&heth); |
|
||||
netif_set_down(netif); |
|
||||
netif_set_link_down(netif); |
|
||||
} |
|
||||
else if(!netif_is_link_up(netif) && (PHYLinkState > LAN8742_STATUS_LINK_DOWN)) |
|
||||
{ |
|
||||
switch (PHYLinkState) |
|
||||
{ |
|
||||
case LAN8742_STATUS_100MBITS_FULLDUPLEX: |
|
||||
duplex = ETH_FULLDUPLEX_MODE; |
|
||||
speed = ETH_SPEED_100M; |
|
||||
linkchanged = 1; |
|
||||
break; |
|
||||
case LAN8742_STATUS_100MBITS_HALFDUPLEX: |
|
||||
duplex = ETH_HALFDUPLEX_MODE; |
|
||||
speed = ETH_SPEED_100M; |
|
||||
linkchanged = 1; |
|
||||
break; |
|
||||
case LAN8742_STATUS_10MBITS_FULLDUPLEX: |
|
||||
duplex = ETH_FULLDUPLEX_MODE; |
|
||||
speed = ETH_SPEED_10M; |
|
||||
linkchanged = 1; |
|
||||
break; |
|
||||
case LAN8742_STATUS_10MBITS_HALFDUPLEX: |
|
||||
duplex = ETH_HALFDUPLEX_MODE; |
|
||||
speed = ETH_SPEED_10M; |
|
||||
linkchanged = 1; |
|
||||
break; |
|
||||
default: |
|
||||
break; |
|
||||
} |
|
||||
|
|
||||
if(linkchanged) |
|
||||
{ |
|
||||
/* 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 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) |
|
||||
{ |
|
||||
/* USER CODE BEGIN HAL ETH RxAllocateCallback */ |
|
||||
struct pbuf_custom *p = LWIP_MEMPOOL_ALLOC(RX_POOL); |
|
||||
if (p) |
|
||||
{ |
|
||||
/* Get the buff from the struct pbuf address. */ |
|
||||
*buff = (uint8_t *)p + offsetof(RxBuff_t, buff); |
|
||||
p->custom_free_function = pbuf_free_custom; |
|
||||
/* Initialize the struct pbuf. |
|
||||
* This must be performed whenever a buffer's allocated because it may be |
|
||||
* changed by lwIP or the app, e.g., pbuf_free decrements ref. */ |
|
||||
pbuf_alloced_custom(PBUF_RAW, 0, PBUF_REF, p, *buff, ETH_RX_BUF_SIZE); |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
RxAllocStatus = RX_ALLOC_ERROR; |
|
||||
*buff = NULL; |
|
||||
} |
|
||||
/* USER CODE END HAL ETH RxAllocateCallback */ |
|
||||
} |
|
||||
|
|
||||
void HAL_ETH_RxLinkCallback(void **pStart, void **pEnd, uint8_t *buff, uint16_t Length) |
|
||||
{ |
|
||||
/* USER CODE BEGIN HAL ETH RxLinkCallback */ |
|
||||
|
|
||||
struct pbuf **ppStart = (struct pbuf **)pStart; |
|
||||
struct pbuf **ppEnd = (struct pbuf **)pEnd; |
|
||||
struct pbuf *p = NULL; |
|
||||
|
|
||||
/* Get the struct pbuf from the buff address. */ |
|
||||
p = (struct pbuf *)(buff - offsetof(RxBuff_t, buff)); |
|
||||
p->next = NULL; |
|
||||
p->tot_len = 0; |
|
||||
p->len = Length; |
|
||||
|
|
||||
/* Chain the buffer. */ |
|
||||
if (!*ppStart) |
|
||||
{ |
|
||||
/* The first buffer of the packet. */ |
|
||||
*ppStart = p; |
|
||||
} |
|
||||
else |
|
||||
{ |
|
||||
/* Chain the buffer to the end of the packet. */ |
|
||||
(*ppEnd)->next = p; |
|
||||
} |
|
||||
*ppEnd = p; |
|
||||
|
|
||||
/* Update the total length of all the buffers of the chain. Each pbuf in the chain should have its tot_len |
|
||||
* set to its own length, plus the length of all the following pbufs in the chain. */ |
|
||||
for (p = *ppStart; p != NULL; p = p->next) |
|
||||
{ |
|
||||
p->tot_len += Length; |
|
||||
} |
|
||||
|
|
||||
/* USER CODE END HAL ETH RxLinkCallback */ |
|
||||
} |
|
||||
|
|
||||
void HAL_ETH_TxFreeCallback(uint32_t * buff) |
|
||||
{ |
|
||||
/* USER CODE BEGIN HAL ETH TxFreeCallback */ |
|
||||
|
|
||||
pbuf_free((struct pbuf *)buff); |
|
||||
|
|
||||
/* USER CODE END HAL ETH TxFreeCallback */ |
|
||||
} |
|
||||
|
|
||||
/* USER CODE BEGIN 8 */ |
|
||||
/** |
|
||||
* @brief This function notify user about link status changement. |
|
||||
* @param netif: the network interface |
|
||||
* @retval None |
|
||||
*/ |
|
||||
__weak void ethernetif_notify_conn_changed(struct netif *netif) |
|
||||
{ |
|
||||
/* NOTE : This is function could be implemented in user file |
|
||||
when the callback is needed, |
|
||||
*/ |
|
||||
|
|
||||
} |
|
||||
/* USER CODE END 8 */ |
|
||||
|
|
@ -1,45 +0,0 @@ |
|||||
/* USER CODE BEGIN Header */ |
|
||||
/** |
|
||||
****************************************************************************** |
|
||||
* File Name : ethernetif.h |
|
||||
* Description : This file provides initialization code for LWIP |
|
||||
* middleWare. |
|
||||
****************************************************************************** |
|
||||
* @attention |
|
||||
* |
|
||||
* Copyright (c) 2024 STMicroelectronics. |
|
||||
* All rights reserved. |
|
||||
* |
|
||||
* This software is licensed under terms that can be found in the LICENSE file |
|
||||
* in the root directory of this software component. |
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
||||
* |
|
||||
****************************************************************************** |
|
||||
*/ |
|
||||
/* USER CODE END Header */ |
|
||||
|
|
||||
#ifndef __ETHERNETIF_H__ |
|
||||
#define __ETHERNETIF_H__ |
|
||||
|
|
||||
#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 */ |
|
||||
|
|
||||
/* USER CODE END 0 */ |
|
||||
|
|
||||
/* Exported functions ------------------------------------------------------- */ |
|
||||
err_t ethernetif_init(struct netif *netif); |
|
||||
|
|
||||
void ethernet_link_thread(void const * argument); |
|
||||
|
|
||||
void Error_Handler(void); |
|
||||
u32_t sys_jiffies(void); |
|
||||
u32_t sys_now(void); |
|
||||
|
|
||||
/* USER CODE BEGIN 1 */ |
|
||||
|
|
||||
/* USER CODE END 1 */ |
|
||||
#endif |
|
@ -1,128 +0,0 @@ |
|||||
/* USER CODE BEGIN Header */ |
|
||||
/** |
|
||||
****************************************************************************** |
|
||||
* File Name : lwipopts.h |
|
||||
* Description : This file overrides LwIP stack default configuration |
|
||||
* done in opt.h file. |
|
||||
****************************************************************************** |
|
||||
* @attention |
|
||||
* |
|
||||
* Copyright (c) 2023 STMicroelectronics. |
|
||||
* All rights reserved. |
|
||||
* |
|
||||
* This software is licensed under terms that can be found in the LICENSE file |
|
||||
* in the root directory of this software component. |
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS. |
|
||||
* |
|
||||
****************************************************************************** |
|
||||
*/ |
|
||||
/* USER CODE END Header */ |
|
||||
|
|
||||
/* Define to prevent recursive inclusion --------------------------------------*/ |
|
||||
#ifndef __LWIPOPTS__H__ |
|
||||
#define __LWIPOPTS__H__ |
|
||||
|
|
||||
#include "main.h" |
|
||||
|
|
||||
/*-----------------------------------------------------------------------------*/ |
|
||||
/* Current version of LwIP supported by CubeMx: 2.1.2 -*/ |
|
||||
/*-----------------------------------------------------------------------------*/ |
|
||||
|
|
||||
/* Within 'USER CODE' section, code will be kept by default at each generation */ |
|
||||
/* USER CODE BEGIN 0 */ |
|
||||
|
|
||||
/* USER CODE END 0 */ |
|
||||
|
|
||||
#ifdef __cplusplus |
|
||||
extern "C" { |
|
||||
#endif |
|
||||
|
|
||||
/* STM32CubeMX Specific Parameters (not defined in opt.h) ---------------------*/ |
|
||||
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/ |
|
||||
/*----- 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 |
|
||||
/*-----------------------------------------------------------------------------*/ |
|
||||
|
|
||||
/* LwIP Stack Parameters (modified compared to initialization value in opt.h) -*/ |
|
||||
/* Parameters set in STM32CubeMX LwIP Configuration GUI -*/ |
|
||||
/*----- Default Value for LWIP_DNS: 0 ---*/ |
|
||||
#define LWIP_DNS 1 |
|
||||
/*----- Value in opt.h for MEM_ALIGNMENT: 1 -----*/ |
|
||||
#define MEM_ALIGNMENT 4 |
|
||||
/*----- Value in opt.h for LWIP_ETHERNET: LWIP_ARP || PPPOE_SUPPORT -*/ |
|
||||
#define LWIP_ETHERNET 1 |
|
||||
/*----- Value in opt.h for LWIP_DNS_SECURE: (LWIP_DNS_SECURE_RAND_XID | LWIP_DNS_SECURE_NO_MULTIPLE_OUTSTANDING | LWIP_DNS_SECURE_RAND_SRC_PORT) -*/ |
|
||||
#define LWIP_DNS_SECURE 7 |
|
||||
/*----- Value in opt.h for TCP_SND_QUEUELEN: (4*TCP_SND_BUF + (TCP_MSS - 1))/TCP_MSS -----*/ |
|
||||
#define TCP_SND_QUEUELEN 9 |
|
||||
/*----- Value in opt.h for TCP_SNDLOWAT: LWIP_MIN(LWIP_MAX(((TCP_SND_BUF)/2), (2 * TCP_MSS) + 1), (TCP_SND_BUF) - 1) -*/ |
|
||||
#define TCP_SNDLOWAT 1071 |
|
||||
/*----- Value in opt.h for TCP_SNDQUEUELOWAT: LWIP_MAX(TCP_SND_QUEUELEN)/2, 5) -*/ |
|
||||
#define TCP_SNDQUEUELOWAT 5 |
|
||||
/*----- Value in opt.h for TCP_WND_UPDATE_THRESHOLD: LWIP_MIN(TCP_WND/4, TCP_MSS*4) -----*/ |
|
||||
#define TCP_WND_UPDATE_THRESHOLD 536 |
|
||||
/*----- Default Value for LWIP_NETIF_HOSTNAME: 0 ---*/ |
|
||||
#define LWIP_NETIF_HOSTNAME 1 |
|
||||
/*----- Value in opt.h for LWIP_NETIF_LINK_CALLBACK: 0 -----*/ |
|
||||
#define LWIP_NETIF_LINK_CALLBACK 1 |
|
||||
/*----- 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 |
|
||||
/*----- Default Value for LWIP_SO_SNDTIMEO: 0 ---*/ |
|
||||
#define LWIP_SO_SNDTIMEO 1 |
|
||||
/*----- Default Value for LWIP_SO_RCVTIMEO: 0 ---*/ |
|
||||
#define LWIP_SO_RCVTIMEO 1 |
|
||||
/*----- Value in opt.h for RECV_BUFSIZE_DEFAULT: INT_MAX -----*/ |
|
||||
#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 -----*/ |
|
||||
#define CHECKSUM_GEN_IP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_GEN_UDP: 1 -----*/ |
|
||||
#define CHECKSUM_GEN_UDP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_GEN_TCP: 1 -----*/ |
|
||||
#define CHECKSUM_GEN_TCP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_GEN_ICMP: 1 -----*/ |
|
||||
#define CHECKSUM_GEN_ICMP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_GEN_ICMP6: 1 -----*/ |
|
||||
#define CHECKSUM_GEN_ICMP6 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_CHECK_IP: 1 -----*/ |
|
||||
#define CHECKSUM_CHECK_IP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_CHECK_UDP: 1 -----*/ |
|
||||
#define CHECKSUM_CHECK_UDP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_CHECK_TCP: 1 -----*/ |
|
||||
#define CHECKSUM_CHECK_TCP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP: 1 -----*/ |
|
||||
#define CHECKSUM_CHECK_ICMP 0 |
|
||||
/*----- Value in opt.h for CHECKSUM_CHECK_ICMP6: 1 -----*/ |
|
||||
#define CHECKSUM_CHECK_ICMP6 0 |
|
||||
/*-----------------------------------------------------------------------------*/ |
|
||||
/* USER CODE BEGIN 1 */ |
|
||||
|
|
||||
/* USER CODE END 1 */ |
|
||||
|
|
||||
#ifdef __cplusplus |
|
||||
} |
|
||||
#endif |
|
||||
#endif /*__LWIPOPTS__H__ */ |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue