diff --git a/extras/fsp b/extras/fsp index 8ec537bc8..5d13f916c 160000 --- a/extras/fsp +++ b/extras/fsp @@ -1 +1 @@ -Subproject commit 8ec537bc86b1b71203d72d0cbb28e6e75b353ebd +Subproject commit 5d13f916c72f9d1471864361dfaf8f492cab5979 diff --git a/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h b/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h index 6cd4a26c9..6d6f01fe7 100644 --- a/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h +++ b/libraries/Arduino_LED_Matrix/src/Arduino_LED_Matrix.h @@ -169,14 +169,19 @@ class ArduinoLEDMatrix void off(size_t pin) { turnLed(pin, false); } - int begin() { + bool begin() { + bool rv = true; uint8_t type; - uint8_t ch = FspTimer::get_available_timer(type); + int8_t ch = FspTimer::get_available_timer(type); + if(ch == -1) { + return false; + } // TODO: avoid passing "this" argument to remove autoscroll - _ledTimer.begin(TIMER_MODE_PERIODIC, type, ch, 10000.0, 50.0, turnOnLedISR, this); - _ledTimer.setup_overflow_irq(); - _ledTimer.open(); - _ledTimer.start(); + rv &= _ledTimer.begin(TIMER_MODE_PERIODIC, type, ch, 10000.0, 50.0, turnOnLedISR, this); + rv &= _ledTimer.setup_overflow_irq(); + rv &= _ledTimer.open(); + rv &= _ledTimer.start(); + return rv; } void next() { uint32_t frame[3]; diff --git a/libraries/Ethernet/src/Ethernet.cpp b/libraries/Ethernet/src/Ethernet.cpp index 22c90ff62..a6c0b5beb 100644 --- a/libraries/Ethernet/src/Ethernet.cpp +++ b/libraries/Ethernet/src/Ethernet.cpp @@ -56,9 +56,13 @@ int CEthernet::begin(IPAddress local_ip, IPAddress dns_server, IPAddress gateway int CEthernet::begin(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet) { /* -------------------------------------------------------------------------- */ - ni = CLwipIf::getInstance().get(NI_ETHERNET, local_ip, gateway, subnet); - if(ni == nullptr) { - return 0; + if (ni != nullptr) { + ni->config(local_ip, gateway, subnet); + } else { + ni = CLwipIf::getInstance().get(NI_ETHERNET, local_ip, gateway, subnet); + if (ni == nullptr) { + return 0; + } } /* If there is a local DHCP informs it of our manual IP configuration to prevent IP conflict */ diff --git a/libraries/WiFi/src/WiFi.cpp b/libraries/WiFi/src/WiFi.cpp index 59e742a0f..bb1750fc3 100644 --- a/libraries/WiFi/src/WiFi.cpp +++ b/libraries/WiFi/src/WiFi.cpp @@ -89,6 +89,7 @@ void CWifi::config(IPAddress local_ip) { _gw[3] = 1; _config(local_ip, _gw, _nm); + setDNS(_gw); } extern uint8_t *IpAddress2uint8(IPAddress a); @@ -98,11 +99,7 @@ void CWifi::_config(IPAddress local_ip, IPAddress gateway, IPAddress subnet) { /* -------------------------------------------------------------------------- */ _useStaticIp = local_ip != INADDR_NONE; if(ni != nullptr) { - ni->DhcpStop(); - ni->DhcpNotUsed(); - IP_ADDR4(&ni->ip, local_ip[0], local_ip[1], local_ip[2], local_ip[3]); - IP_ADDR4(&ni->gw, gateway[0], gateway[1], gateway[2], gateway[3]); - IP_ADDR4(&ni->nm, subnet[0], subnet[1], subnet[2], subnet[3]); + ni->config(local_ip, gateway, subnet); } else { CNetIf::default_ip = local_ip; diff --git a/libraries/Wire/Wire.cpp b/libraries/Wire/Wire.cpp index 00233ab4d..792364268 100644 --- a/libraries/Wire/Wire.cpp +++ b/libraries/Wire/Wire.cpp @@ -486,6 +486,10 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig if(bus_status == WIRE_STATUS_RX_COMPLETED) { return length; } + + if(bus_status == WIRE_STATUS_UNSET) { + m_abort(&m_i2c_ctrl); + } return 0; /* ???????? return value ??????? */ } @@ -518,6 +522,7 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign } else if(bus_status == WIRE_STATUS_UNSET) { rv = END_TX_TIMEOUT; + m_abort(&m_i2c_ctrl); } /* as far as I know is impossible to distinguish between NACK on ADDRESS and NACK on DATA */ diff --git a/libraries/lwIpWrapper/src/CNetIf.cpp b/libraries/lwIpWrapper/src/CNetIf.cpp index 53f01dd78..543296604 100644 --- a/libraries/lwIpWrapper/src/CNetIf.cpp +++ b/libraries/lwIpWrapper/src/CNetIf.cpp @@ -1271,6 +1271,24 @@ void CNetIf::setLinkDown() netif_set_down(&ni); } +/* -------------------------------------------------------------------------- */ +void CNetIf::config(IPAddress _ip, IPAddress _gw, IPAddress _nm) +{ + DhcpStop(); + DhcpNotUsed(); + + IP_ADDR4(&ip, _ip[0], _ip[1], _ip[2], _ip[3]); + IP_ADDR4(&nm, _nm[0], _nm[1], _nm[2], _nm[3]); + IP_ADDR4(&gw, _gw[0], _gw[1], _gw[2], _gw[3]); + + netif_set_addr(&ni, &ip, &nm, &gw); + + if (netif_is_link_up(&ni)) { + netif_set_down(&ni); + netif_set_up(&ni); + } +} + /* ########################################################################## */ /* ETHERNET NETWORK INTERFACE CLASS */ /* ########################################################################## */ diff --git a/libraries/lwIpWrapper/src/CNetIf.h b/libraries/lwIpWrapper/src/CNetIf.h index 0b805d202..2fa090bba 100644 --- a/libraries/lwIpWrapper/src/CNetIf.h +++ b/libraries/lwIpWrapper/src/CNetIf.h @@ -189,6 +189,8 @@ class CNetIf { uint32_t getNmAdd() { return ip4_addr_get_u32(&(ni.netmask)); } uint32_t getGwAdd() { return ip4_addr_get_u32(&(ni.gw)); } + void config(IPAddress _ip, IPAddress _gw, IPAddress _nm); + void setHostname(const char* name) { memset(hostname, 0x00, MAX_HOSTNAME_DIM); diff --git a/variants/MINIMA/libs/libfsp.a b/variants/MINIMA/libs/libfsp.a index a962eb912..62a9a8436 100644 Binary files a/variants/MINIMA/libs/libfsp.a and b/variants/MINIMA/libs/libfsp.a differ diff --git a/variants/PORTENTA_C33/libs/libfsp.a b/variants/PORTENTA_C33/libs/libfsp.a index abb6f7d10..0c447a2cf 100644 Binary files a/variants/PORTENTA_C33/libs/libfsp.a and b/variants/PORTENTA_C33/libs/libfsp.a differ diff --git a/variants/UNOWIFIR4/libs/libfsp.a b/variants/UNOWIFIR4/libs/libfsp.a index a962eb912..62a9a8436 100644 Binary files a/variants/UNOWIFIR4/libs/libfsp.a and b/variants/UNOWIFIR4/libs/libfsp.a differ