Дмитрий DarkByte Москин

Мой блог, да.
logo

Возвращаем к жизни esp8266 после неудачного обновления

Опубликовано 26.02.2015 автором Дмитрий Москин
Заказав на пробу несколько различных модификаций отладочной платы esp8266 столкнулся с невозможностью обновить прошивку на одной из модификаций. Модификация ESP8266 под кодом ESP-05 имеет разведённые выводы VCC TX RX GND RST (на некоторых платах RST не выведен). Но для перехода в режим программирования через UART требуется замкнуть GPIO0 на землю, а на данной плате он уже замкнут на VCC, да ещё и таким образом, что для обрезания дорожки и установки на место разрыва переключателя требуется микроскоп, скальпель и нормальный паяльник.




Сам ESP8266 программируемой памяти не имеет (а возможно и имеет, но мы не умеем ей пользоваться), поэтому используется внешняя flash память на 512кб. По умолчанию в неё залита тестовая прошивка, которая принимает AT команды через UART на скорости 9600 бод. Возможностей этой прошивки вполне достаточно для того, чтобы подключить модуль к внешнему микроконтроллеру и общаться со внешним миром через WiFi. Но в большинстве задач, типа умного дома, вполне достаточно тех возможностей, что предоставляет МК ESP8266, но для этого нужно научиться заливать в него свой код.

Стандартная AT прошивка не отличается, ни функционалом, ни стабильностью. Но есть у неё одна интересная команда AT+CIUPDATE, которая должна загрузить из интернета новую версию прошивки и записать её во flash. Но что-то пошло не так, и все пять имеющихся у меня модулей модификации ESP-05 превратились в кирпичи. В момент прошивки модули питались стабильными 3.3В при максимальном токе 1А. После неудачного обновления модуль переходил на скорость 74880 бод и бесконечно падал в Fatal exception при попытке загрузиться.

[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready
>AT+GMR
0018000902-AI03

>AT+CIUPDATE
+CIPUPDATE:1
+CIPUPDATE:2
+CIPUPDATE:3
+CIPUPDATE:4


...
...
Switch to 74880 baud
...

ets Jan 8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x40100000, len 25052, room 16
tail 12
chksum 0x0b
ho 0 tail 12 room 4
load 0x3ffe8000, len 3312, room 12
tail 4
chksum 0x53
load 0x3ffe8cf0, len 6576, room 4
tail 12
chksum 0x0d
csum 0x0d
Fatal exception (29):
epc1=0x402411b4, epc2=0x00000000, epc3=0x00000000, excvaddr=0x0002016f, depc=0x00000000


Данную проблему можно решить двумя путями. Простой путь заключается в переводе чипа esp8266 в режим программирования замыкании GPIO0 на GND и подключении его через usb-ttl переходник к компьютеру с установленной утилитой XTCOM_UTIL или аналогами. В моём случае было до невозможности трудно отцепить GPIO0 от VCC, поэтому я выбрал второй путь: отпаять флеш память от платы и запрограммировать её с использованием внешнего программатора, в моём случае, дешёвого китайского комбайна CH341A.



В качестве новой прошивки решил выбрать frankenstein, в основном из-за наличия у него возможности обновлять прошивку по tftp. При правильном подходе эта возможность позволит больше не возиться с паяльником для обновления прошивки. Последнюю версию прошивки брал из github, antares.rom заливал начиная с нулевого адреса, предварительно очистив содержимое флешки. После возвращения флешки на место, МК ожил.

ets Jan  8 2013,rst cause:4, boot mode:(3,6)

wdt reset
load 0x40100000, len 23880, room 16
tail 8
chksum 0x7d
load 0x3ffe8000, len 3856, room 0
tail 0
chksum 0xa6
load 0x3ffe8f10, len 8608, room 8
tail 8
chksum 0x2c
csum 0x2c
r$env: Environment @ 0x0007f000 size 4096 bytes (4092 real)
=== Current environment ===
sta-mode dhcp
default-mode STA
sta-ip 192.168.0.123
sta-mask 255.255.255.0
sta-gw 192.168.0.1
ap-ip 192.168.1.1
ap-mask 255.255.255.0
ap-gw 192.168.1.1
bootdelay 5
dhcps-enable 1
telnet-port 23
telnet-autostart 1
telnet-drop 60
tftp-server 192.168.1.215
tftp-dir /
tftp-file antares.rom
hostname frankenstein
=== 300/4092 bytes used ===



Frankenstein ESP8266 Firmware
Powered by Antares 0.2-rc1, Insane Mushroom
(c) Andrew 'Necromant' Andrianov 2014
This is free software (where possible), published under the terms of GPLv2

Memory Layout:
data : 0x3ffe8000 ~ 0x3ffe8f10, len: 3856
rodata: 0x3ffe8f10 ~ 0x3ffeb0b0, len: 8608
bss : 0x3ffeb0b0 ~ 0x3fff2ed0, len: 32288
heap : 0x3fff2ed0 ~ 0x3fffc000, len: 37168
dhcpserver: started
telnet: server accepting connections on port 23

=== Press enter to activate this console ===

frankenstein >


Базовый функционал прошивки frankenstein предоставляет следующие возможности:

frankenstein > help

help - Show this message
telnet - start/stop telnet server
telnet start - start it
telnet stop - stop it
telnet quit - drop current client
argtest - Print out argc/argv
deepsleep - Enter deep sleep for some microseconds
deepsleep 10000
reset - Soft-reboot the device
chipinfo - Display chip information
meminfo - Display memory information
hname - Set dhcp hostname
envreset - Reset environment to defaults
resetenv
saveenv - Write environment to flash
setenv var value
getenv - Get an environment variable
getenv var
setenv - Set an environment variable
setenv var value
printenv - Print all environment variables
apconfig - Setup Access Point.
apconfig name OPEN/WEP/WPA_PSK/WPA2_PSK/WPA_WPA2_PSK [password]
iwconnect - Join a network/Display connection status.
iwconnect ssid password
iwmode - Get/set wireless mode. Available modes: NONE, STA, AP, APSTA
iwmode STA
iwscan - Scan for available stations
baud - Configure serial port speed
baudrate {port:0/1} {speed}
baudrate 0 57600
ifconfig - Show network interfaces and their status
ifconfig [iface]
ifconfig sta0
gpio - Control gpio lines. gpio mode line [value]
gpio in 0
gpio out 0 1
flash_scan - Scan the upper portion of FLASH for dirty blocks
Used to find out where the blobs store config
flash_scan
spi_dump - Hexdump flash contents
spi_dump start len
wipeparams - Wipe blob configuration section of flash
wipeparams any three arguments
spi_wipe - Wipe the whole spi flash blank
wipe any three arguments
listen - Listen for incoming data ona port
listen 8080
send - Send data to a remote host.
send hostname port [data]
ds18b20 - Read temperature from DS18B20 chip.
ds18b20
tftp - Update firmware over tftp
tftp
AT - says OK
adc - Reads system ADC value