diff --git a/.gitignore b/.gitignore index 4400c7eb4..44f4cda8b 100644 --- a/.gitignore +++ b/.gitignore @@ -58,3 +58,5 @@ avr-toolchain-*.zip /hardware/tools/listComPorts.exe build/macosx/esptool-*-osx.zip + +build/macosx/dist/osx-xtensa-lx106-elf.tgz diff --git a/boards.txt b/boards.txt index 4190e6483..4d6c41515 100644 --- a/boards.txt +++ b/boards.txt @@ -1,6 +1,8 @@ menu.UploadSpeed=Upload Speed menu.CpuFrequency=CPU Frequency -menu.FlashSize=Flash size +menu.FlashSize=Flash Size +menu.FlashFreq=Flash Frequency +menu.FlashMode=Flash Mode ############################################################## generic.name=Generic ESP8266 Module @@ -21,6 +23,7 @@ generic.build.variant=generic generic.build.flash_mode=qio generic.build.flash_size=512K generic.build.flash_freq=40 +generic.build.flash_ld=eagle.flash.512k.ld generic.menu.CpuFrequency.80=80 MHz generic.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -48,14 +51,37 @@ generic.menu.UploadSpeed.921600.upload.speed=921600 generic.menu.FlashSize.512K=512K generic.menu.FlashSize.512K.build.flash_size=512K +generic.menu.FlashSize.512K.build.flash_ld=eagle.flash.512k.ld generic.menu.FlashSize.256K=256K generic.menu.FlashSize.256K.build.flash_size=256K +generic.menu.FlashSize.256K.build.flash_ld=eagle.flash.256k.ld generic.menu.FlashSize.1M=1M generic.menu.FlashSize.1M.build.flash_size=1M +generic.menu.FlashSize.1M.build.flash_ld=eagle.flash.1m.ld generic.menu.FlashSize.2M=2M generic.menu.FlashSize.2M.build.flash_size=2M +generic.menu.FlashSize.2M.build.flash_ld=eagle.flash.2m.ld generic.menu.FlashSize.4M=4M generic.menu.FlashSize.4M.build.flash_size=4M +generic.menu.FlashSize.4M.build.flash_ld=eagle.flash.4m.ld + +generic.menu.FlashFreq.40=40MHz +generic.menu.FlashFreq.40.build.flash_freq=40 +generic.menu.FlashFreq.20=20MHz +generic.menu.FlashFreq.20.build.flash_freq=20 +generic.menu.FlashFreq.26=26.7MHz +generic.menu.FlashFreq.26.build.flash_freq=26.7 +generic.menu.FlashFreq.80=80MHz +generic.menu.FlashFreq.80.build.flash_freq=80 + +generic.menu.FlashMode.qio=QIO +generic.menu.FlashMode.qio.build.flash_mode=qio +generic.menu.FlashMode.qout=QOUT +generic.menu.FlashMode.qout.build.flash_mode=qout +generic.menu.FlashMode.dio=DIO +generic.menu.FlashMode.dio.build.flash_mode=dio +generic.menu.FlashMode.dout=DOUT +generic.menu.FlashMode.dout.build.flash_mode=dout ############################################################## modwifi.name=Olimex MOD-WIFI-ESP8266(-DEV) @@ -77,6 +103,7 @@ modwifi.build.variant=generic modwifi.build.flash_mode=qio modwifi.build.flash_size=2M modwifi.build.flash_freq=40 +modwifi.build.flash_ld=eagle.flash.2m.ld modwifi.menu.CpuFrequency.80=80 MHz modwifi.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -122,6 +149,7 @@ nodemcu.build.variant=nodemcu nodemcu.build.flash_mode=qio nodemcu.build.flash_size=4M nodemcu.build.flash_freq=40 +nodemcu.build.flash_ld=eagle.flash.4m.ld nodemcu.menu.CpuFrequency.80=80 MHz nodemcu.menu.CpuFrequency.80.build.f_cpu=80000000L @@ -168,6 +196,7 @@ nodemcu.menu.FlashSize.4M.build.flash_size=4M # wifio.build.flash_mode=qio # wifio.build.flash_size=512K # wifio.build.flash_freq=40 +# wifio.build.flash_ld=eagle.flash.512k.ld # # wifio.menu.CpuFrequency.80=80MHz # wifio.menu.CpuFrequency.80.build.f_cpu=80000000L diff --git a/cores/esp8266/Arduino.h b/cores/esp8266/Arduino.h index bd5f79625..1170b6f4a 100644 --- a/cores/esp8266/Arduino.h +++ b/cores/esp8266/Arduino.h @@ -38,7 +38,7 @@ extern "C" { #include "pgmspace.h" #include "esp8266_peri.h" #include "twi.h" -#include "spiffs/spiffs.h" + //#include "spiffs/spiffs.h" void yield(void); diff --git a/cores/esp8266/FileSystem.cpp b/cores/esp8266/FileSystem.cpp index f2517cf98..ce722e7ec 100755 --- a/cores/esp8266/FileSystem.cpp +++ b/cores/esp8266/FileSystem.cpp @@ -162,7 +162,8 @@ int FSFile::available() { size_t FSFile::write(const uint8_t *buf, size_t size){ if (! _file) return 0; - return SPIFFS_write(&_filesystemStorageHandle, _file, (uint8_t *)buf, size); + int res = SPIFFS_write(&_filesystemStorageHandle, _file, (uint8_t *)buf, size); + return (res > 0)?(size_t)res:0; } size_t FSFile::write(uint8_t val) { diff --git a/cores/esp8266/FileSystem.h b/cores/esp8266/FileSystem.h index d675da114..460595cf3 100755 --- a/cores/esp8266/FileSystem.h +++ b/cores/esp8266/FileSystem.h @@ -61,13 +61,15 @@ public: size_t bytesWritten = 0; while (true){ size_t available = src.available(); + if(!available) + return bytesWritten; size_t willWrite = (available < bufferSize) ? available : bufferSize; src.read(obuf, willWrite); size_t cb = write(obuf, willWrite); - bytesWritten += cb; if (cb != willWrite) { return bytesWritten; } + bytesWritten += cb; } return bytesWritten; } @@ -78,7 +80,7 @@ public: class FSClass { private: - bool _mounted; + bool _mounted = false; public: bool mount(); diff --git a/cores/esp8266/core_esp8266_wiring.c b/cores/esp8266/core_esp8266_wiring.c index 0170b4bcf..67c47514c 100644 --- a/cores/esp8266/core_esp8266_wiring.c +++ b/cores/esp8266/core_esp8266_wiring.c @@ -78,4 +78,5 @@ void init() { timer1_isr_init(); os_timer_setfn(µs_overflow_timer, (os_timer_func_t*) µs_overflow_tick, 0); os_timer_arm(µs_overflow_timer, 60000, REPEAT); + spiffs_mount(); } diff --git a/cores/esp8266/spiffs/spiffs_config.h b/cores/esp8266/spiffs/spiffs_config.h index 3c55cf97f..095bef900 100755 --- a/cores/esp8266/spiffs/spiffs_config.h +++ b/cores/esp8266/spiffs/spiffs_config.h @@ -20,7 +20,6 @@ #include "stddef.h" #include "osapi.h" #include "ets_sys.h" -#include // ----------- >8 ------------ #define IRAM_ATTR __attribute__((section(".iram.text"))) #define STORE_TYPEDEF_ATTR __attribute__((aligned(4),packed)) diff --git a/cores/esp8266/spiffs/spiffs_flashmem.c b/cores/esp8266/spiffs/spiffs_flashmem.c index d2ad74cc0..156e2fac2 100755 --- a/cores/esp8266/spiffs/spiffs_flashmem.c +++ b/cores/esp8266/spiffs/spiffs_flashmem.c @@ -1,4 +1,5 @@ #include "flashmem.h" +#include "esp8266_peri.h" // Based on NodeMCU platform_flash // https://github.com/nodemcu/nodemcu-firmware @@ -184,7 +185,7 @@ uint32_t flashmem_write_internal( const void *from, uint32_t toaddr, uint32_t si return 0; os_memcpy(apbuf, from, size); } - WRITE_PERI_REG(0x60000914, 0x73); + WDT_RESET(); r = spi_flash_write(toaddr, apbuf?(uint32 *)apbuf:(uint32 *)from, size); if(apbuf) os_free(apbuf); @@ -200,7 +201,7 @@ uint32_t flashmem_read_internal( void *to, uint32_t fromaddr, uint32_t size ) { fromaddr -= INTERNAL_FLASH_START_ADDRESS; SpiFlashOpResult r; - WRITE_PERI_REG(0x60000914, 0x73); + WDT_RESET(); r = spi_flash_read(fromaddr, (uint32 *)to, size); if(SPI_FLASH_RESULT_OK == r) return size; diff --git a/libraries/ESP8266WebServer/src/ESP8266WebServer.h b/libraries/ESP8266WebServer/src/ESP8266WebServer.h index 8f70bd621..375d09600 100644 --- a/libraries/ESP8266WebServer/src/ESP8266WebServer.h +++ b/libraries/ESP8266WebServer/src/ESP8266WebServer.h @@ -83,6 +83,7 @@ protected: static const char* _responseCodeToString(int code); void _parseForm(WiFiClient& client, String boundary, uint32_t len); void _uploadWriteByte(uint8_t b); + uint8_t _uploadReadByte(WiFiClient& client); struct RequestHandler; struct RequestArgument { diff --git a/libraries/ESP8266WebServer/src/Parsing.cpp b/libraries/ESP8266WebServer/src/Parsing.cpp index d2f0ee762..40a58d24a 100644 --- a/libraries/ESP8266WebServer/src/Parsing.cpp +++ b/libraries/ESP8266WebServer/src/Parsing.cpp @@ -214,12 +214,22 @@ void ESP8266WebServer::_uploadWriteByte(uint8_t b){ _currentUpload.buf[_currentUpload.currentSize++] = b; } +uint8_t ESP8266WebServer::_uploadReadByte(WiFiClient& client){ + int res = client.read(); + if(res == -1){ + while(!client.available()) + yield(); + res = client.read(); + } + return (uint8_t)res; +} + void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t len){ #ifdef DEBUG DEBUG_OUTPUT.print("Parse Form: Boundary: "); DEBUG_OUTPUT.print(boundary); - DEBUG_OUTPUT.print("Length: "); + DEBUG_OUTPUT.print(" Length: "); DEBUG_OUTPUT.println(len); #endif String line; @@ -249,17 +259,17 @@ void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t argFilename = argName.substring(nameStart+2, argName.length() - 1); argName = argName.substring(0, argName.indexOf('"')); argIsFile = true; - #ifdef DEBUG +#ifdef DEBUG DEBUG_OUTPUT.print("PostArg FileName: "); DEBUG_OUTPUT.println(argFilename); - #endif +#endif //use GET to set the filename if uploading using blob if (argFilename == "blob" && hasArg("filename")) argFilename = arg("filename"); } - #ifdef DEBUG +#ifdef DEBUG DEBUG_OUTPUT.print("PostArg Name: "); DEBUG_OUTPUT.println(argName); - #endif +#endif argType = "text/plain"; line = client.readStringUntil('\r'); client.readStringUntil('\n'); @@ -269,10 +279,10 @@ void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t client.readStringUntil('\r'); client.readStringUntil('\n'); } - #ifdef DEBUG +#ifdef DEBUG DEBUG_OUTPUT.print("PostArg Type: "); DEBUG_OUTPUT.println(argType); - #endif +#endif if (!argIsFile){ while(1){ line = client.readStringUntil('\r'); @@ -281,20 +291,20 @@ void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t if (argValue.length() > 0) argValue += "\n"; argValue += line; } - #ifdef DEBUG +#ifdef DEBUG DEBUG_OUTPUT.print("PostArg Value: "); DEBUG_OUTPUT.println(argValue); DEBUG_OUTPUT.println(); - #endif +#endif RequestArgument& arg = postArgs[postArgsLen++]; arg.key = argName; arg.value = argValue; if (line == ("--"+boundary+"--")){ - #ifdef DEBUG +#ifdef DEBUG DEBUG_OUTPUT.println("Done Parsing POST"); - #endif +#endif break; } } else { @@ -312,23 +322,23 @@ void ESP8266WebServer::_parseForm(WiFiClient& client, String boundary, uint32_t #endif if (_fileUploadHandler) _fileUploadHandler(); _currentUpload.status = UPLOAD_FILE_WRITE; - uint8_t argByte = client.read(); + uint8_t argByte = _uploadReadByte(client); readfile: while(argByte != 0x0D){ _uploadWriteByte(argByte); - argByte = client.read(); + argByte = _uploadReadByte(client); } - argByte = client.read(); + argByte = _uploadReadByte(client); if (argByte == 0x0A){ - argByte = client.read(); + argByte = _uploadReadByte(client); if ((char)argByte != '-'){ //continue reading the file _uploadWriteByte(0x0D); _uploadWriteByte(0x0A); goto readfile; } else { - argByte = client.read(); + argByte = _uploadReadByte(client); if ((char)argByte != '-'){ //continue reading the file _uploadWriteByte(0x0D); @@ -366,11 +376,13 @@ readfile: } else { _uploadWriteByte(0x0D); _uploadWriteByte(0x0A); + _uploadWriteByte((uint8_t)('-')); + _uploadWriteByte((uint8_t)('-')); uint32_t i = 0; while(i < boundary.length()){ _uploadWriteByte(endBuf[i++]); } - argByte = client.read(); + argByte = _uploadReadByte(client); goto readfile; } } else { diff --git a/platform.txt b/platform.txt index cd09aff98..bc4b20927 100644 --- a/platform.txt +++ b/platform.txt @@ -20,8 +20,7 @@ compiler.c.flags=-c -Os -Wpointer-arith -Wno-implicit-function-declaration -Wl,- compiler.S.cmd=xtensa-lx106-elf-gcc compiler.S.flags=-c -g -x assembler-with-cpp -MMD -compiler.c.elf.ldscript=eagle.app.v6.ld -compiler.c.elf.flags=-nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{compiler.c.elf.ldscript}" +compiler.c.elf.flags=-nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static "-L{compiler.sdk.path}/lib" "-L{compiler.sdk.path}/ld" "-T{build.flash_ld}" compiler.c.elf.cmd=xtensa-lx106-elf-gcc compiler.c.elf.libs=-lm -lgcc -lhal -lphy -lnet80211 -llwip -lwpa -lmain -lpp -lsmartconfig