ESP8266 alternatív OTA

Fórumok

A partíció 1MB FW 3MB SPIFFS. A Firmware ~900kB
Ehhez szeretnék valami WiFi-s frissítést.
A normál OTA esélytelen. Arra gondoltam ha a rendes FW által AsyncWebServer segítségével fogadott fájl pl "update.bin" akkor lezárja a fájlrendszert és kiírja 0x100000-tól a bin-t a flesbe. Fájlokat buktam, leszarom, az új FW formatálja. Ez egy AsyncElegantOTA firmware lenne. Az eredeti FW setup első sora megnézi az eepromot amiből kiderül hogy frissíteni kell-e, ha igen akkor 0x100000 címen levő kódot futtatja. Lehet egy .ino-t fordítani úgy hogy a 0x100000 címen kezdődjön és setupból indítható legyen?

Hozzászólások

van amikor nem forraszthato ki az esp chip a cuccbol.

Nem az ESP chip-ben van az EEPROM, az egy másik chip.

persze en is tudok olyan esp-t keresni mivel fel sem merul a problema.

Három út van: vagy nagyobb EEPROM vagy kisebb igények vagy másik architektúra. Az ESP8266 esetén a chip működése adott, az OTA működést a chip firmware adja, az kezeli az EEPROM újraírását, ezt nem tudod cserélni.

Esküszöm nem értelek. Ezt én írtam, törli a flasht, az eeprom első hat bájtját megőrzi.

@echo off
COLOR A
echo Full Format ^!^!^!^!^!^!^!^!^!^!^!
setlocal EnableDelayedExpansion
SET /P M=COM port: 
echo -------------------------
echo BACKUP REGISTRATION CODE
esptool.exe --port COM%M% read_flash 0x3FB000 6 code.txt
echo SUCCESS!
echo -------------------------
echo ERASE FLASH
esptool.exe --port COM%M% erase_flash
echo SUCCESS!
echo -------------------------

set "INPUT=code.txt"
set "OUTPUT=eeprom_full.bin"
set "PADBIN=pad_ff.bin"
set "HEX=pad_ff.hex"
set /a TOTAL=4096

for %%I in (%INPUT%) do set /a SIZE=%%~zI

if !SIZE! GEQ !TOTAL! (
    echo %INPUT% is already >= 4096 bytes
    copy /Y %INPUT% %OUTPUT% >nul
    goto :done
)

set /a NEED=!TOTAL! - !SIZE!

set /a LINES=!NEED! / 16
set /a REM=!NEED! %% 16

> %HEX% (
    for /L %%i in (1,1,!LINES!) do echo FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
    if !REM! NEQ 0 (
        set "LINE="
        for /L %%j in (1,1,!REM!) do set "LINE=!LINE!FF "
        echo !LINE!
    )
)

certutil -f -decodehex %HEX% %PADBIN% >nul 2>&1
if errorlevel 1 (
    echo HIBA: certutil nem tudta létrehozni a bináris fájlt.
    goto :error
)

copy /b %INPUT% + %PADBIN% %OUTPUT% >nul

del %PADBIN%
del %HEX%

echo WRITE REGISTRATION CODE
esptool.exe --port COM%M% write_flash 0x3FB000 eeprom_full.bin
del %OUTPUT%
echo SUCCESS!
goto :done

:error
echo ERROR.
exit /b 1

:done
endlocal
echo -------------------------

Na hol az eeprom?

Esküszöm nem értelek.

A fő probléma az, hogy az ESP8266 működését, felépítését és architektúráját se érted.

Na hol az eeprom?

Mindegy, hogy minek hívod a fájlt, a neve nem kerül kiírásra, az csak a gépeden jelent bármit is, viszont a Flash-ban van ugyanúgy és ahogy írtam, a Flash az egy EEPROM altípus... amit te `eeprom_full.bin` néven nevezel és kiírsz a 0x3FB000 területre - az a memory map specifikáció szerint "Unused" régió, oda azt írsz, amit akarsz, és bárhogy nevezheted a fájlt a gépeden, semmit nem jelent.

Szóval újra: a Flash egy egy EEPROM altípus. Az ESP8266 külső EEPROM nélkül nem működik. Az OTA boot folyamatot az ESP8266 belső ROM firmware kezeli, az meg csak úgy tud működni, hogy van egy firmware partíció és ott van két slot. Ha nincs két slot, akkor nincs OTA. Fájlrendszerből nem fog működni a boot, fájlrendszerből úgy tud működni, hogy ugyanúgy van két slot a firmware partícióban és a fájlrendszerről átmásolja valamelyikbe a firmware-t. Olyan nem lesz, amit szeretnél, de ez amúgy le van írva a specifikációkban is.

Nekem az az ic FLASH. EEPROM az a 24cXX

Neked lehet, a 24Cxx az egy konkrét gyártó konkrét egy EEPROM IC típuscsaládja. Ezen kívül van millió fajta EEPROM. Minden olyan IC EEPROM, ami elektromosan törölhető és programozható, ez egy naaaaagy gyűjtőnév. Olvasnivaló a témában: https://en.wikipedia.org/wiki/EEPROM

Az a kérdés tudok-e egy ElegantOTA fw-t így fordítani.

Az ElegantOTA egy pár soros wrapper az ESP8266 saját OTA firmware kódja felett, azzal pedig nem tudsz olyan OTA-t csinálni, hogy "1MB FW 3MB SPIFFS" használatával ~900kB firmware OTA frissíthető legyen. Ez csak úgy megy, ha a firmware partíció 2MB méretű. Maximum olyat tudsz, hogy az firmware partíció aszimmetrikus, és van egy kisebb firmware, ami letölti a nagyobbat, de a legminimálisabb Arduino firmware kb. 300 kB lesz, ESP-IDF esetén ~130 kB, ezzel se fog 900 kB OTA felférni.

Már értem. Kevered a FLASH-t meg az EEPROM-ot.

Nem, nem keverem, ahogy idéztem is a specifikációból: "Flash memory is a block-erase EEPROM optimized for high density and speed." 

Te kevered:

Nincs is eeprom. Az a flash végén egy kis rész. Nem értem ez hogy jön ide.

Az a "flash végén egy kis rész", az nem EEPROM, mert a Flash egésze egy EEPROM, a "flash végén egy kis rész" az egy szimpla "Unused" memory block az EEPROM-ban, egy 4096 bájt hosszú blokk, amit te valamiért a saját gépeden úgy hívsz, hogy `eeprom_full.bin`. De hívhatod azt bárhogy, lehetne a neve `patyomkin.bin` is, ugyanúgy működne a programod, az ESP8266 ugyanis nem tudja, hogy mi a fájl neve, amiből felmásolsz 4096 bájtot.

Én nem szenvednék teljes firmware OTA frissítésésel, inkább olyat használnék, ahol tudod változtatni a filerendszeren a kódot. Pl. NodeMCU.

A tudomány és a hit vitája akkor eldőlt, amikor villámhárítót szereltek a templomokra.

Sokkal kevesebbet (és lassabban) tudsz futtatni, ha interpretált kóddal futsz neki, lényegesen jobb lehetőségeid vannak Arduino alapokon és ESP-IDF esetén meg teljesen kinyílik a világ. De ez az OTA lehetőséget nem érinti, azt a chip saját firmware kódja végzi és kötött a működése.

Tisztában vagyok vele, hogy egy interpreter nyelv lassabb, mint a natív fordított. De rengeteg olyan alkalmazás van, ahol ez az interpreter sebesség is bőven elég, nekem pl. eddig megfelelt mindenre: Villanyóra P1 port, szenzorok olvasása, ventilátorok vezérlése, mindezek ESP-01-el, ami a leggyengébb ESP8266 modul.

A tudomány és a hit vitája akkor eldőlt, amikor villámhárítót szereltek a templomokra.