ESP12 ファームウエア

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

2 directories, 9 files

購入したときには、0.9.5あたりが入っていた記憶があります。(未確認)そのときは、確か、あまり確認もせずに、arduino IDE for ESP8266 から書き込んだのでどうなっていたかわかりませんが、再度、オフィシャルから見てみました。

 

このあたりは、オフィシャルのBBSを見たほうがいいです。結構なスピードでSDK のバージョンがあがっています。

Espressif / ESP8266 / Developer Zone /  Downloads / SDKs

http://bbs.espressif.com/viewforum.php?f=46

とりあえず、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
OK

ets 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
└── upgrade

2 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