@@ -127,7 +127,12 @@ bool UpdaterClass::begin(size_t size, int command) {
127
127
_startAddress = updateStartAddress;
128
128
_currentAddress = _startAddress;
129
129
_size = size;
130
- _buffer = new uint8_t [FLASH_SECTOR_SIZE];
130
+ if (ESP.getFreeHeap () > 2 * FLASH_SECTOR_SIZE) {
131
+ _bufferSize = FLASH_SECTOR_SIZE;
132
+ } else {
133
+ _bufferSize = 256 ;
134
+ }
135
+ _buffer = new uint8_t [_bufferSize];
131
136
_command = command;
132
137
133
138
#ifdef DEBUG_UPDATER
@@ -218,13 +223,16 @@ bool UpdaterClass::end(bool evenIfRemaining){
218
223
219
224
bool UpdaterClass::_writeBuffer (){
220
225
221
- if (!_async) yield ();
222
- bool result = ESP.flashEraseSector (_currentAddress/FLASH_SECTOR_SIZE);
223
- if (!_async) yield ();
226
+ bool result = true ;
227
+ if (_currentAddress % FLASH_SECTOR_SIZE == 0 ) {
228
+ if (!_async) yield ();
229
+ result = ESP.flashEraseSector (_currentAddress/FLASH_SECTOR_SIZE);
230
+ }
231
+
224
232
if (result) {
225
- result = ESP.flashWrite (_currentAddress, (uint32_t *) _buffer, _bufferLen);
233
+ if (!_async) yield ();
234
+ result = ESP.flashWrite (_currentAddress, (uint32_t *) _buffer, _bufferLen);
226
235
}
227
- if (!_async) yield ();
228
236
229
237
if (!result) {
230
238
_error = UPDATE_ERROR_WRITE;
@@ -253,8 +261,8 @@ size_t UpdaterClass::write(uint8_t *data, size_t len) {
253
261
254
262
size_t left = len;
255
263
256
- while ((_bufferLen + left) > FLASH_SECTOR_SIZE ) {
257
- size_t toBuff = FLASH_SECTOR_SIZE - _bufferLen;
264
+ while ((_bufferLen + left) > _bufferSize ) {
265
+ size_t toBuff = _bufferSize - _bufferLen;
258
266
memcpy (_buffer + _bufferLen, data + (len - left), toBuff);
259
267
_bufferLen += toBuff;
260
268
if (!_writeBuffer ()){
@@ -340,10 +348,10 @@ size_t UpdaterClass::writeStream(Stream &data) {
340
348
}
341
349
342
350
while (remaining ()) {
343
- toRead = data.readBytes (_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen));
351
+ toRead = data.readBytes (_buffer + _bufferLen, (_bufferSize - _bufferLen));
344
352
if (toRead == 0 ) { // Timeout
345
353
delay (100 );
346
- toRead = data.readBytes (_buffer + _bufferLen, (FLASH_SECTOR_SIZE - _bufferLen));
354
+ toRead = data.readBytes (_buffer + _bufferLen, (_bufferSize - _bufferLen));
347
355
if (toRead == 0 ) { // Timeout
348
356
_error = UPDATE_ERROR_STREAM;
349
357
_currentAddress = (_startAddress + _size);
@@ -355,7 +363,7 @@ size_t UpdaterClass::writeStream(Stream &data) {
355
363
}
356
364
}
357
365
_bufferLen += toRead;
358
- if ((_bufferLen == remaining () || _bufferLen == FLASH_SECTOR_SIZE ) && !_writeBuffer ())
366
+ if ((_bufferLen == remaining () || _bufferLen == _bufferSize ) && !_writeBuffer ())
359
367
return written;
360
368
written += toRead;
361
369
yield ();
0 commit comments