前からやりたかったんですが、後回しになっていた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