From 0d5495aa25c5107b369724543e8b3410a170f7aa Mon Sep 17 00:00:00 2001 From: pmantoine Date: Mon, 23 Oct 2023 21:28:25 +0800 Subject: [PATCH] F429ZI edits for ethernet --- EthernetInterface.cpp | 63 +++++++++++++++++++++++++++++++++---------- EthernetInterface.h | 10 +++++++ platformio.ini | 18 ++++++++++++- version.h | 3 ++- 4 files changed, 78 insertions(+), 16 deletions(-) diff --git a/EthernetInterface.cpp b/EthernetInterface.cpp index 5cf531c..993d5d0 100644 --- a/EthernetInterface.cpp +++ b/EthernetInterface.cpp @@ -41,8 +41,11 @@ void EthernetInterface::setup() DIAG(F("Prog Error!")); return; } - if ((singleton=new EthernetInterface())) + DIAG(F("Ethernet Class setup, attempting to instantiate")); + if ((singleton=new EthernetInterface())) { + DIAG(F("Ethernet Class initialized")); return; + } DIAG(F("Ethernet not initialized")); }; @@ -55,24 +58,48 @@ void EthernetInterface::setup() */ EthernetInterface::EthernetInterface() { - byte mac[6]; - DCCTimer::getSimulatedMacAddress(mac); connected=false; - - #ifdef IP_ADDRESS - Ethernet.begin(mac, IP_ADDRESS); - #else - if (Ethernet.begin(mac) == 0) +#if defined(STM32_ETHERNET) + // Set a HOSTNAME for the DHCP request - a nice to have, but hard it seems on LWIP for STM32 + // The default is "lwip", which is **always** set in STM32Ethernet/src/utility/ethernetif.cpp + // for some reason. One can edit it to instead read: + // #if LWIP_NETIF_HOSTNAME + // /* Initialize interface hostname */ + // if (netif->hostname == NULL) + // netif->hostname = "lwip"; + // #endif /* LWIP_NETIF_HOSTNAME */ + // Which seems more useful! We should propose the patch... so the following line actually works! + netif_set_hostname(&gnetif, WIFI_HOSTNAME); // Should probably be passed in the contructor... + #ifdef IP_ADDRESS + if (Ethernet.begin(IP_ADDRESS) == 0) + #else + if (Ethernet.begin() == 0) + #endif // IP_ADDRESS { DIAG(F("Ethernet.begin FAILED")); return; } - #endif +#else // All other architectures + byte mac[6]= { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; + DIAG(F("Ethernet attempting to get MAC address")); + DCCTimer::getSimulatedMacAddress(mac); + DIAG(F("Ethernet got MAC address")); + #ifdef IP_ADDRESS + if (Ethernet.begin(IP_ADDRESS) == 0) + #else + if (Ethernet.begin(mac, IP_ADDRESS) == 0) + #endif + { + DIAG(F("Ethernet.begin FAILED")); + return; + } + if (Ethernet.hardwareStatus() == EthernetNoHardware) { DIAG(F("Ethernet shield not found or W5100")); } - - unsigned long startmilli = millis(); +#endif + + uint32_t startmilli = millis(); while ((millis() - startmilli) < 5500) { // Loop to give time to check for cable connection if (Ethernet.linkStatus() == LinkON) break; @@ -171,17 +198,25 @@ void EthernetInterface::loop2() { return; } // get client from the server + #if defined (STM32_ETHERNET) + // STM32Ethernet doesn't use accept(), just available() + EthernetClient client = server->available(); + #else EthernetClient client = server->accept(); - + #endif // check for new client if (client) { - if (Diag::ETHERNET) DIAG(F("Ethernet: New client ")); byte socket; for (socket = 0; socket < MAX_SOCK_NUM; socket++) { - if (!clients[socket]) + if (clients[socket]) { + if (clients[socket] == client) + break; + } + else //if (!clients[socket]) { + if (Diag::ETHERNET) DIAG(F("Ethernet: New client ")); // On accept() the EthernetServer doesn't track the client anymore // so we store it in our client array if (Diag::ETHERNET) DIAG(F("Socket %d"),socket); diff --git a/EthernetInterface.h b/EthernetInterface.h index 8078c3f..f4f18dd 100644 --- a/EthernetInterface.h +++ b/EthernetInterface.h @@ -35,8 +35,18 @@ #if defined (ARDUINO_TEENSY41) #include //TEENSY Ethernet Treiber #include + #define MAX_SOCK_NUM 4 +#elif defined (ARDUINO_NUCLEO_F429ZI) || defined (ARDUINO_NUCLEO_F439ZI) + #include +// #include "STM32lwipopts.h" + #include + #include + extern "C" struct netif gnetif; + #define STM32_ETHERNET + #define MAX_SOCK_NUM 10 #else #include "Ethernet.h" + #define MAX_SOCK_NUM 4 #endif #include "RingStream.h" diff --git a/platformio.ini b/platformio.ini index 8767ef1..e1ddfb5 100644 --- a/platformio.ini +++ b/platformio.ini @@ -245,7 +245,23 @@ monitor_echo = yes ; Experimental - Ethernet work still in progress ; -; [env:Nucleo-F429ZI] +[env:Nucleo-F429ZI] +platform = ststm32 +board = nucleo_f429zi +framework = arduino +lib_deps = ${env.lib_deps} + arduino-libraries/Ethernet @ ^2.0.1 + stm32duino/STM32Ethernet @ ^1.3.0 + stm32duino/STM32duino LwIP @ ^2.1.2 +build_flags = -std=c++17 -Os -g2 -Wunused-variable +monitor_speed = 115200 +monitor_echo = yes +upload_protocol = stlink + +; Experimental - Ethernet work still in progress +; Commented out as the F439ZI also needs variant files +; +; [env:Nucleo-F439ZI] ; platform = ststm32 ; board = nucleo_f429zi ; framework = arduino diff --git a/version.h b/version.h index 4daafba..3c98c21 100644 --- a/version.h +++ b/version.h @@ -3,7 +3,8 @@ #include "StringFormatter.h" -#define VERSION "5.1.17" +#define VERSION "5.1.17eth" +// 5.1.17e - Initial ethernet code for STM32F429ZI and F439ZI boards // 5.1.17 - Divide out C for config and D for diag commands // 5.1.16 - Remove I2C address from EXTT_TURNTABLE macro to work with MUX, requires separate HAL macro to create // 5.1.15 - LCC/Adapter support and Exrail feature-compile-out.