1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-30 03:26:13 +01:00

F429ZI edits for ethernet

This commit is contained in:
pmantoine 2023-10-23 21:28:25 +08:00
parent 7b3b16b211
commit 0d5495aa25
4 changed files with 78 additions and 16 deletions

View File

@ -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;
#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
Ethernet.begin(mac, IP_ADDRESS);
if (Ethernet.begin(IP_ADDRESS) == 0)
#else
if (Ethernet.begin(mac) == 0)
if (Ethernet.begin() == 0)
#endif // IP_ADDRESS
{
DIAG(F("Ethernet.begin FAILED"));
return;
}
#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"));
}
#endif
unsigned long startmilli = millis();
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);

View File

@ -35,8 +35,18 @@
#if defined (ARDUINO_TEENSY41)
#include <NativeEthernet.h> //TEENSY Ethernet Treiber
#include <NativeEthernetUdp.h>
#define MAX_SOCK_NUM 4
#elif defined (ARDUINO_NUCLEO_F429ZI) || defined (ARDUINO_NUCLEO_F439ZI)
#include <LwIP.h>
// #include "STM32lwipopts.h"
#include <STM32Ethernet.h>
#include <lwip/netif.h>
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"

View File

@ -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

View File

@ -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.