diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index cfce272a8..a91ce3938 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -1,6 +1,7 @@ #include "Updater.h" #include "Arduino.h" #include "eboot_command.h" +#include "interrupts.h" //#define DEBUG_UPDATER Serial @@ -111,28 +112,36 @@ bool UpdaterClass::end(bool evenIfRemaining){ return true; } -bool UpdaterClass::_writeBuffer(){ - noInterrupts(); - int rc = SPIEraseSector(_currentAddress/FLASH_SECTOR_SIZE); - interrupts(); - yield(); - if(!rc){ - noInterrupts(); - rc = SPIWrite(_currentAddress, _buffer, _bufferLen); - interrupts(); - } - interrupts(); - if (rc) { - _error = UPDATE_ERROR_WRITE; - _currentAddress = (_startAddress + _size); +bool UpdaterClass::_writeBuffer() { + int rc = 0; + delay(2); // give the rtos some time to handle TCP + { + AutoInterruptLock(15); + rc = SPIEraseSector(_currentAddress / FLASH_SECTOR_SIZE); + } + + delay(2); // give the rtos some time to handle TCP + + if(!rc) { + { + AutoInterruptLock(15); + rc = SPIWrite(_currentAddress, _buffer, _bufferLen); + } + } + + delay(2); // give the rtos some time to handle TCP + + if(rc) { + _error = UPDATE_ERROR_WRITE; + _currentAddress = (_startAddress + _size); #ifdef DEBUG_UPDATER - printError(DEBUG_UPDATER); + printError(DEBUG_UPDATER); #endif - return false; - } - _currentAddress += _bufferLen; - _bufferLen = 0; - return true; + return false; + } + _currentAddress += _bufferLen; + _bufferLen = 0; + return true; } size_t UpdaterClass::write(uint8_t *data, size_t len) { diff --git a/cores/esp8266/Updater.h b/cores/esp8266/Updater.h index eac84f466..aecf52163 100644 --- a/cores/esp8266/Updater.h +++ b/cores/esp8266/Updater.h @@ -11,6 +11,8 @@ #define UPDATE_ERROR_SIZE 4 #define UPDATE_ERROR_STREAM 5 +#define DEBUG_UPDATER Serial1 + class UpdaterClass { public: UpdaterClass(); diff --git a/cores/esp8266/debug.h b/cores/esp8266/debug.h index 7bdc247bd..fe389bb2d 100644 --- a/cores/esp8266/debug.h +++ b/cores/esp8266/debug.h @@ -2,8 +2,11 @@ #define ARD_DEBUG_H #include -// #define DEBUGV(...) ets_printf(__VA_ARGS__) +//#define DEBUGV(...) ets_printf(__VA_ARGS__) + +#ifndef DEBUGV #define DEBUGV(...) +#endif #ifdef __cplusplus void hexdump(uint8_t *mem, uint32_t len, uint8_t cols = 16); diff --git a/libraries/ESP8266WiFi/src/WiFiClient.cpp b/libraries/ESP8266WiFi/src/WiFiClient.cpp index 50e8d1123..a7e7f593d 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.cpp +++ b/libraries/ESP8266WiFi/src/WiFiClient.cpp @@ -284,3 +284,27 @@ void WiFiClient::stopAll() } } } + + +void WiFiClient::stopAllexcepted(WiFiClient * exC) { + for (WiFiClient* it = _s_first; it; it = it->_next) { + ClientContext* c = it->_client; + + if(c && exC->_client) { + if(exC->_client->getRemoteAddress() == c->getRemoteAddress()) { + if(exC->_client->getRemotePort() == c->getRemotePort()) { + if(exC->_client->getLocalPort() == c->getLocalPort()) { + // ignore this + c = NULL; + } + } + } + } + + if (c) { + c->abort(); + c->unref(); + it->_client = 0; + } + } +} diff --git a/libraries/ESP8266WiFi/src/WiFiClient.h b/libraries/ESP8266WiFi/src/WiFiClient.h index 161ca0be1..ed0a09f8b 100644 --- a/libraries/ESP8266WiFi/src/WiFiClient.h +++ b/libraries/ESP8266WiFi/src/WiFiClient.h @@ -91,6 +91,7 @@ public: using Print::write; static void stopAll(); + static void stopAllexcepted(WiFiClient * c); private: diff --git a/libraries/ESP8266WiFi/src/include/ClientContext.h b/libraries/ESP8266WiFi/src/include/ClientContext.h index 619356862..db8157e6b 100644 --- a/libraries/ESP8266WiFi/src/include/ClientContext.h +++ b/libraries/ESP8266WiFi/src/include/ClientContext.h @@ -125,6 +125,12 @@ class ClientContext { return _pcb->remote_port; } + uint16_t getLocalPort() { + if(!_pcb) return 0; + + return _pcb->local_port; + } + size_t getSize() const { if(!_rx_buf) return 0; diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 8c42afffc..3964415ba 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -128,10 +128,17 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, ret = HTTP_UPDATE_FAILD; DEBUG_HTTP_UPDATE("[httpUpdate] FreeSketchSpace to low (%d) needed: %d\n", ESP.getFreeSketchSpace(), len); } else { - if(ESP.updateSketch(tcp, len)) { - // may never reached! + + WiFiUDP::stopAll(); + WiFiClient::stopAllexcepted(&tcp); + + delay(100); + + if(ESP.updateSketch(tcp, len, false, false)) { ret = HTTP_UPDATE_OK; DEBUG_HTTP_UPDATE("[httpUpdate] Update ok\n"); + tcp.stop(); + ESP.restart(); } else { ret = HTTP_UPDATE_FAILD; DEBUG_HTTP_UPDATE("[httpUpdate] Update failed\n"); diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index 911a6a565..a167f9fe4 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -28,6 +28,8 @@ #include #include +#include +#include //#define DEBUG_HTTP_UPDATE(...) Serial1.printf( __VA_ARGS__ ) diff --git a/tools/sdk/include/osapi.h b/tools/sdk/include/osapi.h index 404efb855..1169e5406 100644 --- a/tools/sdk/include/osapi.h +++ b/tools/sdk/include/osapi.h @@ -46,7 +46,7 @@ #ifdef USE_OPTIMIZE_PRINTF #define os_printf(fmt, ...) do { \ - static const char flash_str[] ICACHE_RODATA_ATTR = fmt; \ + static const char flash_str[] ICACHE_RODATA_ATTR __attribute__((aligned(4))) = fmt; \ os_printf_plus(flash_str, ##__VA_ARGS__); \ } while(0) #else