From 3e20239790414b6ce3dc1b6c37d8f7c3f96af737 Mon Sep 17 00:00:00 2001 From: Charles Date: Mon, 30 Nov 2015 11:49:13 +0100 Subject: [PATCH 01/20] Added WifInfo boars with ESP module choice --- boards.txt | 80 ++++++++++++++++++++++++++++++ variants/wifinfo/pins_arduino.h | 86 +++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 variants/wifinfo/pins_arduino.h diff --git a/boards.txt b/boards.txt index 8ed16f539..8d9170826 100644 --- a/boards.txt +++ b/boards.txt @@ -5,6 +5,7 @@ menu.FlashMode=Flash Mode menu.FlashFreq=Flash Frequency menu.UploadTool=Upload Using menu.ResetMethod=Reset Method +menu.ESPModule=Module ############################################################## generic.name=Generic ESP8266 Module @@ -691,3 +692,82 @@ d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000 d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + +############################################################## +wifinfo.name=WifInfo + +wifinfo.upload.tool=esptool +wifinfo.upload.speed=115200 +wifinfo.upload.resetmethod=nodemcu +wifinfo.upload.maximum_size=434160 +wifinfo.upload.maximum_data_size=81920 +wifinfo.upload.wait_for_upload_port=true +wifinfo.serial.disableDTR=true +wifinfo.serial.disableRTS=true + +wifinfo.build.mcu=esp8266 +wifinfo.build.f_cpu=80000000L +wifinfo.build.core=esp8266 +wifinfo.build.variant=wifinfo +wifinfo.build.flash_mode=qio +wifinfo.build.spiffs_pagesize=256 + +wifinfo.menu.ESPModule.ESP07=ESP07 (1M/512K SPIFFS) +wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07 +wifinfo.menu.ESPModule.ESP07.build.flash_size=1M +wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m512.ld +wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0x7B000 +wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000 +wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=8192 +wifinfo.menu.ESPModule.ESP07.upload.maximum_size=499696 + +wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS) +wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12 +wifinfo.menu.ESPModule.ESP12.build.flash_size=4M +wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld +wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000 +wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000 +wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192 +wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256 +wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464 + +wifinfo.menu.UploadTool.esptool=Serial +wifinfo.menu.UploadTool.esptool.upload.tool=esptool +wifinfo.menu.UploadTool.esptool.upload.verbose=-vv +wifinfo.menu.UploadTool.espota=OTA +wifinfo.menu.UploadTool.espota.upload.tool=espota + +wifinfo.menu.CpuFrequency.80=80 MHz +wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L +wifinfo.menu.CpuFrequency.160=160 MHz +wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L + +wifinfo.menu.FlashFreq.40=40MHz +wifinfo.menu.FlashFreq.40.build.flash_freq=40 +wifinfo.menu.FlashFreq.80=80MHz +wifinfo.menu.FlashFreq.80.build.flash_freq=80 + +wifinfo.menu.FlashMode.dio=DIO +wifinfo.menu.FlashMode.dio.build.flash_mode=dio +wifinfo.menu.FlashMode.qio=QIO +wifinfo.menu.FlashMode.qio.build.flash_mode=qio + +wifinfo.menu.UploadSpeed.115200=115200 +wifinfo.menu.UploadSpeed.115200.upload.speed=115200 +wifinfo.menu.UploadSpeed.9600=9600 +wifinfo.menu.UploadSpeed.9600.upload.speed=9600 +wifinfo.menu.UploadSpeed.57600=57600 +wifinfo.menu.UploadSpeed.57600.upload.speed=57600 +wifinfo.menu.UploadSpeed.256000.windows=256000 +wifinfo.menu.UploadSpeed.256000.upload.speed=256000 +wifinfo.menu.UploadSpeed.230400.linux=230400 +wifinfo.menu.UploadSpeed.230400.macosx=230400 +wifinfo.menu.UploadSpeed.230400.upload.speed=230400 +wifinfo.menu.UploadSpeed.460800.linux=460800 +wifinfo.menu.UploadSpeed.460800.macosx=460800 +wifinfo.menu.UploadSpeed.460800.upload.speed=460800 +wifinfo.menu.UploadSpeed.512000.windows=512000 +wifinfo.menu.UploadSpeed.512000.upload.speed=512000 +wifinfo.menu.UploadSpeed.921600=921600 +wifinfo.menu.UploadSpeed.921600.upload.speed=921600 + diff --git a/variants/wifinfo/pins_arduino.h b/variants/wifinfo/pins_arduino.h new file mode 100644 index 000000000..f4000865c --- /dev/null +++ b/variants/wifinfo/pins_arduino.h @@ -0,0 +1,86 @@ +/* + pins_arduino.h - Pin definition functions for Arduino + Part of Arduino - http://www.arduino.cc/ + + Copyright (c) 2007 David A. Mellis + Modified for ESP8266 platform by Ivan Grokhotkov, 2014-2015. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General + Public License along with this library; if not, write to the + Free Software Foundation, Inc., 59 Temple Place, Suite 330, + Boston, MA 02111-1307 USA + + Changed : 20 Nov 2015 Charles-Henri Hallard + Definition for WifInfo boards + see https://github.com/hallard/LibTeleinfo/tree/master/examples/ESP8266_WifInfo + see https://hallard.me/wifinfo/ + + $Id: wiring.h 249 2007-02-03 16:52:51Z mellis $ +*/ + +#ifndef Pins_Arduino_h +#define Pins_Arduino_h + +#define EXTERNAL_NUM_INTERRUPTS 16 +#define NUM_DIGITAL_PINS 17 +#define NUM_ANALOG_INPUTS 1 + +#define analogInputToDigitalPin(p) ((p > 0)?NOT_A_PIN:0) +#define digitalPinToInterrupt(p) (((p) < EXTERNAL_NUM_INTERRUPTS)?p:NOT_A_PIN) +#define digitalPinHasPWM(p) (((p) < NUM_DIGITAL_PINS)?p:NOT_A_PIN) + +static const uint8_t SDA = 4; +static const uint8_t SCL = 5; + +static const uint8_t SS = 15; +static const uint8_t MOSI = 13; +static const uint8_t MISO = 12; +static const uint8_t SCK = 14; + +static const uint8_t BUILTIN_LED = 12; + +static const uint8_t A0 = 17; + +static const uint8_t D0 = 16; +static const uint8_t D1 = 5; +static const uint8_t D2 = 4; +static const uint8_t D3 = 0; +static const uint8_t D4 = 2; +static const uint8_t D5 = 14; +static const uint8_t D6 = 12; +static const uint8_t D7 = 13; +static const uint8_t D8 = 15; +static const uint8_t D9 = 3; +static const uint8_t D10 = 1; + +// These serial port names are intended to allow libraries and architecture-neutral +// sketches to automatically default to the correct port name for a particular type +// of use. For example, a GPS module would normally connect to SERIAL_PORT_HARDWARE_OPEN, +// the first hardware serial port whose RX/TX pins are not dedicated to another use. +// +// SERIAL_PORT_MONITOR Port which normally prints to the Arduino Serial Monitor +// +// SERIAL_PORT_USBVIRTUAL Port which is USB virtual serial +// +// SERIAL_PORT_LINUXBRIDGE Port which connects to a Linux system via Bridge library +// +// SERIAL_PORT_HARDWARE Hardware serial port, physical RX & TX pins. +// +// SERIAL_PORT_HARDWARE_OPEN Hardware serial ports which are open for use. Their RX & TX +// pins are NOT connected to anything by default. +#define SERIAL_PORT_MONITOR Serial1 +#define SERIAL_PORT_USBVIRTUAL Serial +#define SERIAL_PORT_HARDWARE Serial +#define SERIAL_PORT_HARDWARE_OPEN Serial + +#endif /* Pins_Arduino_h */ From 0389657614e954ef19ab585cd198c0e59a107dfc Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 10 Dec 2015 12:35:24 +0100 Subject: [PATCH 02/20] give the IP stack more time to handle the data may help with #1157 --- cores/esp8266/Updater.cpp | 50 +++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index 28830fba5..f4b0fd862 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -168,9 +168,14 @@ bool UpdaterClass::end(bool evenIfRemaining){ } bool UpdaterClass::_writeBuffer(){ + + yield(); + bool result = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE); + yield(); + if (result) { + result = ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen); + } yield(); - bool result = ESP.flashEraseSector(_currentAddress/FLASH_SECTOR_SIZE) && - ESP.flashWrite(_currentAddress, (uint32_t*) _buffer, _bufferLen); if (!result) { _error = UPDATE_ERROR_WRITE; @@ -217,29 +222,32 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) { } size_t UpdaterClass::writeStream(Stream &data) { - size_t written = 0; - size_t toRead = 0; - if(hasError() || !isRunning()) - return 0; + size_t written = 0; + size_t toRead = 0; + if(hasError() || !isRunning()) + return 0; - while(remaining()) { - toRead = FLASH_SECTOR_SIZE - _bufferLen; - toRead = data.readBytes(_buffer + _bufferLen, toRead); - if(toRead == 0){ //Timeout - _error = UPDATE_ERROR_STREAM; - _currentAddress = (_startAddress + _size); + while(remaining()) { + toRead = data.readBytes(_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen)); + if(toRead == 0) { //Timeout + delay(100); + toRead = data.readBytes(_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen)); + if(toRead == 0) { //Timeout + _error = UPDATE_ERROR_STREAM; + _currentAddress = (_startAddress + _size); #ifdef DEBUG_UPDATER - printError(DEBUG_UPDATER); + printError(DEBUG_UPDATER); #endif - return written; + } + return written; + } + _bufferLen += toRead; + if((_bufferLen == remaining() || _bufferLen == FLASH_SECTOR_SIZE) && !_writeBuffer()) + return written; + written += toRead; + yield(); } - _bufferLen += toRead; - if((_bufferLen == remaining() || _bufferLen == FLASH_SECTOR_SIZE) && !_writeBuffer()) - return written; - written += toRead; - yield(); - } - return written; + return written; } void UpdaterClass::printError(Stream &out){ From 38427333c5e22fc1360ccbabf3fdae8500b7ce56 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 10 Dec 2015 17:05:00 +0100 Subject: [PATCH 03/20] update ota docs --- doc/ota_updates/ota_updates.md | 13 +++++++++++-- doc/ota_updates/update_memory_copy.png | Bin 0 -> 4920 bytes 2 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 doc/ota_updates/update_memory_copy.png diff --git a/doc/ota_updates/ota_updates.md b/doc/ota_updates/ota_updates.md index 42bcb06ac..28aed2c9f 100644 --- a/doc/ota_updates/ota_updates.md +++ b/doc/ota_updates/ota_updates.md @@ -405,6 +405,15 @@ The Stream Interface is the base for all other update modes like OTA, http Serve ## Updater class -TODO describe Updater class +Updater is in the Core and deals with writing the firmware to the flash, +checking its integrity and telling the bootloader to load the new firmware on the next boot. + +### Update process - memory view + + - The new sketch will be stored in the space between the old sketch and the spiff. + - on the next reboot the "eboot" bootloader check for commands. + - the new sketch is now copied "over" the old one. + - the new sketch is started. + +![Memory Copy](update_memory_copy.png) -Updater is in the Core and deals with writing the firmware to the flash, checking its integrity and telling the bootloader to load the new firmware on the next boot. diff --git a/doc/ota_updates/update_memory_copy.png b/doc/ota_updates/update_memory_copy.png new file mode 100644 index 0000000000000000000000000000000000000000..724637485d94cc200e56b53b02de51640de00ae3 GIT binary patch literal 4920 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 Date: Thu, 10 Dec 2015 17:24:39 +0100 Subject: [PATCH 04/20] add more debug to Updater.cpp --- cores/esp8266/Updater.cpp | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/Updater.cpp b/cores/esp8266/Updater.cpp index f4b0fd862..7ad21300a 100644 --- a/cores/esp8266/Updater.cpp +++ b/cores/esp8266/Updater.cpp @@ -38,14 +38,14 @@ void UpdaterClass::_reset() { bool UpdaterClass::begin(size_t size, int command) { if(_size > 0){ #ifdef DEBUG_UPDATER - DEBUG_UPDATER.println("already running"); + DEBUG_UPDATER.println("[begin] already running"); #endif return false; } #ifdef DEBUG_UPDATER if (command == U_SPIFFS) { - DEBUG_UPDATER.println("Update SPIFFS."); + DEBUG_UPDATER.println("[begin] Update SPIFFS."); } #endif @@ -73,6 +73,12 @@ bool UpdaterClass::begin(size_t size, int command) { //address where we will start writing the update updateStartAddress = updateEndAddress - roundedSize; +#ifdef DEBUG_UPDATER + DEBUG_UPDATER.printf("[begin] roundedSize: 0x%08X (%d)\n", roundedSize, roundedSize); + DEBUG_UPDATER.printf("[begin] updateEndAddress: 0x%08X (%d)\n", updateEndAddress, updateEndAddress); + DEBUG_UPDATER.printf("[begin] currentSketchSize: 0x%08X (%d)\n", currentSketchSize, currentSketchSize); +#endif + //make sure that the size of both sketches is less than the total space (updateEndAddress) if(updateStartAddress < currentSketchSize) { _error = UPDATE_ERROR_SPACE; @@ -88,7 +94,7 @@ bool UpdaterClass::begin(size_t size, int command) { else { // unknown command #ifdef DEBUG_UPDATER - DEBUG_UPDATER.println("Unknown update command."); + DEBUG_UPDATER.println("[begin] Unknown update command."); #endif return false; } @@ -100,6 +106,12 @@ bool UpdaterClass::begin(size_t size, int command) { _buffer = new uint8_t[FLASH_SECTOR_SIZE]; _command = command; +#ifdef DEBUG_UPDATER + DEBUG_UPDATER.printf("[begin] _startAddress: 0x%08X (%d)\n", _startAddress, _startAddress); + DEBUG_UPDATER.printf("[begin] _currentAddress: 0x%08X (%d)\n", _currentAddress, _currentAddress); + DEBUG_UPDATER.printf("[begin] _size: 0x%08X (%d)\n", _size, _size); +#endif + _md5.begin(); return true; } From 7ea4eb452da62b8564855a62e824d97187604946 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 10 Dec 2015 17:37:09 +0100 Subject: [PATCH 05/20] fix String bug length where returning something that is not 0 while buffer where NULL!? --- cores/esp8266/WString.cpp | 4 ++-- cores/esp8266/WString.h | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/WString.cpp b/cores/esp8266/WString.cpp index f92344b84..4ba4b1f9f 100644 --- a/cores/esp8266/WString.cpp +++ b/cores/esp8266/WString.cpp @@ -121,6 +121,7 @@ ICACHE_FLASH_ATTR String::~String() { if(buffer) { free(buffer); } + init(); } // /*********************************************/ @@ -136,8 +137,7 @@ inline void String::init(void) { void ICACHE_FLASH_ATTR String::invalidate(void) { if(buffer) free(buffer); - buffer = NULL; - capacity = len = 0; + init(); } unsigned char ICACHE_FLASH_ATTR String::reserve(unsigned int size) { diff --git a/cores/esp8266/WString.h b/cores/esp8266/WString.h index 4c502bfe5..3f216cee4 100644 --- a/cores/esp8266/WString.h +++ b/cores/esp8266/WString.h @@ -76,7 +76,11 @@ class String { // invalid string (i.e., "if (s)" will be true afterwards) unsigned char reserve(unsigned int size); inline unsigned int length(void) const { - return len; + if(buffer) { + return len; + } else { + return 0; + } } // creates a copy of the assigned value. if the value is null or From 6aa4f9e48100bf4b185044aacf9d369af4616862 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Thu, 10 Dec 2015 18:06:56 +0100 Subject: [PATCH 06/20] doc better quality of update_memory_copy.png --- doc/ota_updates/update_memory_copy.png | Bin 4920 -> 5249 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/doc/ota_updates/update_memory_copy.png b/doc/ota_updates/update_memory_copy.png index 724637485d94cc200e56b53b02de51640de00ae3..c708f5f4cdf7d787da29dab5d0cdbf19630159d7 100644 GIT binary patch literal 5249 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 literal 4920 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 Date: Thu, 10 Dec 2015 23:25:54 +0300 Subject: [PATCH 07/20] SPIFFS: check if path length is valid (#1089) --- cores/esp8266/spiffs_api.cpp | 39 +++++++++++++++++++++++++++++++++--- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/cores/esp8266/spiffs_api.cpp b/cores/esp8266/spiffs_api.cpp index f1689cbfe..f189b4d4e 100644 --- a/cores/esp8266/spiffs_api.cpp +++ b/cores/esp8266/spiffs_api.cpp @@ -41,11 +41,13 @@ extern int32_t spiffs_hal_write(uint32_t addr, uint32_t size, uint8_t *src); extern int32_t spiffs_hal_erase(uint32_t addr, uint32_t size); extern int32_t spiffs_hal_read(uint32_t addr, uint32_t size, uint8_t *dst); -int getSpiffsMode(OpenMode openMode, AccessMode accessMode); +static int getSpiffsMode(OpenMode openMode, AccessMode accessMode); +static bool isSpiffsFilenameValid(const char* name); class SPIFFSFileImpl; class SPIFFSDirImpl; + class SPIFFSImpl : public FSImpl { public: SPIFFSImpl(uint32_t start, uint32_t size, uint32_t pageSize, uint32_t blockSize, uint32_t maxOpenFds) @@ -63,6 +65,14 @@ public: DirImplPtr openDir(const char* path) override; bool rename(const char* pathFrom, const char* pathTo) override { + if (!isSpiffsFilenameValid(pathFrom)) { + DEBUGV("SPIFFSImpl::rename: invalid pathFrom=`%s`\r\n", path); + return false; + } + if (!isSpiffsFilenameValid(pathTo)) { + DEBUGV("SPIFFSImpl::rename: invalid pathTo=`%s` \r\n", path); + return false; + } auto rc = SPIFFS_rename(&_fs, pathFrom, pathTo); if (rc != SPIFFS_OK) { DEBUGV("SPIFFS_rename: rc=%d, from=`%s`, to=`%s`\r\n", rc, @@ -86,6 +96,10 @@ public: } bool remove(const char* path) override { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::remove: invalid path=`%s`\r\n", path); + return false; + } auto rc = SPIFFS_remove(&_fs, path); if (rc != SPIFFS_OK) { DEBUGV("SPIFFS_remove: rc=%d path=`%s`\r\n", rc, path); @@ -229,7 +243,7 @@ protected: std::unique_ptr _cacheBuf; }; -#define CHECKFD() while (_fd == 0) { DEBUGV("SPIFFSFileImpl(%d) _fd == 0\r\n", __LINE__); abort(); } +#define CHECKFD() while (_fd == 0) { panic(); } class SPIFFSFileImpl : public FileImpl { public: @@ -408,6 +422,10 @@ protected: FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode accessMode) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::open: invalid path=`%s` \r\n", path); + return FileImplPtr(); + } int mode = getSpiffsMode(openMode, accessMode); int fd = SPIFFS_open(&_fs, path, mode, 0); if (fd < 0 && _fs.err_code == SPIFFS_ERR_DELETED && (openMode & OM_CREATE)) { @@ -430,12 +448,20 @@ FileImplPtr SPIFFSImpl::open(const char* path, OpenMode openMode, AccessMode acc } bool SPIFFSImpl::exists(const char* path) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::exists: invalid path=`%s` \r\n", path); + return false; + } spiffs_stat stat; int rc = SPIFFS_stat(&_fs, path, &stat); return rc == SPIFFS_OK; } DirImplPtr SPIFFSImpl::openDir(const char* path) { + if (!isSpiffsFilenameValid(path)) { + DEBUGV("SPIFFSImpl::openDir: invalid path=`%s` \r\n", path); + return DirImplPtr(); + } spiffs_DIR dir; spiffs_DIR* result = SPIFFS_opendir(&_fs, path, &dir); if (!result) { @@ -445,7 +471,7 @@ DirImplPtr SPIFFSImpl::openDir(const char* path) { return std::make_shared(path, this, dir); } -int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { +static int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { int mode = 0; if (openMode & OM_CREATE) { mode |= SPIFFS_CREAT; @@ -465,6 +491,13 @@ int getSpiffsMode(OpenMode openMode, AccessMode accessMode) { return mode; } +static bool isSpiffsFilenameValid(const char* name) { + if (name == nullptr) + return false; + auto len = strlen(name); + return len > 0 && len <= SPIFFS_OBJ_NAME_LEN; +} + // these symbols should be defined in the linker script for each flash layout extern "C" uint32_t _SPIFFS_start; extern "C" uint32_t _SPIFFS_end; From 3e49985d478ca223d4bda5c116db47df4e493dc8 Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Fri, 11 Dec 2015 17:31:32 +0200 Subject: [PATCH 08/20] Add @PlatformIO as alternative option to use ESP8266 core for Arduino Hi @igrr, Would be thankful to place some information about [PlatformIO[(http://platformio.org) as alternative cross-platform builder to use ESP8266 core for Arduino on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). Don't hesitate to modify this PR. Thanks in advance! --- README.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/README.md b/README.md index fbd66bedf..987c7f6f2 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,69 @@ python get.py ``` - Restart Arduino +### Using PlatformIO + +[PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies and support for Espressif platform. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). + +- Install [PlatformIO](http://platformio.org) +- Initialise new project +```bash +# +# Create empty directory +# +mkdir myproject +cd myproject + +# +# Find type of supported boards +# +platformio boards espressif + +# Platform: espressif +# -------------------------------------------------------------------------------------------------------- +# Type MCU Frequency Flash RAM Name +# -------------------------------------------------------------------------------------------------------- +# esp01 esp8266 80Mhz 512Kb 32Kb Espressif ESP8266 ESP-01 board +# esp01_1m esp8266 80Mhz 1024Kb 32Kb Espressif ESP8266 ESP-01-1MB board +# esp12e esp8266 80Mhz 4096Kb 32Kb Espressif ESP8266 ESP-12E board (NodeMCU) +# ... + +# +# Initialise base project +# +platformio init --board %TYPE%(see above) + +# The next files/directories will be created in myproject +# platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| +# src - Put your source files here +# lib - Put here project specific (private) libraries +# Do you want to continue? [y/N]: Y +``` +- Place your source code to `src` directory +- Build/Upload project +``` +# process/build project +platformio run + +# build+upload firmware +platformio run --target upload + +# build+upload firmware via OTA +platformio run --target upload --upload-port IP_ADDRESS_HERE +``` + +### IDE Integration +In addition, PlatformIO [can be integrated into the popular IDEs](http://docs.platformio.org/en/latest/ide.html). For example, initialise project for Espressif ESP8266 ESP-01 board and Eclipse IDE +``` +platformio init --board esp01 --ide eclipse +``` +Then [import project](http://docs.platformio.org/en/latest/ide/eclipse.html) using `Eclipse Menu: File > Import... > General > Existing Projects into Workspace`. + +### Demo of OTA firmware uploading +[![PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01](http://img.youtube.com/vi/W8wWjvQ8ZQs/0.jpg)](http://www.youtube.com/watch?v=W8wWjvQ8ZQs "PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01") + +### Documentation + Documentation for latest development version: - [Reference](doc/reference.md) From 1891241f30df84d0d9c7f824723f6d97edf66a28 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 11 Dec 2015 17:54:58 +0100 Subject: [PATCH 09/20] Added WifInfo boards --- boards.txt | 61 +++++++++++++++++++++++++++---- tools/sdk/ld/eagle.flash.1m144.ld | 19 ++++++++++ tools/sdk/ld/eagle.flash.1m160.ld | 19 ++++++++++ tools/sdk/ld/eagle.flash.1m192.ld | 19 ++++++++++ 4 files changed, 110 insertions(+), 8 deletions(-) create mode 100644 tools/sdk/ld/eagle.flash.1m144.ld create mode 100644 tools/sdk/ld/eagle.flash.1m160.ld create mode 100644 tools/sdk/ld/eagle.flash.1m192.ld diff --git a/boards.txt b/boards.txt index 8d9170826..e1ec03dbf 100644 --- a/boards.txt +++ b/boards.txt @@ -712,14 +712,59 @@ wifinfo.build.variant=wifinfo wifinfo.build.flash_mode=qio wifinfo.build.spiffs_pagesize=256 -wifinfo.menu.ESPModule.ESP07=ESP07 (1M/512K SPIFFS) -wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07 -wifinfo.menu.ESPModule.ESP07.build.flash_size=1M -wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m512.ld -wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0x7B000 -wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000 -wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=8192 -wifinfo.menu.ESPModule.ESP07.upload.maximum_size=499696 +#wifinfo.menu.ESPModule.ESP07512=ESP07 (1M/512K SPIFFS) +#wifinfo.menu.ESPModule.ESP07512.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07512.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07512.build.flash_ld=eagle.flash.1m512.ld +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_start=0x7B000 +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_blocksize=8192 +#wifinfo.menu.ESPModule.ESP07512.upload.maximum_size=499696 + +#wifinfo.menu.ESPModule.ESP07256=ESP07 (1M/256K SPIFFS) +#wifinfo.menu.ESPModule.ESP07256.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07256.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07256.build.flash_ld=eagle.flash.1m256.ld +#wifinfo.menu.ESPModule.ESP07256.build.spiffs_start=0xBB000 +#wifinfo.menu.ESPModule.ESP07256.build.spiffs_end=0xFB000 +##wifinfo.menu.ESPModule.ESP07256.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07256.upload.maximum_size=761840 + +wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS) +wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07 +wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M +wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld +wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000 +wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000 +wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096 +wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376 + +#wifinfo.menu.ESPModule.ESP07160=ESP07 (1M/160K SPIFFS) +#wifinfo.menu.ESPModule.ESP07160.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07160.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07160.build.flash_ld=eagle.flash.1m160.ld +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_start=0xD3000 +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07160.upload.maximum_size=860144 +# +#wifinfo.menu.ESPModule.ESP07144=ESP07 (1M/144K SPIFFS) +#wifinfo.menu.ESPModule.ESP07144.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07144.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07144.build.flash_ld=eagle.flash.1m144.ld +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_start=0xD7000 +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07144.upload.maximum_size=876528 +# +#wifinfo.menu.ESPModule.ESP07=ESP07 (1M/64K SPIFFS) +#wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m64.ld +#wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0xEB000 +#wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07.upload.maximum_size=958448 wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS) wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12 diff --git a/tools/sdk/ld/eagle.flash.1m144.ld b/tools/sdk/ld/eagle.flash.1m144.ld new file mode 100644 index 000000000..32c3d645c --- /dev/null +++ b/tools/sdk/ld/eagle.flash.1m144.ld @@ -0,0 +1,19 @@ +/* Flash Split for 1M chips */ +/* sketch 855KB */ +/* spiffs 144KB */ +/* eeprom 20KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xd5ff0 +} + +PROVIDE ( _SPIFFS_start = 0x402D7000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m160.ld b/tools/sdk/ld/eagle.flash.1m160.ld new file mode 100644 index 000000000..89e7897f1 --- /dev/null +++ b/tools/sdk/ld/eagle.flash.1m160.ld @@ -0,0 +1,19 @@ +/* Flash Split for 1M chips */ +/* sketch 839KB */ +/* spiffs 160KB */ +/* eeprom 20KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xd1ff0 +} + +PROVIDE ( _SPIFFS_start = 0x402D3000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" diff --git a/tools/sdk/ld/eagle.flash.1m192.ld b/tools/sdk/ld/eagle.flash.1m192.ld new file mode 100644 index 000000000..cf21286a9 --- /dev/null +++ b/tools/sdk/ld/eagle.flash.1m192.ld @@ -0,0 +1,19 @@ +/* Flash Split for 1M chips */ +/* sketch 807KB */ +/* spiffs 192KB */ +/* eeprom 20KB */ + +MEMORY +{ + dport0_0_seg : org = 0x3FF00000, len = 0x10 + dram0_0_seg : org = 0x3FFE8000, len = 0x14000 + iram1_0_seg : org = 0x40100000, len = 0x8000 + irom0_0_seg : org = 0x40201010, len = 0xc9ff0 +} + +PROVIDE ( _SPIFFS_start = 0x402CB000 ); +PROVIDE ( _SPIFFS_end = 0x402FB000 ); +PROVIDE ( _SPIFFS_page = 0x100 ); +PROVIDE ( _SPIFFS_block = 0x1000 ); + +INCLUDE "../ld/eagle.app.v6.common.ld" From 1adb9e79eadd2040f3732839dc90573abcaf2e16 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 11 Dec 2015 18:18:09 +0100 Subject: [PATCH 10/20] Added WifInfo boards / more SPIFFS size for 1M modules Added WifInfo boards Added 144K SPIFFS size for 1M modules Added 160K SPIFFS size for 1M modules Added 192K SPIFFS size for 1M modules --- boards.txt | 921 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 921 insertions(+) create mode 100644 boards.txt diff --git a/boards.txt b/boards.txt new file mode 100644 index 000000000..64c518e53 --- /dev/null +++ b/boards.txt @@ -0,0 +1,921 @@ +menu.UploadSpeed=Upload Speed +menu.CpuFrequency=CPU Frequency +menu.FlashSize=Flash Size +menu.FlashMode=Flash Mode +menu.FlashFreq=Flash Frequency +menu.UploadTool=Upload Using +menu.ResetMethod=Reset Method +menu.ESPModule=Module + +############################################################## +generic.name=Generic ESP8266 Module + +generic.upload.tool=esptool +generic.upload.speed=115200 +generic.upload.resetmethod=ck +generic.upload.maximum_size=434160 +generic.upload.maximum_data_size=81920 +generic.upload.wait_for_upload_port=true +generic.serial.disableDTR=true +generic.serial.disableRTS=true + +generic.build.mcu=esp8266 +generic.build.f_cpu=80000000L +generic.build.board=ESP8266_ESP01 +generic.build.core=esp8266 +generic.build.variant=generic +generic.build.flash_mode=qio +generic.build.spiffs_pagesize=256 + +generic.menu.UploadTool.esptool=Serial +generic.menu.UploadTool.esptool.upload.tool=esptool +generic.menu.UploadTool.esptool.upload.verbose=-vv +generic.menu.UploadTool.espota=OTA +generic.menu.UploadTool.espota.upload.tool=espota + +generic.menu.CpuFrequency.80=80 MHz +generic.menu.CpuFrequency.80.build.f_cpu=80000000L +generic.menu.CpuFrequency.160=160 MHz +generic.menu.CpuFrequency.160.build.f_cpu=160000000L + +generic.menu.FlashFreq.40=40MHz +generic.menu.FlashFreq.40.build.flash_freq=40 +generic.menu.FlashFreq.80=80MHz +generic.menu.FlashFreq.80.build.flash_freq=80 + +generic.menu.FlashMode.dio=DIO +generic.menu.FlashMode.dio.build.flash_mode=dio +generic.menu.FlashMode.qio=QIO +generic.menu.FlashMode.qio.build.flash_mode=qio + +generic.menu.UploadSpeed.115200=115200 +generic.menu.UploadSpeed.115200.upload.speed=115200 +generic.menu.UploadSpeed.9600=9600 +generic.menu.UploadSpeed.9600.upload.speed=9600 +generic.menu.UploadSpeed.57600=57600 +generic.menu.UploadSpeed.57600.upload.speed=57600 +generic.menu.UploadSpeed.256000.windows=256000 +generic.menu.UploadSpeed.256000.upload.speed=256000 +generic.menu.UploadSpeed.230400.linux=230400 +generic.menu.UploadSpeed.230400.macosx=230400 +generic.menu.UploadSpeed.230400.upload.speed=230400 +generic.menu.UploadSpeed.460800.linux=460800 +generic.menu.UploadSpeed.460800.macosx=460800 +generic.menu.UploadSpeed.460800.upload.speed=460800 +generic.menu.UploadSpeed.512000.windows=512000 +generic.menu.UploadSpeed.512000.upload.speed=512000 +generic.menu.UploadSpeed.921600=921600 +generic.menu.UploadSpeed.921600.upload.speed=921600 + +generic.menu.FlashSize.512K64=512K (64K SPIFFS) +generic.menu.FlashSize.512K64.build.flash_size=512K +generic.menu.FlashSize.512K64.build.flash_ld=eagle.flash.512k64.ld +generic.menu.FlashSize.512K64.build.spiffs_start=0x6B000 +generic.menu.FlashSize.512K64.build.spiffs_end=0x7B000 +generic.menu.FlashSize.512K64.build.spiffs_blocksize=4096 +generic.menu.FlashSize.512K64.upload.maximum_size=434160 + +generic.menu.FlashSize.512K0=512K (no SPIFFS) +generic.menu.FlashSize.512K0.build.flash_size=512K +generic.menu.FlashSize.512K0.build.flash_ld=eagle.flash.512k0.ld +generic.menu.FlashSize.512K0.upload.maximum_size=499696 + +generic.menu.FlashSize.1M512=1M (512K SPIFFS) +generic.menu.FlashSize.1M512.build.flash_size=1M +generic.menu.FlashSize.1M512.build.flash_ld=eagle.flash.1m512.ld +generic.menu.FlashSize.1M512.build.spiffs_start=0x7B000 +generic.menu.FlashSize.1M512.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M512.build.spiffs_blocksize=8192 +generic.menu.FlashSize.1M512.upload.maximum_size=499696 + +generic.menu.FlashSize.1M256=1M (256K SPIFFS) +generic.menu.FlashSize.1M256.build.flash_size=1M +generic.menu.FlashSize.1M256.build.flash_ld=eagle.flash.1m256.ld +generic.menu.FlashSize.1M256.build.spiffs_start=0xBB000 +generic.menu.FlashSize.1M256.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M256.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M256.upload.maximum_size=761840 + +generic.menu.FlashSize.1M192=1M (192K SPIFFS) +generic.menu.FlashSize.1M192.build.flash_size=1M +generic.menu.FlashSize.1M192.build.flash_ld=eagle.flash.1m192.ld +generic.menu.FlashSize.1M192.build.spiffs_start=0xCB000 +generic.menu.FlashSize.1M192.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M192.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M192.upload.maximum_size=827376 + +generic.menu.FlashSize.1M160=1M (160K SPIFFS) +generic.menu.FlashSize.1M160.build.flash_size=1M +generic.menu.FlashSize.1M160.build.flash_ld=eagle.flash.1m160.ld +generic.menu.FlashSize.1M160.build.spiffs_start=0xD3000 +generic.menu.FlashSize.1M160.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M160.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M160.upload.maximum_size=860144 + +generic.menu.FlashSize.1M144=1M (144K SPIFFS) +generic.menu.FlashSize.1M144.build.flash_size=1M +generic.menu.FlashSize.1M144.build.flash_ld=eagle.flash.1m144.ld +generic.menu.FlashSize.1M144.build.spiffs_start=0xD7000 +generic.menu.FlashSize.1M144.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M144.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M144.upload.maximum_size=876528 + +generic.menu.FlashSize.1M128=1M (128K SPIFFS) +generic.menu.FlashSize.1M128.build.flash_size=1M +generic.menu.FlashSize.1M128.build.flash_ld=eagle.flash.1m128.ld +generic.menu.FlashSize.1M128.build.spiffs_start=0xDB000 +generic.menu.FlashSize.1M128.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M128.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M128.upload.maximum_size=892912 + +generic.menu.FlashSize.1M64=1M (64K SPIFFS) +generic.menu.FlashSize.1M64.build.flash_size=1M +generic.menu.FlashSize.1M64.build.flash_ld=eagle.flash.1m64.ld +generic.menu.FlashSize.1M64.build.spiffs_start=0xEB000 +generic.menu.FlashSize.1M64.build.spiffs_end=0xFB000 +generic.menu.FlashSize.1M64.build.spiffs_blocksize=4096 +generic.menu.FlashSize.1M64.upload.maximum_size=958448 + +generic.menu.FlashSize.2M=2M (1M SPIFFS) +generic.menu.FlashSize.2M.build.flash_size=2M +generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld +generic.menu.FlashSize.2M.build.spiffs_start=0x100000 +generic.menu.FlashSize.2M.build.spiffs_end=0x1FB000 +generic.menu.FlashSize.2M.build.spiffs_blocksize=8192 +generic.menu.FlashSize.2M.upload.maximum_size=1044464 + +generic.menu.FlashSize.4M1M=4M (1M SPIFFS) +generic.menu.FlashSize.4M1M.build.flash_size=4M +generic.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +generic.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +generic.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +generic.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +generic.menu.FlashSize.4M1M.build.spiffs_pagesize=256 +generic.menu.FlashSize.4M1M.upload.maximum_size=1044464 + +generic.menu.FlashSize.4M3M=4M (3M SPIFFS) +generic.menu.FlashSize.4M3M.build.flash_size=4M +generic.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +generic.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +generic.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +generic.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +generic.menu.FlashSize.4M3M.upload.maximum_size=1044464 + +generic.menu.ResetMethod.ck=ck +generic.menu.ResetMethod.ck.upload.resetmethod=ck +generic.menu.ResetMethod.nodemcu=nodemcu +generic.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu + +# disabled because espressif's bootloader refuses to write above 4M +# generic.menu.FlashSize.8M=8M (7M SPIFFS) +# generic.menu.FlashSize.8M.build.flash_size=1M +# generic.menu.FlashSize.8M.build.flash_ld=eagle.flash.8m.ld +# generic.menu.FlashSize.8M.build.spiffs_start=0x100000 +# generic.menu.FlashSize.8M.build.spiffs_end=0x800000 +# generic.menu.FlashSize.8M.build.spiffs_blocksize=8192 +# generic.menu.FlashSize.16M=16M (15M SPIFFS) +# generic.menu.FlashSize.16M.build.flash_size=1M +# generic.menu.FlashSize.16M.build.flash_ld=eagle.flash.16m.ld +# generic.menu.FlashSize.16M.build.spiffs_start=0x100000 +# generic.menu.FlashSize.16M.build.spiffs_end=0x1000000 +# generic.menu.FlashSize.16M.build.spiffs_blocksize=8192 + +############################################################## +huzzah.name=Adafruit HUZZAH ESP8266 + +huzzah.upload.tool=esptool +huzzah.upload.speed=115200 +huzzah.upload.resetmethod=ck +huzzah.upload.maximum_size=1044464 +huzzah.upload.maximum_data_size=81920 +huzzah.upload.wait_for_upload_port=true +huzzah.serial.disableDTR=true +huzzah.serial.disableRTS=true + +huzzah.build.mcu=esp8266 +huzzah.build.f_cpu=80000000L +huzzah.build.board=ESP8266_ESP12 +huzzah.build.core=esp8266 +huzzah.build.variant=adafruit +huzzah.build.flash_mode=qio +huzzah.build.flash_size=4M +huzzah.build.flash_freq=40 + +huzzah.menu.CpuFrequency.80=80 MHz +huzzah.menu.CpuFrequency.80.build.f_cpu=80000000L +huzzah.menu.CpuFrequency.160=160 MHz +huzzah.menu.CpuFrequency.160.build.f_cpu=160000000L + +huzzah.menu.UploadTool.esptool=Serial +huzzah.menu.UploadTool.esptool.upload.tool=esptool +huzzah.menu.UploadTool.esptool.upload.verbose=-vv + +huzzah.menu.UploadSpeed.115200=115200 +huzzah.menu.UploadSpeed.115200.upload.speed=115200 +huzzah.menu.UploadSpeed.9600=9600 +huzzah.menu.UploadSpeed.9600.upload.speed=9600 +huzzah.menu.UploadSpeed.57600=57600 +huzzah.menu.UploadSpeed.57600.upload.speed=57600 +huzzah.menu.UploadSpeed.256000=256000 +huzzah.menu.UploadSpeed.256000.upload.speed=256000 +huzzah.menu.UploadSpeed.921600=921600 +huzzah.menu.UploadSpeed.921600.upload.speed=921600 + +huzzah.menu.FlashSize.4M3M=4M (3M SPIFFS) +huzzah.menu.FlashSize.4M3M.build.flash_size=4M +huzzah.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +huzzah.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +huzzah.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +huzzah.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +huzzah.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +huzzah.menu.FlashSize.4M1M=4M (1M SPIFFS) +huzzah.menu.FlashSize.4M1M.build.flash_size=4M +huzzah.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +huzzah.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +huzzah.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +huzzah.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +huzzah.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + +############################################################## +nodemcu.name=NodeMCU 0.9 (ESP-12 Module) + +nodemcu.upload.tool=esptool +nodemcu.upload.speed=115200 +nodemcu.upload.resetmethod=nodemcu +nodemcu.upload.maximum_size=1044464 +nodemcu.upload.maximum_data_size=81920 +nodemcu.upload.wait_for_upload_port=true +nodemcu.serial.disableDTR=true +nodemcu.serial.disableRTS=true + +nodemcu.build.mcu=esp8266 +nodemcu.build.f_cpu=80000000L +nodemcu.build.board=ESP8266_ESP12 +nodemcu.build.core=esp8266 +nodemcu.build.variant=nodemcu +nodemcu.build.flash_mode=qio +nodemcu.build.flash_size=4M +nodemcu.build.flash_freq=40 + +nodemcu.menu.CpuFrequency.80=80 MHz +nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L +nodemcu.menu.CpuFrequency.160=160 MHz +nodemcu.menu.CpuFrequency.160.build.f_cpu=160000000L + +nodemcu.menu.UploadTool.esptool=Serial +nodemcu.menu.UploadTool.esptool.upload.tool=esptool +nodemcu.menu.UploadTool.esptool.upload.verbose=-vv + +nodemcu.menu.UploadSpeed.115200=115200 +nodemcu.menu.UploadSpeed.115200.upload.speed=115200 +nodemcu.menu.UploadSpeed.9600=9600 +nodemcu.menu.UploadSpeed.9600.upload.speed=9600 +nodemcu.menu.UploadSpeed.57600=57600 +nodemcu.menu.UploadSpeed.57600.upload.speed=57600 +nodemcu.menu.UploadSpeed.256000.windows=256000 +nodemcu.menu.UploadSpeed.256000.upload.speed=256000 +nodemcu.menu.UploadSpeed.230400.linux=230400 +nodemcu.menu.UploadSpeed.230400.macosx=230400 +nodemcu.menu.UploadSpeed.230400.macosx=230400 +nodemcu.menu.UploadSpeed.230400.upload.speed=230400 +nodemcu.menu.UploadSpeed.460800.linux=460800 +nodemcu.menu.UploadSpeed.460800.macosx=460800 +nodemcu.menu.UploadSpeed.460800.upload.speed=460800 +nodemcu.menu.UploadSpeed.512000.windows=512000 +nodemcu.menu.UploadSpeed.512000.upload.speed=512000 +nodemcu.menu.UploadSpeed.921600=921600 +nodemcu.menu.UploadSpeed.921600.upload.speed=921600 + +nodemcu.menu.FlashSize.4M3M=4M (3M SPIFFS) +nodemcu.menu.FlashSize.4M3M.build.flash_size=4M +nodemcu.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +nodemcu.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +nodemcu.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +nodemcu.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +nodemcu.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +nodemcu.menu.FlashSize.4M1M=4M (1M SPIFFS) +nodemcu.menu.FlashSize.4M1M.build.flash_size=4M +nodemcu.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +nodemcu.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +nodemcu.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +nodemcu.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +nodemcu.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + +############################################################## +nodemcuv2.name=NodeMCU 1.0 (ESP-12E Module) + +nodemcuv2.upload.tool=esptool +nodemcuv2.upload.speed=115200 +nodemcuv2.upload.resetmethod=nodemcu +nodemcuv2.upload.maximum_size=1044464 +nodemcuv2.upload.maximum_data_size=81920 +nodemcuv2.upload.wait_for_upload_port=true +nodemcuv2.serial.disableDTR=true +nodemcuv2.serial.disableRTS=true + +nodemcuv2.build.mcu=esp8266 +nodemcuv2.build.f_cpu=80000000L +nodemcuv2.build.board=ESP8266_ESP12 +nodemcuv2.build.core=esp8266 +nodemcuv2.build.variant=nodemcu +nodemcuv2.build.flash_mode=dio +nodemcuv2.build.flash_size=4M +nodemcuv2.build.flash_freq=40 + +nodemcuv2.menu.CpuFrequency.80=80 MHz +nodemcuv2.menu.CpuFrequency.80.build.f_cpu=80000000L +nodemcuv2.menu.CpuFrequency.160=160 MHz +nodemcuv2.menu.CpuFrequency.160.build.f_cpu=160000000L + +nodemcuv2.menu.UploadTool.esptool=Serial +nodemcuv2.menu.UploadTool.esptool.upload.tool=esptool +nodemcuv2.menu.UploadTool.esptool.upload.verbose=-vv +nodemcuv2.menu.UploadTool.espota=OTA +nodemcuv2.menu.UploadTool.espota.upload.tool=espota + +nodemcuv2.menu.UploadSpeed.115200=115200 +nodemcuv2.menu.UploadSpeed.115200.upload.speed=115200 +nodemcuv2.menu.UploadSpeed.9600=9600 +nodemcuv2.menu.UploadSpeed.9600.upload.speed=9600 +nodemcuv2.menu.UploadSpeed.57600=57600 +nodemcuv2.menu.UploadSpeed.57600.upload.speed=57600 +nodemcuv2.menu.UploadSpeed.256000.windows=256000 +nodemcuv2.menu.UploadSpeed.256000.upload.speed=256000 +nodemcuv2.menu.UploadSpeed.230400.linux=230400 +nodemcuv2.menu.UploadSpeed.230400.macosx=230400 +nodemcuv2.menu.UploadSpeed.230400.macosx=230400 +nodemcuv2.menu.UploadSpeed.230400.upload.speed=230400 +nodemcuv2.menu.UploadSpeed.460800.linux=460800 +nodemcuv2.menu.UploadSpeed.460800.macosx=460800 +nodemcuv2.menu.UploadSpeed.460800.upload.speed=460800 +nodemcuv2.menu.UploadSpeed.512000.windows=512000 +nodemcuv2.menu.UploadSpeed.512000.upload.speed=512000 +nodemcuv2.menu.UploadSpeed.921600=921600 +nodemcuv2.menu.UploadSpeed.921600.upload.speed=921600 + +nodemcuv2.menu.FlashSize.4M3M=4M (3M SPIFFS) +nodemcuv2.menu.FlashSize.4M3M.build.flash_size=4M +nodemcuv2.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +nodemcuv2.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +nodemcuv2.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +nodemcuv2.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +nodemcuv2.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +nodemcuv2.menu.FlashSize.4M1M=4M (1M SPIFFS) +nodemcuv2.menu.FlashSize.4M1M.build.flash_size=4M +nodemcuv2.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +nodemcuv2.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +nodemcuv2.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +nodemcuv2.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +nodemcuv2.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + + +############################################################## +modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV) + +modwifi.upload.tool=esptool +modwifi.upload.speed=115200 +modwifi.upload.resetmethod=ck +modwifi.upload.maximum_size=1044464 +modwifi.upload.maximum_data_size=81920 +modwifi.upload.wait_for_upload_port=true +modwifi.serial.disableDTR=true +modwifi.serial.disableRTS=true + +modwifi.build.mcu=esp8266 +modwifi.build.f_cpu=80000000L +modwifi.build.board=MOD_WIFI_ESP8266 +modwifi.build.core=esp8266 +modwifi.build.variant=generic +# Winbond W25Q16 flash +modwifi.build.flash_mode=qio +modwifi.build.flash_size=2M +modwifi.build.flash_freq=40 +modwifi.build.flash_ld=eagle.flash.2m.ld +modwifi.build.spiffs_start=0x100000 +modwifi.build.spiffs_end=0x1FB000 +modwifi.build.spiffs_pagesize=256 +modwifi.build.spiffs_blocksize=8192 + +modwifi.menu.CpuFrequency.80=80 MHz +modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L +modwifi.menu.CpuFrequency.160=160 MHz +modwifi.menu.CpuFrequency.160.build.f_cpu=160000000L + +modwifi.menu.UploadTool.esptool=Serial +modwifi.menu.UploadTool.esptool.upload.tool=esptool +modwifi.menu.UploadTool.esptool.upload.verbose=-vv + +modwifi.menu.UploadSpeed.115200=115200 +modwifi.menu.UploadSpeed.115200.upload.speed=115200 +modwifi.menu.UploadSpeed.9600=9600 +modwifi.menu.UploadSpeed.9600.upload.speed=9600 +modwifi.menu.UploadSpeed.57600=57600 +modwifi.menu.UploadSpeed.57600.upload.speed=57600 +modwifi.menu.UploadSpeed.256000.windows=256000 +modwifi.menu.UploadSpeed.256000.upload.speed=256000 +modwifi.menu.UploadSpeed.230400.linux=230400 +modwifi.menu.UploadSpeed.230400.macosx=230400 +modwifi.menu.UploadSpeed.230400.macosx=230400 +modwifi.menu.UploadSpeed.230400.upload.speed=230400 +modwifi.menu.UploadSpeed.460800.linux=460800 +modwifi.menu.UploadSpeed.460800.macosx=460800 +modwifi.menu.UploadSpeed.460800.upload.speed=460800 +modwifi.menu.UploadSpeed.512000.windows=512000 +modwifi.menu.UploadSpeed.512000.upload.speed=512000 +modwifi.menu.UploadSpeed.921600=921600 +modwifi.menu.UploadSpeed.921600.upload.speed=921600 + +############################################################## +thing.name=SparkFun ESP8266 Thing + +thing.upload.tool=esptool +thing.upload.speed=921600 +thing.upload.resetmethod=ck +thing.upload.maximum_size=434160 +thing.upload.maximum_data_size=81920 +thing.upload.wait_for_upload_port=true +thing.serial.disableDTR=true +thing.serial.disableRTS=true + +thing.build.mcu=esp8266 +thing.build.f_cpu=80000000L +thing.build.board=ESP8266_THING +thing.build.core=esp8266 +thing.build.variant=thing +thing.build.flash_mode=qio +# flash chip: AT25SF041 (512 kbyte, 4Mbit) +thing.build.flash_size=512K +thing.build.flash_ld=eagle.flash.512k64.ld +thing.build.flash_freq=40 +thing.build.spiffs_start=0x6B000 +thing.build.spiffs_end=0x7B000 +thing.build.spiffs_blocksize=4096 +thing.build.spiffs_pagesize=256 + +thing.menu.CpuFrequency.80=80 MHz +thing.menu.CpuFrequency.80.build.f_cpu=80000000L +thing.menu.CpuFrequency.160=160 MHz +thing.menu.CpuFrequency.160.build.f_cpu=160000000L + +thing.menu.UploadTool.esptool=Serial +thing.menu.UploadTool.esptool.upload.tool=esptool +thing.menu.UploadTool.esptool.upload.verbose=-vv + +thing.menu.UploadSpeed.115200=115200 +thing.menu.UploadSpeed.115200.upload.speed=115200 +thing.menu.UploadSpeed.9600=9600 +thing.menu.UploadSpeed.9600.upload.speed=9600 +thing.menu.UploadSpeed.57600=57600 +thing.menu.UploadSpeed.57600.upload.speed=57600 +thing.menu.UploadSpeed.256000.windows=256000 +thing.menu.UploadSpeed.256000.upload.speed=256000 +thing.menu.UploadSpeed.230400.linux=230400 +thing.menu.UploadSpeed.230400.macosx=230400 +thing.menu.UploadSpeed.230400.upload.speed=230400 +thing.menu.UploadSpeed.460800.linux=460800 +thing.menu.UploadSpeed.460800.macosx=460800 +thing.menu.UploadSpeed.460800.upload.speed=460800 +thing.menu.UploadSpeed.512000.windows=512000 +thing.menu.UploadSpeed.512000.upload.speed=512000 +thing.menu.UploadSpeed.921600=921600 +thing.menu.UploadSpeed.921600.upload.speed=921600 + +############################################################## +esp210.name=SweetPea ESP-210 + +esp210.upload.tool=esptool +esp210.upload.speed=115200 +esp210.upload.resetmethod=ck +esp210.upload.maximum_size=1044464 +esp210.upload.maximum_data_size=81920 +esp210.upload.wait_for_upload_port=true +esp210.serial.disableDTR=true +esp210.serial.disableRTS=true + +esp210.build.mcu=esp8266 +esp210.build.f_cpu=80000000L +esp210.build.board=ESP8266_ESP210 +esp210.build.core=esp8266 +esp210.build.variant=generic +esp210.build.flash_mode=qio +esp210.build.flash_size=4M +esp210.build.flash_freq=40 + +esp210.menu.CpuFrequency.80=80 MHz +esp210.menu.CpuFrequency.80.build.f_cpu=80000000L +esp210.menu.CpuFrequency.160=160 MHz +esp210.menu.CpuFrequency.160.build.f_cpu=160000000L + +esp210.menu.UploadTool.esptool=Serial +esp210.menu.UploadTool.esptool.upload.tool=esptool +esp210.menu.UploadTool.esptool.upload.verbose=-vv + +esp210.menu.UploadSpeed.57600=57600 +esp210.menu.UploadSpeed.57600.upload.speed=57600 +esp210.menu.UploadSpeed.115200=115200 +esp210.menu.UploadSpeed.115200.upload.speed=115200 +esp210.menu.UploadSpeed.256000.windows=256000 +esp210.menu.UploadSpeed.256000.upload.speed=256000 +esp210.menu.UploadSpeed.230400.linux=230400 +esp210.menu.UploadSpeed.230400.macosx=230400 +esp210.menu.UploadSpeed.230400.macosx=230400 +esp210.menu.UploadSpeed.230400.upload.speed=230400 +esp210.menu.UploadSpeed.460800.linux=460800 +esp210.menu.UploadSpeed.460800.macosx=460800 +esp210.menu.UploadSpeed.460800.upload.speed=460800 +esp210.menu.UploadSpeed.512000.windows=512000 +esp210.menu.UploadSpeed.512000.upload.speed=512000 +esp210.menu.UploadSpeed.921600=921600 +esp210.menu.UploadSpeed.921600.upload.speed=921600 + +esp210.menu.FlashSize.4M3M=4M (3M SPIFFS) +esp210.menu.FlashSize.4M3M.build.flash_size=4M +esp210.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +esp210.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +esp210.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +esp210.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +esp210.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +esp210.menu.FlashSize.4M1M=4M (1M SPIFFS) +esp210.menu.FlashSize.4M1M.build.flash_size=4M +esp210.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +esp210.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +esp210.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +esp210.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +esp210.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + +############################################################## +# wifio.name=Wifio +# +# wifio.upload.tool=esptool +# wifio.upload.speed=115200 +# wifio.upload.resetmethod=wifio +# wifio.upload.maximum_size=524288 +# wifio.upload.wait_for_upload_port=true +# +# wifio.build.mcu=esp8266 +# wifio.build.f_cpu=80000000L +# wifio.build.board=ESP8266_WIFIO +# wifio.build.core=esp8266 +# wifio.build.variant=wifio +# wifio.build.flash_mode=qio +# wifio.build.flash_size=512K +# wifio.build.flash_freq=40 +# wifio.build.flash_ld=eagle.flash.512k64.ld +# wifio.build.spiffs_start=0x6B000 +# wifio.build.spiffs_end=0x7B000 +# +# wifio.menu.CpuFrequency.80=80MHz +# wifio.menu.CpuFrequency.80.build.f_cpu=80000000L +# wifio.menu.CpuFrequency.160=160MHz +# wifio.menu.CpuFrequency.160.build.f_cpu=160000000L +# +# wifio.upload.tool=esptool +# + +############################################################## +d1.name=WeMos D1 + +d1.upload.tool=esptool +d1.upload.speed=460800 +d1.upload.resetmethod=nodemcu +d1.upload.maximum_size=1044464 +d1.upload.maximum_data_size=81920 +d1.upload.wait_for_upload_port=true +d1.serial.disableDTR=true +d1.serial.disableRTS=true + +d1.build.mcu=esp8266 +d1.build.f_cpu=80000000L +d1.build.board=ESP8266_ESP12 +d1.build.core=esp8266 +d1.build.variant=d1 +d1.build.flash_mode=dio +d1.build.flash_size=4M +d1.build.flash_freq=40 + +d1.menu.CpuFrequency.80=80 MHz +d1.menu.CpuFrequency.80.build.f_cpu=80000000L +d1.menu.CpuFrequency.160=160 MHz +d1.menu.CpuFrequency.160.build.f_cpu=160000000L + +d1.menu.UploadTool.esptool=Serial +d1.menu.UploadTool.esptool.upload.tool=esptool +d1.menu.UploadTool.esptool.upload.verbose=-vv + +d1.menu.UploadTool.espota=OTA +d1.menu.UploadTool.espota.upload.tool=espota + +d1.menu.UploadSpeed.921600=921600 +d1.menu.UploadSpeed.921600.upload.speed=921600 +d1.menu.UploadSpeed.115200=115200 +d1.menu.UploadSpeed.115200.upload.speed=115200 +d1.menu.UploadSpeed.9600=9600 +d1.menu.UploadSpeed.9600.upload.speed=9600 +d1.menu.UploadSpeed.57600=57600 +d1.menu.UploadSpeed.57600.upload.speed=57600 +d1.menu.UploadSpeed.256000.windows=256000 +d1.menu.UploadSpeed.256000.upload.speed=256000 +d1.menu.UploadSpeed.230400.linux=230400 +d1.menu.UploadSpeed.230400.macosx=230400 +d1.menu.UploadSpeed.230400.macosx=230400 +d1.menu.UploadSpeed.230400.upload.speed=230400 +d1.menu.UploadSpeed.460800.linux=460800 +d1.menu.UploadSpeed.460800.macosx=460800 +d1.menu.UploadSpeed.460800.upload.speed=460800 +d1.menu.UploadSpeed.512000.windows=512000 +d1.menu.UploadSpeed.512000.upload.speed=512000 + + +d1.menu.FlashSize.4M3M=4M (3M SPIFFS) +d1.menu.FlashSize.4M3M.build.flash_size=4M +d1.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +d1.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +d1.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +d1.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +d1.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +d1.menu.FlashSize.4M1M=4M (1M SPIFFS) +d1.menu.FlashSize.4M1M.build.flash_size=4M +d1.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +d1.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +d1.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +d1.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +d1.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + + +############################################################## +d1_mini.name=WeMos D1 mini + +d1_mini.upload.tool=esptool +d1_mini.upload.speed=460800 +d1_mini.upload.resetmethod=nodemcu +d1_mini.upload.maximum_size=1044464 +d1_mini.upload.maximum_data_size=81920 +d1_mini.upload.wait_for_upload_port=true +d1_mini.serial.disableDTR=true +d1_mini.serial.disableRTS=true + +d1_mini.build.mcu=esp8266 +d1_mini.build.f_cpu=80000000L +d1_mini.build.board=ESP8266_ESP12 +d1_mini.build.core=esp8266 +d1_mini.build.variant=d1_mini +d1_mini.build.flash_mode=dio +d1_mini.build.flash_size=4M +d1_mini.build.flash_freq=40 + +d1_mini.menu.CpuFrequency.80=80 MHz +d1_mini.menu.CpuFrequency.80.build.f_cpu=80000000L +d1_mini.menu.CpuFrequency.160=160 MHz +d1_mini.menu.CpuFrequency.160.build.f_cpu=160000000L + +d1_mini.menu.UploadTool.esptool=Serial +d1_mini.menu.UploadTool.esptool.upload.tool=esptool +d1_mini.menu.UploadTool.esptool.upload.verbose=-vv + +d1_mini.menu.UploadTool.espota=OTA +d1_mini.menu.UploadTool.espota.upload.tool=espota + +d1_mini.menu.UploadSpeed.921600=921600 +d1_mini.menu.UploadSpeed.921600.upload.speed=921600 +d1_mini.menu.UploadSpeed.115200=115200 +d1_mini.menu.UploadSpeed.115200.upload.speed=115200 +d1_mini.menu.UploadSpeed.9600=9600 +d1_mini.menu.UploadSpeed.9600.upload.speed=9600 +d1_mini.menu.UploadSpeed.57600=57600 +d1_mini.menu.UploadSpeed.57600.upload.speed=57600 +d1_mini.menu.UploadSpeed.256000.windows=256000 +d1_mini.menu.UploadSpeed.256000.upload.speed=256000 +d1_mini.menu.UploadSpeed.230400.linux=230400 +d1_mini.menu.UploadSpeed.230400.macosx=230400 +d1_mini.menu.UploadSpeed.230400.macosx=230400 +d1_mini.menu.UploadSpeed.230400.upload.speed=230400 +d1_mini.menu.UploadSpeed.460800.linux=460800 +d1_mini.menu.UploadSpeed.460800.macosx=460800 +d1_mini.menu.UploadSpeed.460800.upload.speed=460800 +d1_mini.menu.UploadSpeed.512000.windows=512000 +d1_mini.menu.UploadSpeed.512000.upload.speed=512000 + + +d1_mini.menu.FlashSize.4M3M=4M (3M SPIFFS) +d1_mini.menu.FlashSize.4M3M.build.flash_size=4M +d1_mini.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +d1_mini.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +d1_mini.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +d1_mini.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +d1_mini.menu.FlashSize.4M3M.build.spiffs_pagesize=256 + +d1_mini.menu.FlashSize.4M1M=4M (1M SPIFFS) +d1_mini.menu.FlashSize.4M1M.build.flash_size=4M +d1_mini.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +d1_mini.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +d1_mini.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +d1_mini.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +d1_mini.menu.FlashSize.4M1M.build.spiffs_pagesize=256 + + +############################################################## +espino.name=ESPino + +espino.upload.tool=esptool +espino.upload.speed=115200 +espino.upload.resetmethod=ck +espino.upload.maximum_size=1044464 +espino.upload.maximum_data_size=81920 +espino.upload.wait_for_upload_port=true +espino.serial.disableDTR=true +espino.serial.disableRTS=true + +espino.build.mcu=esp8266 +espino.build.f_cpu=80000000L +espino.build.board=ESP8266_ESP12 +espino.build.core=esp8266 +espino.build.variant=espino +espino.build.flash_mode=qio +espino.build.flash_size=4M +espino.build.flash_freq=40 +espino.build.spiffs_pagesize=256 + +espino.menu.UploadTool.esptool=Serial +espino.menu.UploadTool.esptool.upload.tool=esptool +espino.menu.UploadTool.esptool.upload.verbose=-vv +espino.menu.UploadTool.espota=OTA +espino.menu.UploadTool.espota.upload.tool=espota + +espino.menu.CpuFrequency.80=80 MHz +espino.menu.CpuFrequency.80.build.f_cpu=80000000L +espino.menu.CpuFrequency.160=160 MHz +espino.menu.CpuFrequency.160.build.f_cpu=160000000L + +espino.menu.FlashMode.dio=DIO +espino.menu.FlashMode.dio.build.flash_mode=dio +espino.menu.FlashMode.qio=QIO +espino.menu.FlashMode.qio.build.flash_mode=qio + +espino.menu.UploadSpeed.115200=115200 +espino.menu.UploadSpeed.115200.upload.speed=115200 +espino.menu.UploadSpeed.9600=9600 +espino.menu.UploadSpeed.9600.upload.speed=9600 +espino.menu.UploadSpeed.57600=57600 +espino.menu.UploadSpeed.57600.upload.speed=57600 +espino.menu.UploadSpeed.256000.windows=256000 +espino.menu.UploadSpeed.256000.upload.speed=256000 +espino.menu.UploadSpeed.230400.linux=230400 +espino.menu.UploadSpeed.230400.macosx=230400 +espino.menu.UploadSpeed.230400.upload.speed=230400 +espino.menu.UploadSpeed.460800.linux=460800 +espino.menu.UploadSpeed.460800.macosx=460800 +espino.menu.UploadSpeed.460800.upload.speed=460800 +espino.menu.UploadSpeed.512000.windows=512000 +espino.menu.UploadSpeed.512000.upload.speed=512000 +espino.menu.UploadSpeed.921600=921600 +espino.menu.UploadSpeed.921600.upload.speed=921600 + +espino.menu.FlashSize.4M1M=4M (1M SPIFFS) +espino.menu.FlashSize.4M1M.build.flash_size=4M +espino.menu.FlashSize.4M1M.build.flash_ld=eagle.flash.4m1m.ld +espino.menu.FlashSize.4M1M.build.spiffs_start=0x300000 +espino.menu.FlashSize.4M1M.build.spiffs_end=0x3FB000 +espino.menu.FlashSize.4M1M.build.spiffs_blocksize=8192 +espino.menu.FlashSize.4M1M.build.spiffs_pagesize=256 +espino.menu.FlashSize.4M1M.upload.maximum_size=1044464 + +espino.menu.FlashSize.4M3M=4M (3M SPIFFS) +espino.menu.FlashSize.4M3M.build.flash_size=4M +espino.menu.FlashSize.4M3M.build.flash_ld=eagle.flash.4m.ld +espino.menu.FlashSize.4M3M.build.spiffs_start=0x100000 +espino.menu.FlashSize.4M3M.build.spiffs_end=0x3FB000 +espino.menu.FlashSize.4M3M.build.spiffs_blocksize=8192 +espino.menu.FlashSize.4M3M.upload.maximum_size=1044464 + +espino.menu.ResetMethod.ck=ck +espino.menu.ResetMethod.ck.upload.resetmethod=ck +espino.menu.ResetMethod.nodemcu=nodemcu +espino.menu.ResetMethod.nodemcu.upload.resetmethod=nodemcu + +############################################################## +wifinfo.name=WifInfo + +wifinfo.upload.tool=esptool +wifinfo.upload.speed=115200 +wifinfo.upload.resetmethod=nodemcu +wifinfo.upload.maximum_size=434160 +wifinfo.upload.maximum_data_size=81920 +wifinfo.upload.wait_for_upload_port=true +wifinfo.serial.disableDTR=true +wifinfo.serial.disableRTS=true + +wifinfo.build.mcu=esp8266 +wifinfo.build.f_cpu=80000000L +wifinfo.build.core=esp8266 +wifinfo.build.variant=wifinfo +wifinfo.build.flash_mode=qio +wifinfo.build.spiffs_pagesize=256 + +#wifinfo.menu.ESPModule.ESP07512=ESP07 (1M/512K SPIFFS) +#wifinfo.menu.ESPModule.ESP07512.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07512.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07512.build.flash_ld=eagle.flash.1m512.ld +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_start=0x7B000 +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07512.build.spiffs_blocksize=8192 +#wifinfo.menu.ESPModule.ESP07512.upload.maximum_size=499696 + +#wifinfo.menu.ESPModule.ESP07256=ESP07 (1M/256K SPIFFS) +#wifinfo.menu.ESPModule.ESP07256.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07256.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07256.build.flash_ld=eagle.flash.1m256.ld +#wifinfo.menu.ESPModule.ESP07256.build.spiffs_start=0xBB000 +#wifinfo.menu.ESPModule.ESP07256.build.spiffs_end=0xFB000 +##wifinfo.menu.ESPModule.ESP07256.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07256.upload.maximum_size=761840 + +wifinfo.menu.ESPModule.ESP07192=ESP07 (1M/192K SPIFFS) +wifinfo.menu.ESPModule.ESP07192.build.board=ESP8266_ESP07 +wifinfo.menu.ESPModule.ESP07192.build.flash_size=1M +wifinfo.menu.ESPModule.ESP07192.build.flash_ld=eagle.flash.1m192.ld +wifinfo.menu.ESPModule.ESP07192.build.spiffs_start=0xCB000 +wifinfo.menu.ESPModule.ESP07192.build.spiffs_end=0xFB000 +wifinfo.menu.ESPModule.ESP07192.build.spiffs_blocksize=4096 +wifinfo.menu.ESPModule.ESP07192.upload.maximum_size=827376 + +#wifinfo.menu.ESPModule.ESP07160=ESP07 (1M/160K SPIFFS) +#wifinfo.menu.ESPModule.ESP07160.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07160.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07160.build.flash_ld=eagle.flash.1m160.ld +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_start=0xD3000 +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07160.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07160.upload.maximum_size=860144 +# +#wifinfo.menu.ESPModule.ESP07144=ESP07 (1M/144K SPIFFS) +#wifinfo.menu.ESPModule.ESP07144.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07144.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07144.build.flash_ld=eagle.flash.1m144.ld +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_start=0xD7000 +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07144.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07144.upload.maximum_size=876528 +# +#wifinfo.menu.ESPModule.ESP07=ESP07 (1M/64K SPIFFS) +#wifinfo.menu.ESPModule.ESP07.build.board=ESP8266_ESP07 +#wifinfo.menu.ESPModule.ESP07.build.flash_size=1M +#wifinfo.menu.ESPModule.ESP07.build.flash_ld=eagle.flash.1m64.ld +#wifinfo.menu.ESPModule.ESP07.build.spiffs_start=0xEB000 +#wifinfo.menu.ESPModule.ESP07.build.spiffs_end=0xFB000 +#wifinfo.menu.ESPModule.ESP07.build.spiffs_blocksize=4096 +#wifinfo.menu.ESPModule.ESP07.upload.maximum_size=958448 + +wifinfo.menu.ESPModule.ESP12=ESP12 (4M/1M SPIFFS) +wifinfo.menu.ESPModule.ESP12.build.board=ESP8266_ESP12 +wifinfo.menu.ESPModule.ESP12.build.flash_size=4M +wifinfo.menu.ESPModule.ESP12.build.flash_ld=eagle.flash.4m1m.ld +wifinfo.menu.ESPModule.ESP12.build.spiffs_start=0x300000 +wifinfo.menu.ESPModule.ESP12.build.spiffs_end=0x3FB000 +wifinfo.menu.ESPModule.ESP12.build.spiffs_blocksize=8192 +wifinfo.menu.ESPModule.ESP12.build.spiffs_pagesize=256 +wifinfo.menu.ESPModule.ESP12.upload.maximum_size=1044464 + +wifinfo.menu.UploadTool.esptool=Serial +wifinfo.menu.UploadTool.esptool.upload.tool=esptool +wifinfo.menu.UploadTool.esptool.upload.verbose=-vv +wifinfo.menu.UploadTool.espota=OTA +wifinfo.menu.UploadTool.espota.upload.tool=espota + +wifinfo.menu.CpuFrequency.80=80 MHz +wifinfo.menu.CpuFrequency.80.build.f_cpu=80000000L +wifinfo.menu.CpuFrequency.160=160 MHz +wifinfo.menu.CpuFrequency.160.build.f_cpu=160000000L + +wifinfo.menu.FlashFreq.40=40MHz +wifinfo.menu.FlashFreq.40.build.flash_freq=40 +wifinfo.menu.FlashFreq.80=80MHz +wifinfo.menu.FlashFreq.80.build.flash_freq=80 + +wifinfo.menu.FlashMode.dio=DIO +wifinfo.menu.FlashMode.dio.build.flash_mode=dio +wifinfo.menu.FlashMode.qio=QIO +wifinfo.menu.FlashMode.qio.build.flash_mode=qio + +wifinfo.menu.UploadSpeed.115200=115200 +wifinfo.menu.UploadSpeed.115200.upload.speed=115200 +wifinfo.menu.UploadSpeed.9600=9600 +wifinfo.menu.UploadSpeed.9600.upload.speed=9600 +wifinfo.menu.UploadSpeed.57600=57600 +wifinfo.menu.UploadSpeed.57600.upload.speed=57600 +wifinfo.menu.UploadSpeed.256000.windows=256000 +wifinfo.menu.UploadSpeed.256000.upload.speed=256000 +wifinfo.menu.UploadSpeed.230400.linux=230400 +wifinfo.menu.UploadSpeed.230400.macosx=230400 +wifinfo.menu.UploadSpeed.230400.upload.speed=230400 +wifinfo.menu.UploadSpeed.460800.linux=460800 +wifinfo.menu.UploadSpeed.460800.macosx=460800 +wifinfo.menu.UploadSpeed.460800.upload.speed=460800 +wifinfo.menu.UploadSpeed.512000.windows=512000 +wifinfo.menu.UploadSpeed.512000.upload.speed=512000 +wifinfo.menu.UploadSpeed.921600=921600 +wifinfo.menu.UploadSpeed.921600.upload.speed=921600 From 027b5aff1d4ab32cabe6224f0d8683f29511a3b9 Mon Sep 17 00:00:00 2001 From: Charles Date: Fri, 11 Dec 2015 18:41:58 +0100 Subject: [PATCH 11/20] Added WifInfo boards --- doc/boards.md | 7 +++++++ package/package_esp8266com_index.template.json | 3 +++ 2 files changed, 10 insertions(+) diff --git a/doc/boards.md b/doc/boards.md index 578ea319d..6d2e811b2 100644 --- a/doc/boards.md +++ b/doc/boards.md @@ -12,6 +12,7 @@ title: Supported Hardware * [SparkFun ESP8266 Thing](#sparkfun-esp8266-thing) * [SweetPea ESP\-210](#sweetpea-esp-210) * [ESPino](#espino) + * [WifInfo](#WifInfo) * [Generic ESP8266 modules](#generic-esp8266-modules) * [Serial Adapter](#serial-adapter) * [Minimal Hardware Setup for Bootloading and Usage](#minimal-hardware-setup-for-bootloading-and-usage) @@ -100,6 +101,12 @@ For more information about the hardware, pinout diagram and programming procedur Product page: http://www.espino.io/en +## WifInfo + +WifInfo integrates the ESP-12 or ESP-07+Ext antenna module with a 3.3v regulator and the hardware to be able to measure French telemetry issue from ERDF powering meter serial output. It has a USB connector for powering, an RGB WS2812 Led, 4 pins I2C connector to fit OLED or sensor, and two buttons + FTDI connector and auto reset feature. + +For more information, please see WifInfo related [blog](http://hallard.me/category/wifinfo/) entries, [github](https://github.com/hallard/WifInfo) and [community](https://community.hallard.me/category/16/wifinfo) forum. + ## Generic ESP8266 modules These modules come in different form factors and pinouts. See the page at ESP8266 community wiki for more info: diff --git a/package/package_esp8266com_index.template.json b/package/package_esp8266com_index.template.json index d070d4809..eaa364e77 100644 --- a/package/package_esp8266com_index.template.json +++ b/package/package_esp8266com_index.template.json @@ -51,6 +51,9 @@ }, { "name": "ESPino" + }, + { + "name": "WifInfo" } ], "toolsDependencies": [ From c1e60ab3c1a0e082e6be63685b36702c163b09db Mon Sep 17 00:00:00 2001 From: Ivan Kravets Date: Sat, 12 Dec 2015 13:45:32 +0200 Subject: [PATCH 12/20] Add explanation about @PlatformIO, how does it work --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 987c7f6f2..89cc420bd 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ python get.py ### Using PlatformIO -[PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies and support for Espressif platform. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). +[PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies and support for Espressif platform. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). More details in documentation [What is PlatformIO? How does it work?](http://docs.platformio.org/en/latest/faq.html#general). - Install [PlatformIO](http://platformio.org) - Initialise new project From 124855945c87f8be617dbeb268a934288d879bb3 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 13 Dec 2015 00:16:01 +0300 Subject: [PATCH 13/20] Move PlatformIO instructions to a separate file --- README.md | 61 +++-------------------------------------------- doc/platformio.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 58 deletions(-) create mode 100644 doc/platformio.md diff --git a/README.md b/README.md index 89cc420bd..0b0193cf1 100644 --- a/README.md +++ b/README.md @@ -48,66 +48,11 @@ python get.py ``` - Restart Arduino -### Using PlatformIO +### Using stable version with PlatformIO -[PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies and support for Espressif platform. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). More details in documentation [What is PlatformIO? How does it work?](http://docs.platformio.org/en/latest/faq.html#general). +[PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). More details in documentation [What is PlatformIO? How does it work?](http://docs.platformio.org/en/latest/faq.html#general). -- Install [PlatformIO](http://platformio.org) -- Initialise new project -```bash -# -# Create empty directory -# -mkdir myproject -cd myproject - -# -# Find type of supported boards -# -platformio boards espressif - -# Platform: espressif -# -------------------------------------------------------------------------------------------------------- -# Type MCU Frequency Flash RAM Name -# -------------------------------------------------------------------------------------------------------- -# esp01 esp8266 80Mhz 512Kb 32Kb Espressif ESP8266 ESP-01 board -# esp01_1m esp8266 80Mhz 1024Kb 32Kb Espressif ESP8266 ESP-01-1MB board -# esp12e esp8266 80Mhz 4096Kb 32Kb Espressif ESP8266 ESP-12E board (NodeMCU) -# ... - -# -# Initialise base project -# -platformio init --board %TYPE%(see above) - -# The next files/directories will be created in myproject -# platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| -# src - Put your source files here -# lib - Put here project specific (private) libraries -# Do you want to continue? [y/N]: Y -``` -- Place your source code to `src` directory -- Build/Upload project -``` -# process/build project -platformio run - -# build+upload firmware -platformio run --target upload - -# build+upload firmware via OTA -platformio run --target upload --upload-port IP_ADDRESS_HERE -``` - -### IDE Integration -In addition, PlatformIO [can be integrated into the popular IDEs](http://docs.platformio.org/en/latest/ide.html). For example, initialise project for Espressif ESP8266 ESP-01 board and Eclipse IDE -``` -platformio init --board esp01 --ide eclipse -``` -Then [import project](http://docs.platformio.org/en/latest/ide/eclipse.html) using `Eclipse Menu: File > Import... > General > Existing Projects into Workspace`. - -### Demo of OTA firmware uploading -[![PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01](http://img.youtube.com/vi/W8wWjvQ8ZQs/0.jpg)](http://www.youtube.com/watch?v=W8wWjvQ8ZQs "PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01") +See [detailed instructions on how to use Espressif platform with PlatformIO](docs/platformio.md). ### Documentation diff --git a/doc/platformio.md b/doc/platformio.md new file mode 100644 index 000000000..a03500bb3 --- /dev/null +++ b/doc/platformio.md @@ -0,0 +1,61 @@ +## Using PlatformIO + +- Install [PlatformIO](http://platformio.org) +- Initialise new project + +```bash +# +# Create empty directory +# +mkdir myproject +cd myproject + +# +# Find type of supported boards +# +platformio boards espressif + +# Platform: espressif +# -------------------------------------------------------------------------------------------------------- +# Type MCU Frequency Flash RAM Name +# -------------------------------------------------------------------------------------------------------- +# esp01 esp8266 80Mhz 512Kb 32Kb Espressif ESP8266 ESP-01 board +# esp01_1m esp8266 80Mhz 1024Kb 32Kb Espressif ESP8266 ESP-01-1MB board +# esp12e esp8266 80Mhz 4096Kb 32Kb Espressif ESP8266 ESP-12E board (NodeMCU) +# ... + +# +# Initialise base project +# +platformio init --board %TYPE%(see above) + +# The next files/directories will be created in myproject +# platformio.ini - Project Configuration File. |-> PLEASE EDIT ME <-| +# src - Put your source files here +# lib - Put here project specific (private) libraries +# Do you want to continue? [y/N]: Y +``` + +- Place your source code to `src` directory +- Build/Upload project + +``` +# process/build project +platformio run + +# build+upload firmware +platformio run --target upload + +# build+upload firmware via OTA +platformio run --target upload --upload-port IP_ADDRESS_HERE +``` + +## IDE Integration +In addition, PlatformIO [can be integrated into the popular IDEs](http://docs.platformio.org/en/latest/ide.html). For example, initialise project for Espressif ESP8266 ESP-01 board and Eclipse IDE +``` +platformio init --board esp01 --ide eclipse +``` +Then [import project](http://docs.platformio.org/en/latest/ide/eclipse.html) using `Eclipse Menu: File > Import... > General > Existing Projects into Workspace`. + +## Demo of OTA firmware uploading +[![PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01](http://img.youtube.com/vi/W8wWjvQ8ZQs/0.jpg)](http://www.youtube.com/watch?v=W8wWjvQ8ZQs "PlatformIO and OTA firmware uploading to Espressif ESP8266 ESP-01") From 7cb2cb5f8d6cce7babab606bb0c27674e461c3b7 Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Sun, 13 Dec 2015 00:17:30 +0300 Subject: [PATCH 14/20] Fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0b0193cf1..a78c655fe 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ python get.py [PlatformIO](http://platformio.org) is a cross-platform code-builder and library manager for embedded development with no external dependencies. Works on the popular host OS: Mac OS X, Windows, Linux 32/64, Linux ARM (like Raspberry Pi, BeagleBone, CubieBoard). More details in documentation [What is PlatformIO? How does it work?](http://docs.platformio.org/en/latest/faq.html#general). -See [detailed instructions on how to use Espressif platform with PlatformIO](docs/platformio.md). +See [detailed instructions on how to use Espressif platform with PlatformIO](doc/platformio.md). ### Documentation From 4dd5d8cf7d6198752acc56d0f5590a5873874d16 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Sun, 13 Dec 2015 23:04:27 +0100 Subject: [PATCH 15/20] allow control of restart on http update #1202 --- .../ESP8266httpUpdate/src/ESP8266httpUpdate.cpp | 16 ++++++++-------- .../ESP8266httpUpdate/src/ESP8266httpUpdate.h | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp index 785258de9..2eacf09db 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.cpp @@ -42,10 +42,10 @@ ESP8266HTTPUpdate::~ESP8266HTTPUpdate(void) { * @param httpsFingerprint const char * * @return t_httpUpdate_return */ -t_httpUpdate_return ESP8266HTTPUpdate::update(const char * url, const char * current_version, const char * httpsFingerprint) { +t_httpUpdate_return ESP8266HTTPUpdate::update(const char * url, const char * current_version, const char * httpsFingerprint, bool reboot) { HTTPClient http; http.begin(url, httpsFingerprint); - return handleUpdate(&http, current_version); + return handleUpdate(&http, current_version, reboot, false); } /** @@ -55,10 +55,10 @@ t_httpUpdate_return ESP8266HTTPUpdate::update(const char * url, const char * cur * @param httpsFingerprint const char * * @return t_httpUpdate_return */ -t_httpUpdate_return ESP8266HTTPUpdate::updateSpiffs(const char * url, const char * current_version, const char * httpsFingerprint) { +t_httpUpdate_return ESP8266HTTPUpdate::updateSpiffs(const char * url, const char * current_version, const char * httpsFingerprint, bool reboot) { HTTPClient http; http.begin(url, httpsFingerprint); - return handleUpdate(&http, current_version, false, true); + return handleUpdate(&http, current_version, reboot, true); } /** @@ -70,16 +70,16 @@ t_httpUpdate_return ESP8266HTTPUpdate::updateSpiffs(const char * url, const char * @param httpsFingerprint const char * * @return */ -t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version, bool https, const char * httpsFingerprint) { +t_httpUpdate_return ESP8266HTTPUpdate::update(const char * host, uint16_t port, const char * url, const char * current_version, bool https, const char * httpsFingerprint, bool reboot) { HTTPClient http; http.begin(host, port, url, https, httpsFingerprint); - return handleUpdate(&http, current_version); + return handleUpdate(&http, current_version, reboot, false); } -t_httpUpdate_return ESP8266HTTPUpdate::update(String host, uint16_t port, String url, String current_version, bool https, String httpsFingerprint) { +t_httpUpdate_return ESP8266HTTPUpdate::update(String host, uint16_t port, String url, String current_version, bool https, String httpsFingerprint, bool reboot) { HTTPClient http; http.begin(host, port, url, https, httpsFingerprint); - return handleUpdate(&http, current_version.c_str()); + return handleUpdate(&http, current_version.c_str(), reboot, false); } /** diff --git a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h index d3fe4ca19..6a13f9ce3 100644 --- a/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h +++ b/libraries/ESP8266httpUpdate/src/ESP8266httpUpdate.h @@ -49,11 +49,11 @@ class ESP8266HTTPUpdate { ESP8266HTTPUpdate(void); ~ESP8266HTTPUpdate(void); - t_httpUpdate_return update(const char * url, const char * current_version = "", const char * httpsFingerprint = ""); - t_httpUpdate_return update(const char * host, uint16_t port, const char * url = "/", const char * current_version = "", bool https = false, const char * httpsFingerprint = ""); - t_httpUpdate_return update(String host, uint16_t port, String url = "/", String current_version = "", bool https = false, String httpsFingerprint = ""); + t_httpUpdate_return update(const char * url, const char * current_version = "", const char * httpsFingerprint = "", bool reboot = true); + t_httpUpdate_return update(const char * host, uint16_t port, const char * url = "/", const char * current_version = "", bool https = false, const char * httpsFingerprint = "", bool reboot = true); + t_httpUpdate_return update(String host, uint16_t port, String url = "/", String current_version = "", bool https = false, String httpsFingerprint = "", bool reboot = true); - t_httpUpdate_return updateSpiffs(const char * url, const char * current_version = "", const char * httpsFingerprint = ""); + t_httpUpdate_return updateSpiffs(const char * url, const char * current_version = "", const char * httpsFingerprint = "", bool reboot = false); protected: t_httpUpdate_return handleUpdate(HTTPClient * http, const char * current_version, bool reboot = true, bool spiffs = false); From afbc049cc91e91bbd8f50586fdfb3ce874d3f91e Mon Sep 17 00:00:00 2001 From: Christopher Pascoe Date: Wed, 9 Dec 2015 22:51:57 -0800 Subject: [PATCH 16/20] Make the circular buffer's _size and _bufend members immutable. --- cores/esp8266/cbuf.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cores/esp8266/cbuf.h b/cores/esp8266/cbuf.h index 087e7200b..02b612c5c 100644 --- a/cores/esp8266/cbuf.h +++ b/cores/esp8266/cbuf.h @@ -113,9 +113,9 @@ class cbuf { return (ptr == _bufend) ? _buf : ptr; } - size_t _size; + const size_t _size; char* _buf; - char* _bufend; + const char* const _bufend; char* _begin; char* _end; }; From 55e0dab799653d7e16f262e3693195570e068854 Mon Sep 17 00:00:00 2001 From: Christopher Pascoe Date: Sun, 13 Dec 2015 19:39:47 -0800 Subject: [PATCH 17/20] Protect HardwareSerial's cbuf usage with InterruptLock. --- cores/esp8266/HardwareSerial.cpp | 40 +++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/cores/esp8266/HardwareSerial.cpp b/cores/esp8266/HardwareSerial.cpp index 78108bee7..3527b4a86 100644 --- a/cores/esp8266/HardwareSerial.cpp +++ b/cores/esp8266/HardwareSerial.cpp @@ -29,6 +29,7 @@ #include #include "Arduino.h" #include "cbuf.h" +#include "interrupts.h" extern "C" { #include "osapi.h" @@ -556,6 +557,7 @@ int HardwareSerial::available(void) { int result = 0; if (_uart != NULL && _uart->rxEnabled) { + InterruptLock il; result = static_cast(_rx_buffer->getSize()); } @@ -570,6 +572,7 @@ int HardwareSerial::peek(void) { if(_uart == 0) return -1; if(_uart->rxEnabled) { + InterruptLock il; return _rx_buffer->peek(); } else { return -1; @@ -580,6 +583,7 @@ int HardwareSerial::read(void) { if(_uart == 0) return -1; if(_uart->rxEnabled) { + InterruptLock il; return _rx_buffer->read(); } else { return -1; @@ -590,6 +594,7 @@ int HardwareSerial::availableForWrite(void) { if(_uart == 0) return 0; if(_uart->txEnabled) { + InterruptLock il; return static_cast(_tx_buffer->room()); } else { return 0; @@ -604,9 +609,16 @@ void HardwareSerial::flush() { if(!_written) return; - while(_tx_buffer->getSize() || uart_get_tx_fifo_room(_uart) < UART_TX_FIFO_SIZE) + while(true) { + { + InterruptLock il; + if(_tx_buffer->getSize() == 0 && + uart_get_tx_fifo_room(_uart) >= UART_TX_FIFO_SIZE) { + break; + } + } yield(); - + } _written = false; } @@ -614,18 +626,24 @@ size_t HardwareSerial::write(uint8_t c) { if(_uart == 0 || !_uart->txEnabled) return 0; _written = true; - size_t room = uart_get_tx_fifo_room(_uart); - if(room > 0 && _tx_buffer->empty()) { - uart_transmit_char(_uart, c); - return 1; - } - while(_tx_buffer->room() == 0) { + while(true) { + { + InterruptLock il; + if(_tx_buffer->empty()) { + if(uart_get_tx_fifo_room(_uart) > 0) { + uart_transmit_char(_uart, c); + } else { + _tx_buffer->write(c); + uart_arm_tx_interrupt(_uart); + } + break; + } else if(_tx_buffer->write(c)) { + break; + } + } yield(); } - - _tx_buffer->write(c); - uart_arm_tx_interrupt(_uart); return 1; } From c97e408bd196456b70da35cdb2029c22db19a6f7 Mon Sep 17 00:00:00 2001 From: Markus Sattler Date: Mon, 14 Dec 2015 09:31:50 +0100 Subject: [PATCH 18/20] change Adafruit Huzzah upload method to nodemcu see #1212 --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 64c518e53..5edaecb77 100644 --- a/boards.txt +++ b/boards.txt @@ -185,7 +185,7 @@ huzzah.name=Adafruit HUZZAH ESP8266 huzzah.upload.tool=esptool huzzah.upload.speed=115200 -huzzah.upload.resetmethod=ck +huzzah.upload.resetmethod=nodemcu huzzah.upload.maximum_size=1044464 huzzah.upload.maximum_data_size=81920 huzzah.upload.wait_for_upload_port=true From 2f75f0b3c4c44b32b0718bea52d6d0ecadaffea6 Mon Sep 17 00:00:00 2001 From: krzychb Date: Tue, 15 Dec 2015 05:48:43 +0100 Subject: [PATCH 19/20] Troublehooting of OTA from IDE Update ota_updates.md Update ota_updates.md --- doc/ota_updates/ota-ide-network-terminal.png | Bin 0 -> 18013 bytes doc/ota_updates/ota_updates.md | 73 ++++++++++++++++--- doc/ota_updates/termite-configuration.png | Bin 0 -> 31771 bytes 3 files changed, 63 insertions(+), 10 deletions(-) create mode 100644 doc/ota_updates/ota-ide-network-terminal.png create mode 100644 doc/ota_updates/termite-configuration.png diff --git a/doc/ota_updates/ota-ide-network-terminal.png b/doc/ota_updates/ota-ide-network-terminal.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9bd47f406662dab5e0cb6b25c45c5ee17f0d0e GIT binary patch literal 18013 zcmY&=bzD>N*T0lVC`gLZH9!yqgo&fOHd=;+2sjWyC*?#s2S~SLbShoaN=UkqqNI!% zA>j}asozDv-{*OLe~g#gz4sI6bK?Cz=UmZ7Q0JT7&Ryy{`;hfMDRDe^ zPLrgop=$Qrb~Edsk*mjRdz)v+_9U>8sVd{L8im>e#t_EZ>Q@feFlod<3_A!}W1EV0 za3BcEou{n+k-mq0RsA7db&QosjVY5_7DnGm&!o0Xuj5_Blla#BNx+*IKHFt;v&Hx( z?dE2MmdQUQ+of9-6=ho$ao%3pN`8LIrwJQ}Yy0GJM|?d|9p*QsDDB$tI$%{N4g7tD z=R5cA)Pl;;3`K;3gR;l)F5z5y*Y`JzDmXe0&8re=2hT4xv6o^bO}G@z_M0g22iw9! zrNJa8+Z?|hPVZX37wPz-x(i}F>4iHlg{aLRS`16BY)Xer)o~RyeyD4szA9tx6p*1v zWjeKVTX{ZBHQQ&~wVOrAFnHO^z+B0r zW4^ia^e3V{W-#vMaQyzgnjw$6+Y$GWg5-WjZOR9wzMEf=+iKv;?%xkbd0N`3I~M-5 z?@BNcm5=k&R<;e&SKH-%V-Il+Tw8eCuj@+f4+W}q$<{V&KFl^KtT?=xTC~_9{fY6C zXmTpVeY!rmGE+zXwsiU9a^eK`T52W9y2HTUxz>%&R;)zNgm?) zRvl%qgEF!mv}i$_wQrOvO`5j3=e(Fx+4Srx+uPE5B!9X;2w||6Oc!|C-qkCwkuIHA%1*C5 z+Shl!bVU6AFj=%bv)$=DNX8%IJ)S}{g z@Gba99T$s188%_&?zQC%+N4~%8ryU#ahzqQB%QsUMYHQmg-_L&D&t%7jv4$tqJ>}0u+3nHV6ZAM1-4qYP<(klvGykDHfuK_`9X}**t3qU8BJuf3iE1H z-9Ehu8t8Z%n&a4UMHvq>=Bd~VDLv@i=9}+3w;dpSVH^FX!u?K zl|5kEvX!BLA{Xru?t7t*5zxi#(;HzDAf-d^qm%yRHZ1A(zPp-I5-KF^ zp$aQVJv0gM|?y|`$hF7-C_M|tQsc9QaGMK?-CuX!i@UJ zWP{1QkUVgWviVCAU2>{w4r)nvlTyp{H6N)pbn3UsqupxHp?PB$?VflerthuiCl<`oXKVYUMMSy|4jaB)R`w!#Q|k;fyI&Zle`em_s4qu z2Ci?J2KfS2K~J*A^e0uAi^4FycSjClcJHJigpIiU7ET>sAj#L0f>qQD?lRG+`|(C6 z2_+0N`#FvxR^lOwd8ci!-pkoy0#CF~%#9J(k-=g}a(J=D&eL)h&}3V@19M3SzMIB9 z;M?JrjL(S+4%Bh1Cgp2O zLw@Gj1=5m-omRF9mN$)I&v4R|hswTxb!<>0o;I`x4uWZ5olp;_4_?+Btv&fJ$qq^> zEd>V&8)|(nW{pRPK~oVPK_&rsBW!#g#u97QEM^!Ui@Y^KXiZ7&N;%QJcN9`wTNlC_ z$-wsR^yJXSj(oIk6P{_<17|DL@+BA)mPX4YfNn8~go>835jC_TP58s$^dpJlGN_fV zYK~IbN~<~uJJG!ENNfrh&1`hSNUS&eNMrWVwUnE=#P&$p>7t~;I!hpna97QE0S6s( zUcse4e2CO7mq(puPBbN^NqKKsg=H>uI$B-)YN1~X#RwXzis5U(uHmj8sKh>J>|jFo zQvVn^VnmvExwi`JA&rz{Ey<=sTF@ltn=$H}(I$7(=wyl;iQ+Gh-?+cj$%u+A^5#~b z#1{%el^^R9Gt)pws;pvgW!G)n$fV`9N>=MTwiGRz)uukRv`GH!7Y7 z#Zh!+^vS0g$HJ3II6U}vaYbpT^1i4>} zVm70b38NAV6D>_bz~gTXe{d6psU^zkRHkc&^JCK71EM#HoNIPYXi5%W!+7=s3{J>W5$|4zpvAm zgfo_eeZwCP((-Hn1Dvu=BY$NJc0p5di_W_{CN%Vn};d-nim+3}SX>24+jj}SI|sL~lz zk_swV>!DetoJ{CUj+Z67RdB{pt08-RwN@C_#3pfFJ=@1e@Pg$*X~Iu6tRdyV zv`(&t9?Nd1WloTFPV%K7(pV#7aT=&TEnq5jN?HRe2vhj%ur`%U>UKt_fwG9=Fi|7x zJEbb7s260$%2Yw-n%O70?CZ=P#zuD61@LA$r4VJU`_~>{bL=K`D^;Hwg`35CRe`C+ zV1}5@!K6P2w5XF6`Hp^3eVLz&S8hFqVO*O*IN^kcv<)K#G|d8rInhal8G~c`ChBs} zg3^T5FP7>ve_O~26f?}Lm!jLLg54gVCy0k~yh|MAgDDs9eH`;%)a8sv+%OWGobddi zo-=7=qvps_AnMfr8y6%v*y+ftEBfh?J=@4~;a6+g+6l!WF?+W03#L-!_p@TmBFl$E zza+ayn#MscyA=`WNf5~dL<-mxr3cqD;ULAkVQe+U@fPHJ2fo2zub^-*j|5>#)Qy2Y zN)!-mk6=6~lj&MWuNu~K_B<-w7h6v%@DD``!1(yq-<0Ly zcj`(QMfMs^u;NBr(Qph^|5FLRd?=3_33A=^#K`ob;WEvr!c9hE@bKYm52OhP&nw3Z}8i zbe-9|MR?5Sr02pkzECt8%1L38IXKHY9%M`7oDuQ4Be5Yu%EI zyI3%cNgH8+BCnP#HN}Q&S8fc6kZ#Z=fBy8j zl5Lfr$ytS#g@Hj8>;ENn%JFxw8diXf5R}V{(_h7KsK*rUzQQ9U@!zkWJNeUB!4;lO zw_}XZ;v42IwN@KPxR4tzuL-FgS0sbz%<{$79jmJ$g;%CiK=CyO348Xf;O&4uzk@yb zYiQ==uzsTeSe5Ml=JZ{)I0YI7@68Lck-I^>(DjW+J^j>tDZ<*Xuivd0(n{ z4bn4Z;i)F+2IW#Tr_$t8mz)!mok`b3OfV+t0Nzt!N5q2!w!IR?nNe&k=VRRP9eM&GG5;paz+|^Q88zfj?D-g}qk_c@I7o>6dND$Wr zh>b~#uvb->?2nu{;UN{iPfmiL-aGv~c($&>XUtIUb9)(id)bR>IY7wk+@h{kJmPte z<;|Zgj-?koGWdrK0K6T2At@}Qe}s7nE;MA8S{~Z(+_@ybuVKV(P8tuLl;Hgoea`En z*D8S$Kw{!B4zCv|VFF~*G#1hZ7C;pdhOi|D_pc0Y2Lo3PZE zwA`P6>&S?Ut}Y&Ad&49(nWZE~2^DERz^sGRGXr4Ew+-Gt=7Wgik#?FJ`ccV+8hS}1 z1^rKL0)?TXFu3+BGi*HJ*XFdx&cQG0&Pn6ZpJja0iI5*YYLne)-Kc~GU4Q6lMdHK8 zC61FcK!}55bV-+MDCM1;39TQPqfOI_7(q79Krr(9JYfvblStD6nbegU>& <49XA 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 W@**}%C0dLC0000 Examples > ESP8266mDNS + - Start Arduino IDE and load sketch DNS_SD_Arduino_OTA.ino available under File > Examples > ESP8266mDNS ![OTA sketch selection](ota-ide-sketch-selection.png) **Note:** This sketch is available only for 1.6.5-947-g39819f0 (of July 23, 2015) and 1.6.5-1160-gef26c5f (of Sep 30, 2015) versions of platform packages installed in Arduino IDE using https://github.com/esp8266/Arduino#installing-with-boards-manager. It was removed in [#980](https://github.com/esp8266/Arduino/pull/980) from GitHub repository. - - Update SSID and password in the sketch so the module can join your Wi-Fi network + - Update SSID and password in the sketch so the module can join your Wi-Fi network ![ssid and pass entry](ota-ide-ssid-pass-entry.png) - Configure upload parameters as below (you may need to adjust configuration if you are using a different module): ![configuration of serial upload](ota-ide-serial-upload-configuration.png) @@ -155,6 +157,57 @@ Instructions below demonstrate how to configure both [Classic OTA](#classic-ota- **Note:** To be able to upload your sketch over and over again using OTA, you need to embed OTA routines inside. Please use DNS_SD_Arduino_OTA.ino as an example. +#### Troubleshooting + +If OTA update fails, first step is to check for error messages that may be shown in upload window of Arduino IDE. If this is not providing any useful hints try to upload again while checking what is shown by ESP on serial port. Serial Monitor from IDE will not be useful in that case. When attempting to open it, you will likely see the following: + +![Arduino IDE network terminal window](ota-ide-network-terminal.png) + +This window is for Arduino Yún and not yet implemented for esp8266/Arduino. It shows up because IDE is attempting to open Serial Monitor using network port you have selected for OTA upload. + +Instead you need an external serial monitor. If you are a Windows user check out [Termite](http://www.compuphase.com/software_termite.htm). This is handy, slick and simple RS232 terminal that does not impose RTS or DTR flow control. Such flow control may cause issues if you are using respective lines to toggle GPIO0 and RESET pins on ESP for upload. + +Select COM port and baud rate on external terminal program as if you were using Arduino Serial Monitor. Please see typical settings for [Termite](http://www.compuphase.com/software_termite.htm) below: + +![Termite settings](termite-configuration.png) + +Then run OTA from IDE and look what is displayed on terminal. Successful OTA process looks like below (sketch and free memory sizes as well as IP addresses depend on your particular s/w and h/w configuration): + +``` +Arduino OTA Test +Sketch size: 346664 +Free size: 700416 +IP address: 192.168.1.100 +Update Start: ip:192.168.1.10, port:48266, size:346672 +Update Success: 6113 +Rebooting... + + ets Jan 8 2013,rst cause:1, boot mode:(3,7) + +load 0x4010f000, len 1264, room 16 +tail 0 +chksum 0x42 +csum 0x42 +@cp:0 +ld + +Arduino OTA Test +Sketch size: 346664 +Free size: 700416 +IP address: 192.168.1.100 +``` + +If upload fails you will likely see errors caught by the uploader, exception and the stack dump, or both. + +The most common causes of OTA failure are as follows: +* not enough physical memory on the chip (e.g. ESP01 with 512K flash memory is not enough for OTA), +* too much memory declared for SPIFFS so new sketch will not fit between existing sketch and SPIFFS – see [Update process - memory view]( https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/ota_updates.md#update-process---memory-view), +* too little memory declared in Arduino IDE for your selected board (i.e. less than physical size). + +For more details regarding flash memory layout please check [File system]( https://github.com/esp8266/Arduino/blob/master/doc/filesystem.md). +For overview where new sketch is stored, how it is copied and how memory is organized for the purpose of OTA see [Update process - memory view]( https://github.com/esp8266/Arduino/blob/master/doc/ota_updates/ota_updates.md#update-process---memory-view). + + #### ArduinoOTA 1. Upload and install the following software: @@ -183,7 +236,7 @@ Updates described in this chapter are done with a web browser that can be useful ### Implementation Overview -Updates with a web browswer are implemented using ```ESP8266HTTPUpdateServer``` class together with ```ESP8266WebServer``` and ```ESP8266mDNS``` classes. The following code is required to get it work: +Updates with a web browser are implemented using ```ESP8266HTTPUpdateServer``` class together with ```ESP8266WebServer``` and ```ESP8266mDNS``` classes. The following code is required to get it work: setup() @@ -222,10 +275,10 @@ You can use another module if it meets “Flash chip size is 2x the size of the 2. Prepare the sketch and configuration for initial upload with a serial port. - Start Arduino IDE and load sketch WebUpdater.ino available under File > Examples > ESP8266HTTPUpdateServer. - - Update ssid and pass in the sketch so the module can join your Wi-Fi network. + - Update SSID and password in the sketch so the module can join your Wi-Fi network. - Open File > Preferences, look for “Show verbose output during:” and check out “compilation” option. - ![Preferences - enablig verbose output during compilation](ota-web-show-verbose-compilation.png) + ![Preferences - enabling verbose output during compilation](ota-web-show-verbose-compilation.png) **Note:** This setting will be required in step 5 below. You can uncheck this setting afterwards. @@ -315,7 +368,7 @@ For the simple updater the server only needs to deliver the binary file for upda ##### Advanced updater For advanced update management a script needs to run at the server side, for example a PHP script. -At every update request the the ESP sends some information in HTTP headers to the server. +At every update request the ESP sends some information in HTTP headers to the server. Example header data: ``` @@ -329,7 +382,7 @@ Example header data: [HTTP_X_ESP8266_VERSION] => DOOR-7-g14f53a19 ``` -With this information the script now can check if a update is needed. It is also possible to deliver different binaries based on the MAC address for example. +With this information the script now can check if an update is needed. It is also possible to deliver different binaries based on the MAC address for example. Script example: diff --git a/doc/ota_updates/termite-configuration.png b/doc/ota_updates/termite-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..faa885fd18a66659fbc9d5832119d4eee55b1767 GIT binary patch literal 31771 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 Cabjiw literal 0 HcmV?d00001 From 3a16bed4c2cd88d15521474ccde0f4752e58eb31 Mon Sep 17 00:00:00 2001 From: Albert Chaharbakhshi Date: Tue, 15 Dec 2015 11:46:17 -0600 Subject: [PATCH 20/20] Modify boards.txt for Sparkfun Thing Dev The Sparkfun ESP8266 Thing Dev board currently has the "upload.resetmethod" set to "ck" which is invalid for the hardware, which uses the "nodemcu" reset circuitry. You can compare the reset circuits here: https://cdn.sparkfun.com/datasheets/Wireless/WiFi/ESP8266-Thing-Dev-v10.pdf and https://raw.githubusercontent.com/nodemcu/nodemcu-devkit/master/Documents/NODEMCU_DEVKIT_SCH.png Without this change, the Thing Dev board will not program correctly unless it is power cycled with GPIO0 held to ground. After this change, the board resets, programs, and runs correctly, without any manual jumper or reset operations. --- boards.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/boards.txt b/boards.txt index 5edaecb77..62dd146e9 100644 --- a/boards.txt +++ b/boards.txt @@ -433,7 +433,7 @@ thing.name=SparkFun ESP8266 Thing thing.upload.tool=esptool thing.upload.speed=921600 -thing.upload.resetmethod=ck +thing.upload.resetmethod=nodemcu thing.upload.maximum_size=434160 thing.upload.maximum_data_size=81920 thing.upload.wait_for_upload_port=true