WROOM-02は、ESP8266+SPI-FLASHが搭載されたモジュールだ。
UART経由でATコマンドを使った制御もできるのだが、そうしないで動かすこともできる。
以下、「「2A-ESP8266__IOT_SDK_User_Manual__EN_v1.4.pdf」」を見ていこう。
5章の始めに、STEP 1と5でFLASHのサイズやマップが変わる、ということが書かれている。
この「STEP」は、スクリプトのgen_misc.shのSTEPだろう。
- STEP 1: choose boot version(0=boot_v1.1, 1=boot_v1.2+, 2=none)
- STEP 5: choose spi size and map
STEP1でnoneを選ぶと、5.1章の方、すなわちFOTAをサポートしない構成になる。
別にFOTAとか無くてもいいんだけどなぁ、と思うのだが、AT_v0.50のreadme.txtだと、どれもboot.binを焼くようになっているから、FOTAをサポートするのだろう。
領域の説明も書かれていた。
- System param
- 常にFLASHの最後16KBに割り当てられる
- User param
- IOT_DemoかATのときに使われるユーザパラメータ領域
- ユーザが自分でアプリを作るなら、好きに使ってよい
- User Data
- 空き領域なので、好きに使ってよい
- User1.binやUser2.binが最大サイズまで使っていない場合は、そこもUser Dataで使ってよい
さて、ATコマンドはサポートした方がやりやすいと思うのだが、ユーザアプリとどのように関係しているのだろうか?
推測だけど、bootのところはFLASHの前半(user1.bin)を起動するか後半(user2.bin)を起動するかが選べるようになっていて、user1.binにATコマンド用アプリが載っていて、user2.binはユーザが作ったアプリを載せる、みたいな想定じゃないだろうか。
ユーザアプリだけでよいなら、5.1章の構成にしてしまえばよい、と。
そういう気持ちで眺めてみよう。
5.2章によると、6番のFLASHメモリ構成はこうなっている。
User1.binもUser2.binも、最大が1MBくらいになっている。
私の予想では、ユーザプログラムは好き勝手なサイズにできるかと思ってたのだが・・・。
しかし、よく考えるとここのFLASHメモリはSPIだ。
だから、一度RAMに展開しないとプログラムとして実行できない。
外付けのRAMはWROOM-02には内容だから、ESP8266EXの内蔵RAM上に展開するのだろう。
esp_iot_sdk_v1.4.0/ld/eagle.app.v6.new.2048.ldでは、こうなっている。
MEMORY
{
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40201010, len = 0xE0000
}
dramとあるから、Dynamic RAMのことかと思ったのだが、どうもData RAMっぽい感じだ。
その下のiramとかiromは、Instructionのiなんじゃなかろうか。
というのを、Wikiを見て思った。
Memory Map · esp8266/esp8266-wiki Wiki
アドレスの40200000hがSPI-FLASHをマッピングしたところになるみたいなのだけど、うん、さっぱりわからんね。
ともかく、一度RAMに展開しないと実行できないことには変わりが無いだろうから、FLASHの容量が増えたとしてもプログラムがそれだけ大きくできるというわけではない、ということだな。
こちらではWROOM-02のケースをはがした画像が載っているが、SPI-FLASHしか載ってないみたいだ。
「FM25Q16」というのが、それみたいだ。
こそっとDRAMが外付けしてある、ということはないみたい。
ねむいさんのぶろぐ | 技適マーク付きESP8266モジュール ESP-WROOM-02 を使ってみる
Wikiのトップページには、命令用RAMが64KB、データ用RAMが96KBとなっていた。
こちらではSPI-FLASHが25Q40となってるから、当時から大きくなったんですかね。
Home · esp8266/esp8266-wiki Wiki
ちなみに、5.1章のFOTAをサポートしない場合の4MByteマップは、こうなっている。
FOTA無しの場合でも、256KBは使用するようだ。
あとは、User1.binとUser2.binをどう使い分けるのかが気になる。
ありがちなのは、GPIOのどこかがHIかLOで切り替えるというやつなので、ピンがどうなっているか調べよう。
Pin definition · esp8266/esp8266-wiki Wiki
外れた。
では、一発正解がダメだったので、順番に見ていく。
まずは、ブートシーケンスから。
Boot Process · esp8266/esp8266-wiki Wiki
うーん、SPI-FLASHのどこを起動する、みたいなのはないな・・・。
また外れか。
そもそも、User1.binとUser2.binが切り替えられる、ということが間違ってるのかも。
この構成は、FOTAをサポートする場合、ということは、FOTAについて調べるのがよいか。
99 ESP8266 Flash Read/Write - Over the Air
「99C-ESP8266__OTA_Upgrade__EN_v1.6.pdf」によると、User1.binかUser2.binかを決めているのはSystem paramのようだ。
p.5そのままだが、それっぽく訳しておこう。
- まずFLASHに、boot.binとVersion 1.0.0のuser1.binを焼いておく。
System paramのデフォルトはuser1.binから起動するようになっているので、電源ONするとUser1.binが起動する。 - サーバに、Version 1.0.1のuser1.binとuser2.binをアップロードする。
- サーバが「新しいソフトがあるよ」とPUSH通知する。
デバイスがそれを受けとると、System paramのフラグをチェックして、user1.binで起動しているならuser2.binを、user2.binで起動しているならuser1.binをダウンロードする(ここでは、user2.binのダウンロードになる)。 - ダウンロードが終わったら、使用者にファーム更新をするかどうか確認する。
更新を了解したら、System paramのフラグを書き換えてuser2.binからの起動にして、再起動する。
つまり、パーティションを2つに分けて、起動してない方に新しいファームを焼いて、起動するファームを反対側にして再起動、だ。
いわゆる(?)「2面持ち」みたいなやり方ですな。
なので、サーバにアップするときにはuser1.binもuser2.binも同時にアップする。
違いは配置するアドレスだけなのだけど、リロケータブルじゃないようなので、両方ビルドしないといかんみたい。
だから、UART経由でアップロードする場合はuser2.binがいらないのですな。
FOTAしない限りは切り替えないし、切り替えるときにはFLASHを書き換えるし。
なんとなく外側はわかったので、あとはどうやるとFOTAできるのか。
PDFのp.11に「http://iot.espressif.cn/#/help-en/」を見るように書いてある。
よくわからんが、うちのFirefoxからは見れなくて、Chromeだと見えた(Firefoxの方は、あれこれ制限を掛けて使ってるせいかも)。
まあ、そういうのはどうでもよいとして、PDFを見ている感じでは、このiot.espressif.cnのサイトにファームを置くと、いろいろAPIとかが用意されていて使えますよ、ということのように見える。
それが嫌だったら、spi_flash_erase_sector()とspi_flash_write()を組み合わせて、自分でやるしかないのだろうな。。。
esp_iot_sdk_v1.4.0/examples/IoT_Demo/include/user_config.hに、"iot.espressif.cn"という文字列があったし、AT v0.50の中にあったbinにもその文字列があったので、IoT_Demoをうまく流用すれば自前のサイトで同じようなことができるかもしれんな。
まあ、私にサーバ側のことができれば・・・という条件が付くのだが。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。