前からやりたかったんですが、後回しになっていたESP8266(ESP-12) のファームウェアの書き換えです。
いろんなところで紹介されているので、いまさらですが、忘れてしまうためにメモしておきます。
2014.08.09 現在で、オフィシャルのファームウェアは、以下のようです。昨日リリースですか!
Latest Version 1.3.0 Release date Aug 08, 2015
解答すると、以下のようなバイナリがあります。
$ cd esp8266/esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin
$ tree
.
├── at
│ ├── eagle.flash.bin
│ ├── eagle.irom0text.bin
│ ├── readme.txt
│ ├── user1.1024.new.2.bin
│ └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade2 directories, 9 files
購入したときには、0.9.5あたりが入っていた記憶があります。(未確認)そのときは、確か、あまり確認もせずに、arduino IDE for ESP8266 から書き込んだのでどうなっていたかわかりませんが、再度、オフィシャルから見てみました。
このあたりは、オフィシャルのBBSを見たほうがいいです。結構なスピードでSDK のバージョンがあがっています。
Espressif / ESP8266 / Developer Zone / Downloads / SDKs
とりあえず、0.9.5 をもう一度入れて復習しておきます。BBS からSDK のesp_iot_sdk_v0.9.5_15_01_23を落として解凍してみました。
$ cd esp_iot_sdk_v0.9.5_15_01_23/esp_iot_sdk_v0.9.5/bin
$ tree
.
├── at
│ ├── readme.txt
│ ├── user1.512.new.bin
│ ├── user1.512.old.bin
│ ├── user2.512.new.bin
│ └── user2.512.old.bin
├── blank.bin
├── boot_v1.1.bin
├── boot_v1.2.bin
├── esp_init_data_default.bin
└── upgrade
GPIO0 Pin をGND に落としてBoot して、(もしくは、RST を GND に落としリセットして)以下のコマンドで書き込みます。
$ esptool.py -p /dev/tty.SLAB_USBtoUART write_flash 0x00000 boot_v1.2.bin 0x01000 at/user1.512.new.bin 0x3e000 blank.bin 0x7e000 blank.bin
※-p オプションの UART デバイスはお使いのものを
無事書き込みできると、以下のようになります。
Connecting…
Erasing flash…
Writing at 0x00000400… (100 %)
Erasing flash…
Writing at 0x00034800… (100 %)
Erasing flash…
Writing at 0x0003ec00… (100 %)
Erasing flash…
Writing at 0x0007ec00… (100 %)Leaving…
CoolTerm などからUART 経由でログインし、115200 bps で接続すると、以下のようなコマンドの結果が返ってくればOKだと思います。
AT
OK
AT+GMR
AT version:0.21.0.0
SDK version:0.9.5
OK
AT+RST
OKets Jan 8 2013,rst cause:4, boot mode:(3,7)
wdt reset
load 0x40100000, len 816, room 16
tail 0
chksum 0x8d
load 0x3ffe8000, len 788, room 8
tail 12
chksum 0xcf
ho 0 tail 12 room 4
load 0x3ffe8314, len 288, room 12
tail 4
chksum 0xcf
csum 0xcf
2nd boot version : 1.2
SPI Speed : 40MHz
SPI Mode : QIO
SPI Flash Size : 4Mbit
jump to run user1
rlNÿ
ready
ATコマンドのドキュメントは、SDK のドキュメントの中のPDFにあるか、または、初版はオフィシャルBBSの以下にあります。
at_v0.20_14_11_28
http://bbs.espressif.com/viewtopic.php?f=5&t=64
さて、ESP-12 モジュールはどこまでこのファームウェアを上げれるのでしょうか?今や、技適が通った、ESP-13 や Pin数が増えたESP-12E などがあり、いまいち、違いが見えてきません。SDK 1.2 からは、mesh network ができるようになった模様です。また、patch で SSL もサポートされたようです。
2015/08/08 にリリースされた、SDK には、以下のように2種類のファームウェアがあります。
$ cd esp_iot_sdk_v1.3.0_15_08_08/esp_iot_sdk_v1.3.0/bin
$ tree
.
├── at
│ ├── eagle.flash.bin
│ ├── eagle.irom0text.bin
│ ├── readme.txt
│ ├── user1.1024.new.2.bin
│ └── user2.1024.new.2.bin
├── blank.bin
├── boot_v1.2.bin
├── boot_v1.4(b1).bin
├── esp_init_data_default.bin
└── upgrade2 directories, 9 files
ReadMe を見ると以下のようです。
download:
boot_v1.2+.bin 0x00000
user1.1024.new.2.bin 0x01000
blank.bin 0x7e000 & 0xfe000
or
eagle.flash.bin 0x00000
eagle.irom0text.bin 0x40000
blank.bin 0x7e000 & 0xfe000
*NOTICE*:
1.If you use Esp Flash Download Tool, please MAKE SURE to choose FLASH SIZE to 8Mbit.
2.UPDATE is not supported in non-boot mode
Update steps
1.Make sure TE(terminal equipment) is in sta or sta+ap mode
ex. AT+CWMODE=3
OK
AT+RST
2.Make sure TE got ip address
ex. AT+CWJAP="ssid","12345678"
OK
AT+CIFSR
192.168.1.134
3.Let’s update
ex. AT+CIUPDATE
+CIPUPDATE:1 found server
+CIPUPDATE:2 connect server
+CIPUPDATE:3 got edition
+CIPUPDATE:4 start start
OK
note. If there are mistakes in the updating, then break update and print ERROR.
or とあるこの、eagle.*** というのが良くわかりません。これは何者でしょうかね?
とりあえず、このESP-12 は5つあるので全部壊すつもりで、いろいろ試してみるつもりです。技適が通ったタイプも価格がこなれてきたら、遊んでみようかと思います。IoT デバイスのDIY モジュールとしてこれからも活躍しそうですね。
さらに情報収集し、このあたりのBlog 記事には、面白いことが書いてありました。
Latest AT Firmware for ESP8266 with 512k Flash _ Kacang Bawang
http://kacangbawang.com/latest-at-firmware-for-esp8266-with-512k-flash/
SDK1.0.1 以降は、バイナリサイズが512kb に収まるには大きすぎるようで、esp-open-sdk で自前でビルドするのがいいよとのこと。そのほかも、いろいろと有益なことや、奇妙な書き込み順を帰ると出来ることなど書いてあります。
フラッシュのID というのをesptool でゲットできるそうで、やってみました。GPIO0 を GND に落として、次のコマンドを投げると
$ esptool.py -p /dev/tty.SLAB_USBtoUART flash_id
自分のESP-12 環境では、以下のように出ました。
Connecting…
Manufacturer: ef
Device: 4016
これはどうやら、メーカーコードと使用チップのようです。SPI のフラッシュメモリーで、この例だと、WINBOND のW25Q32 のようです。
http://code.coreboot.org/svn/flashrom/trunk/flashchips.h
/*
* W25X chips are SPI, first byte of device ID is memory type, second
* byte of device ID is related to log(bitsize).
*/
#define WINBOND_NEX_ID 0xEF /* Winbond (ex Nexcom) serial flashes */
#define WINBOND_NEX_W25X10 0x3011
#define WINBOND_NEX_W25X20 0x3012
#define WINBOND_NEX_W25X40 0x3013
#define WINBOND_NEX_W25X80 0x3014
#define WINBOND_NEX_W25X16 0x3015
#define WINBOND_NEX_W25X32 0x3016
#define WINBOND_NEX_W25X64 0x3017
#define WINBOND_NEX_W25Q40_V 0x4013 /* W25Q40BV; W25Q40BL (2.3-3.6V) */
#define WINBOND_NEX_W25Q80_V 0x4014 /* W25Q80BV */
#define WINBOND_NEX_W25Q16_V 0x4015 /* W25Q16CV; W25Q16DV */
#define WINBOND_NEX_W25Q32_V 0x4016★ /* W25Q32BV; W25Q32FV in SPI mode (default) */
このデータシートは、以下のようで、32M-bit / 4M-byte ( 4,194,304 )あるそうですが?512Kbじゃないの?
http://www.marthel.pl/katalog/W25Q80_16_32c.pdf#page=18
うーん、そうだとしたら、うれしい誤算です。ちょっと未確認なので、512Kb ~ 4Mb あるかもというスタンスでこれから意識してみます。
まとめ
・esptool.py か、オフィシャルの書き込みツールを使ってファームをあげる
・書き込みには、GPIO0 をGND に落とす( and RST を GND でもいいようです)
おそらく、ブート時にGPIO0 が GND に落ちていればいいので、タイミングを逃せば、RST でもいいということかと理解。
・書き込みには、高品質な電源で、3.3V を供給するようにすると幸せ(ピーク電流が結構多い)
・ESP-12 では、esp_iot_sdk_v0.9.5_15_01_23 は動作した
・最新のファームウェアは、オフィシャルBBS を見ると詳しい
・自分のデバイスのフラッシュメモリはいくつ? esptool.py のflash_id で見てみる
・オフィシャルのファームはESP-12 だとどこまで上げれるのか? フラッシュメモリサイズに依存しそうな感じ(未確認)
・esp-open-sdk を使って、自前でファームを作ることが可能
・オフィシャルのファームバージョンsdk_v1.3.0_15_08_08 に2つ組み合わせがあるのはなぜ?
参考
ともの技術メモ tag esp8266
http://tomono.eleho.net/tag/esp8266/技適OKな中華IoTモジュールを使いこなす _ BRILLIANTSERVICE TECHNICAL BLOG
http://bril-tech.blogspot.jp/2015/07/okiot.html