From b2180a2f511c5096918ce74713f91f321b8dcdab Mon Sep 17 00:00:00 2001 From: Vasily Markov Date: Sat, 4 May 2024 17:20:57 +0300 Subject: [PATCH] Handle link status --- app/app.c | 8 ++---- bsp/CMakeLists.txt | 5 ---- bsp/bsp.c | 24 +++++++++------- bsp/bsp.h | 4 ++- bsp/lwip/ethernetif.c | 67 ++++++++++++++++++++++++++++++------------- bsp/lwip/ethernetif.h | 2 +- bsp/lwip/lwip.c | 2 +- bsp/lwip/lwipopts.h | 16 ++++++----- lib/CMakeLists.txt | 7 +++-- 9 files changed, 82 insertions(+), 53 deletions(-) diff --git a/app/app.c b/app/app.c index 97034e4..cf80452 100644 --- a/app/app.c +++ b/app/app.c @@ -5,11 +5,9 @@ void app() { init_LWIP(); while(1) { - // process_LWIP(); - uint32_t regvalue = 0; - HAL_ETH_ReadPHYRegister(getEthStruct(), 1, ®value); - delay(500); - printf("Test: %d\r\n", regvalue); + process_LWIP(); + // GPIO_ToggleBits(GPIOB, GPIO_Pin_7); + delay(400); }; } diff --git a/bsp/CMakeLists.txt b/bsp/CMakeLists.txt index 8aeefbe..955c325 100644 --- a/bsp/CMakeLists.txt +++ b/bsp/CMakeLists.txt @@ -2,11 +2,6 @@ set(LWIP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lwip/src) set(LWIP_INCLUDES ${CMAKE_CURRENT_SOURCE_DIR}/lwip/src/include) set(LWIP_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/lwip/src/core) -file(GLOB_RECURSE LWIP_SOURCES - ${LWIP_SOURCE_DIR}/core/*.c - ${LWIP_SOURCE_DIR}/netif/*.c -) - add_library(bsp STATIC bsp.c lwip/lwip.c diff --git a/bsp/bsp.c b/bsp/bsp.c index 1bb2a81..0071aa2 100644 --- a/bsp/bsp.c +++ b/bsp/bsp.c @@ -1,6 +1,3 @@ -#include "stm32f4xx_gpio.h" -#include "stm32f4xx_rcc.h" -#include "stm32f4xx_dma.h" #include "misc.h" #include "bsp.h" #include "lwip.h" @@ -15,6 +12,12 @@ static volatile uint32_t cnt = 0; void SysTick_Handler(void) { if (cnt == INTERVAL) { + + // uint32_t regvalue = 0; + // HAL_ETH_ReadPHYRegister(getEthStruct(), 1, ®value); + + // printf("PHY: %d\r\n", regvalue); + GPIO_ToggleBits(GPIOB, GPIO_Pin_14); cnt = 0; } @@ -52,7 +55,6 @@ void gpio_init() { RCC_AHB1Periph_GPIOG, ENABLE ); - GPIO_InitTypeDef gpio; GPIO_StructInit(&gpio); @@ -60,7 +62,6 @@ void gpio_init() { gpio.GPIO_Pin = led_pins; GPIO_Init(GPIOB, &gpio); GPIO_ResetBits(GPIOB, led_pins); - } void usart_init() { @@ -106,6 +107,11 @@ void dma_init() { void eth_init() { + + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACEN, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACRXEN, ENABLE); + RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACTXEN, ENABLE); + GPIO_InitTypeDef gpio; gpio.GPIO_Mode = GPIO_Mode_AF; @@ -134,25 +140,21 @@ void eth_init() { GPIO_Init(GPIOB, &gpio); GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH); //RMII TXD1 - RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACEN, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACRXEN, ENABLE); - RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_ETHMACTXEN, ENABLE); NVIC_SetPriority(ETH_IRQn, 0); NVIC_EnableIRQ(ETH_IRQn); } void board_init() { - uint32_t tick = SystemCoreClock/1000; + uint32_t tick = SystemCoreClock/1000 - 1; SysTick_Config(tick); NVIC_EnableIRQ(SysTick_IRQn); - __enable_irq(); + // __enable_irq(); gpio_init(); usart_init(); // dma_init(); eth_init(); init_LWIP(); - delay(50); //wait until periph init printf("Controller is started...\r\n"); } diff --git a/bsp/bsp.h b/bsp/bsp.h index 5f7d9b9..639e1d5 100644 --- a/bsp/bsp.h +++ b/bsp/bsp.h @@ -3,7 +3,9 @@ #include "stm32f4xx.h" #include "stm32f4xx_usart.h" - +#include "stm32f4xx_gpio.h" +#include "stm32f4xx_rcc.h" +#include "stm32f4xx_dma.h" void board_init(); uint32_t getRegister(); uint32_t getSysTick(); diff --git a/bsp/lwip/ethernetif.c b/bsp/lwip/ethernetif.c index 8533440..4c62ec1 100644 --- a/bsp/lwip/ethernetif.c +++ b/bsp/lwip/ethernetif.c @@ -290,7 +290,6 @@ static struct pbuf * low_level_input(struct netif *netif) /* get received frame */ if (HAL_ETH_GetReceivedFrame(&heth) != HAL_OK) return NULL; - /* Obtain the size of the packet and put it into the "len" variable. */ len = heth.RxFrameInfos.length; buffer = (uint8_t *)heth.RxFrameInfos.buffer; @@ -354,6 +353,30 @@ static struct pbuf * low_level_input(struct netif *netif) return p; } +void check_link_status(struct netif* netif) { + uint32_t regvalue = 0; + if (HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, ®value) == HAL_OK) + { + if((regvalue & PHY_LINKED_STATUS)== (uint16_t)RESET) + { + // Link status = disconnected + if (netif_is_link_up(netif)) + { + netif_set_down(netif); + printf("unplugged\r\n"); + netif_set_link_down(netif); + } + } else { + // Link status = connected + if (!netif_is_link_up(netif)) + { + printf("plugged\r\n"); + NVIC_SystemReset(); + } + } + } +} + /** * This function should be called when a packet is ready to be read * from the interface. It uses the function low_level_input() that @@ -365,24 +388,25 @@ static struct pbuf * low_level_input(struct netif *netif) */ void ethernetif_input(struct netif *netif) { - err_t err; - struct pbuf *p; - - /* move received packet into a new pbuf */ - p = low_level_input(netif); + // err_t err; + // struct pbuf *p; + // uint32_t regvalue = 0; + // /* move received packet into a new pbuf */ + // p = low_level_input(netif); + netif_set_link_callback(netif, ethernetif_update_config); + check_link_status(netif); + // /* no packet could be read, silently ignore this */ + // if (p == NULL) return; - /* no packet could be read, silently ignore this */ - if (p == NULL) return; - - /* entry point to the LwIP stack */ - err = netif->input(p, netif); - - if (err != ERR_OK) - { - LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); - pbuf_free(p); - p = NULL; - } + // // /* entry point to the LwIP stack */ + // err = netif->input(p, netif); + + // if (err != ERR_OK) + // { + // LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n")); + // pbuf_free(p); + // p = NULL; + // } } #if !LWIP_ARP @@ -486,9 +510,10 @@ void ethernetif_update_config(struct netif *netif) { __IO uint32_t tickstart = 0; uint32_t regvalue = 0; - if(netif_is_link_up(netif)) { + GPIO_SetBits(GPIOB, GPIO_Pin_0); + GPIO_SetBits(GPIOB, GPIO_Pin_7); /* Restart the auto-negotiation */ if(heth.Init.AutoNegotiation != ETH_AUTONEGOTIATION_DISABLE) { @@ -558,7 +583,9 @@ void ethernetif_update_config(struct netif *netif) else { /* Stop MAC interface */ - HAL_ETH_Stop(&heth); + GPIO_ResetBits(GPIOB, GPIO_Pin_0); + GPIO_SetBits(GPIOB, GPIO_Pin_7); + // HAL_ETH_Stop(&heth); } ethernetif_notify_conn_changed(netif); diff --git a/bsp/lwip/ethernetif.h b/bsp/lwip/ethernetif.h index 0350e2f..46d35c4 100644 --- a/bsp/lwip/ethernetif.h +++ b/bsp/lwip/ethernetif.h @@ -10,7 +10,7 @@ err_t ethernetif_init(struct netif *netif); void ethernetif_input(struct netif *netif); void ethernetif_update_config(struct netif *netif); void ethernetif_notify_conn_changed(struct netif *netif); - +void check_link_status(struct netif* netif); u32_t sys_jiffies(void); u32_t sys_now(void); ETH_HandleTypeDef* getEthStruct(); diff --git a/bsp/lwip/lwip.c b/bsp/lwip/lwip.c index 57205ac..dec7c5c 100644 --- a/bsp/lwip/lwip.c +++ b/bsp/lwip/lwip.c @@ -65,6 +65,6 @@ void init_LWIP(void) void process_LWIP() { ethernetif_input(&gnetif); - sys_check_timeouts(); + // sys_check_timeouts(); } diff --git a/bsp/lwip/lwipopts.h b/bsp/lwip/lwipopts.h index 7145b5e..7c2bdd8 100644 --- a/bsp/lwip/lwipopts.h +++ b/bsp/lwip/lwipopts.h @@ -76,7 +76,7 @@ /* LwIP Stack Parameters (modified compared to initialization value in opt.h) -*/ /* Parameters set in STM32CubeMX LwIP Configuration GUI -*/ /*----- Value in opt.h for LWIP_DHCP: 0 -----*/ -#define LWIP_DHCP 1 +#define LWIP_DHCP 0 /*----- Value in opt.h for NO_SYS: 0 -----*/ #define NO_SYS 1 /*----- Value in opt.h for SYS_LIGHTWEIGHT_PROT: 1 -----*/ @@ -128,19 +128,19 @@ /*----- Value in opt.h for CHECKSUM_CHECK_ICMP6: 1 -----*/ #define CHECKSUM_CHECK_ICMP6 0 /*----- Default Value for ETHARP_DEBUG: LWIP_DBG_OFF ---*/ -#define ETHARP_DEBUG LWIP_DBG_ON +#define ETHARP_DEBUG LWIP_DBG_OFF /*----- Default Value for NETIF_DEBUG: LWIP_DBG_OFF ---*/ -#define NETIF_DEBUG LWIP_DBG_ON +#define NETIF_DEBUG LWIP_DBG_OFF /*----- Default Value for PBUF_DEBUG: LWIP_DBG_OFF ---*/ #define PBUF_DEBUG LWIP_DBG_OFF /*----- Default Value for ICMP_DEBUG: LWIP_DBG_OFF ---*/ -#define ICMP_DEBUG LWIP_DBG_ON +#define ICMP_DEBUG LWIP_DBG_OFF /*----- Default Value for SYS_DEBUG: LWIP_DBG_OFF ---*/ -#define SYS_DEBUG LWIP_DBG_ON +#define SYS_DEBUG LWIP_DBG_OFF /*----- Default Value for UDP_DEBUG: LWIP_DBG_OFF ---*/ -#define UDP_DEBUG LWIP_DBG_ON +#define UDP_DEBUG LWIP_DBG_OFF /*----- Default Value for DHCP_DEBUG: LWIP_DBG_OFF ---*/ -#define DHCP_DEBUG LWIP_DBG_ON +#define DHCP_DEBUG LWIP_DBG_OFF /*-----------------------------------------------------------------------------*/ /* USER CODE BEGIN 1 */ #define LWIP_DEBUG 1 @@ -148,6 +148,8 @@ #define LWIP_UDP 1 #define LWIP_TCP 0 + +#define LWIP_NETIF_LINK_CALLBACK 1 /* USER CODE END 1 */ #ifdef __cplusplus diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 32dc66c..3e536fd 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -1,7 +1,8 @@ project(stm32f4_lib C ASM) set(DEVICE_FAMILY STM32F439xx) -get_filename_component(LINKER_SCRIPT src/stm32f439zi_flash.ld ABSOLUTE) +# get_filename_component(LINKER_SCRIPT src/stm32f439zi_flash.ld ABSOLUTE) +get_filename_component(LINKER_SCRIPT src/STM32F439ZITx_FLASH.ld ABSOLUTE) add_library(stm32f4xx STATIC src/STM32F4xx_StdPeriph_Driver/misc.c @@ -38,7 +39,8 @@ add_library(stm32f4xx STATIC src/STM32F4xx_StdPeriph_Driver/stm32f4xx_usart.c # src/STM32F4xx_StdPeriph_Driver/stm32f4xx_wwdg.c src/system_stm32f4xx.c - src/startup_stm32f4xx.S + # src/startup_stm32f4xx.S + src/startup_stm32f439xx.S ) target_include_directories(stm32f4xx PUBLIC @@ -50,6 +52,7 @@ target_include_directories(stm32f4xx PUBLIC target_compile_definitions(stm32f4xx PUBLIC USE_STDPERIPH_DRIVER) target_compile_definitions(stm32f4xx PUBLIC ${DEVICE_FAMILY}) target_compile_definitions(stm32f4xx PUBLIC HSE_VALUE=8000000) +target_compile_definitions(stm32f4xx PUBLIC SYSTEM_CORE_CLOCK=180000000) target_compile_definitions(stm32f4xx PUBLIC USE_STM324x7I_EVAL) target_compile_options(stm32f4xx PRIVATE -nostartfiles)