espeink make その4

続きをやっています。昨日、esptool は C 製のを使うことがわかったので今回は実際に ESP12 に書き込んでみます。

まだ、PCB ボードは作っていませんが、開発ボードにとりあえず書き込めるかやってみようと思います。

 

書き込む開発ボードは、以下のものです。他2台は、以前にあれこれやっている最中に3.3V 以上入れすぎて壊れたようです。2台は昇天しましたので、正常なのはこれと、あと未開封のが1つあります。

dev

 

さて、ソースディレクトリに移動し、make flash してみます。

HOPE:espeink junkhack$ make flash
esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de>
opening port /dev/cu.SLAB_USBtoUART at 115200
opening bootloader
resetting board
trying to connect
trying to connect
Uploading 37632 bytes from firmware/0x00000.bin to flash at 0x00000000
.....................................
starting app without reboot
closing bootloader
Please put the ESP in bootloader mode...★再度、RST を GND に
esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de>
opening port /dev/cu.SLAB_USBtoUART at 115200
opening bootloader
resetting board
trying to connect
trying to connect
Uploading 166264 bytes from firmware/0x40000.bin to flash at 0x00040000
...................................................................................................................................................................
starting app without reboot
closing bootloader
HOPE:espeink junkhack$ 

 

こんな感じになれば書き込みはOK なようです。

esptool(esptool-ck) が、ファームウェアが2つ書き込むのですが、2つ目の時にも再度書き込みモードを要求してくるようなので、RST pin をGNDに落としてブートモードにします。このあたりは、実際のPCB 基盤につけた状態だとどうなるのでしょうかね?要検討です。

 

続いて、html を mkespfsimage というツールを使って圧縮しそれを 0x12000 の領域に書き込むようです。これは、以下のコマンドを使って作ることができます。

$ make webpages.espfs

が、ここで問題が2つ発生。まず、osx だと、これを実行すると、昨日試したように、

HOPE:espeink junkhack$ make webpages.espfs
cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd ..
/bin/sh: ../mkespfsimage/mkespfsimage: cannot execute binary file
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]
HOPE:espeink junkhack$

 

となってしまいfind の使い方が悪いよと、出てしまいます。make ファイルに書いてあるようにコマンドを実行してみますと

HOPE:espeink junkhack$ cd html/
HOPE:html junkhack$ find
usage: find [-H | -L | -P] [-EXdsx] [-f path] path ... [expression]
       find [-H | -L | -P] [-EXdsx] -f path [path ...] [expression]

 

となります。osx の find は、引数を与えないとデフォルトでは出ない仕様のようです。なので、GNU の find を入れます。

$ brew install findutils --with-default-names

 

まず、1つ目の問題はこれでクリアです。しかし、まだ以下のようになります。

HOPE:espeink junkhack$ make webpages.espfs
cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd ..
/bin/sh: ../mkespfsimage/mkespfsimage: cannot execute binary file

 

シェルが、mkespfsimage の、バイナリファイルを実行できないようです。このコマンドを再度 make してみます。

HOPE:mkespfsimage junkhack$ cd mkespfsimage

HOPE:mkespfsimage junkhack$ make clean
rm -f mkespfsimage main.o heatshrink_encoder.o
HOPE:mkespfsimage junkhack$ 

HOPE:mkespfsimage junkhack$ make
cc -I../lib/heatshrink -std=gnu99   -c -o main.o main.c
main.c:59:38: warning: passing 'char *' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types with
      different sign [-Wpointer-sign]
                        sres=heatshrink_encoder_sink(enc, inp, insize, &len);
                                                          ^~~
../lib/heatshrink/heatshrink_encoder.h:97:14: note: passing argument to parameter 'in_buf' here
    uint8_t *in_buf, size_t size, size_t *input_size);
             ^
main.c:65:38: warning: passing 'char *' to parameter of type 'uint8_t *' (aka 'unsigned char *') converts between pointers to integer types with
      different sign [-Wpointer-sign]
                        pres=heatshrink_encoder_poll(enc, outp, outsize, &len);
                                                          ^~~~
../lib/heatshrink/heatshrink_encoder.h:102:14: note: passing argument to parameter 'out_buf' here
    uint8_t *out_buf, size_t out_buf_size, size_t *output_size);
             ^
2 warnings generated.
cc -I../lib/heatshrink -std=gnu99   -c -o heatshrink_encoder.o heatshrink_encoder.c
cc -o mkespfsimage main.o heatshrink_encoder.o
HOPE:mkespfsimage junkhack$

 

とりあえず、なんか警告は出ていますができたようです。Linux (Ubuntu)のgcc 4.8.2では以下のようになりました。

root@ub:~/work/espeink/mkespfsimage# rm mkespfsimage
root@ub:~/work/espeink/mkespfsimage# make clean
rm -f mkespfsimage main.o heatshrink_encoder.o
root@ub:~/work/espeink/mkespfsimage# 
root@ub:~/work/espeink/mkespfsimage# make
cc -I../lib/heatshrink -std=gnu99   -c -o main.o main.c
cc -I../lib/heatshrink -std=gnu99   -c -o heatshrink_encoder.o heatshrink_encoder.c
cc -o mkespfsimage main.o heatshrink_encoder.o
root@ub:~/work/espeink/mkespfsimage# 

 

osx では、gcc に以下を使っていたので出たようです。

HOPE:mkespfsimage junkhack$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.0 (clang-600.0.57) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin13.4.0
Thread model: posix

 

とりあえず、警告は出ていますが、ビルドはされているようなので、スルーします。さて、これで2番目の問題も解決できたはずです。実行してみますと、以下のようになりました。

HOPE:espeink junkhack$ make webpages.espfs
cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd ..
140medley.min.js (74%)
apconnect.bm (15%)
batempty.bm (13%)
connecting.html (95%)
icons.png (100%)
neterror.bm (16%)
style.css (73%)
wifi.tpl (54%)
HOPE:espeink junkhack$ 

HOPE:espeink junkhack$ ll
total 120
-rw-r--r--@  1 junkhack  staff   4946  9 24 21:27 Makefile
-rw-r--r--@  1 junkhack  staff   3261  9 23 15:34 Makefile.patch
-rw-r--r--@  1 junkhack  staff   4960  9 11 00:13 Makefile_org
-rw-r--r--@  1 junkhack  staff    207  9 22 22:32 README
drwxr-xr-x   6 junkhack  staff    204  9 24 21:31 build
drwxr-xr-x   4 junkhack  staff    136  9 24 21:31 firmware
drwxr-xr-x  10 junkhack  staff    340  9 22 22:32 html
drwxr-xr-x   5 junkhack  staff    170  9 22 22:32 icons
drwxr-xr-x  10 junkhack  staff    340  9 22 22:32 include
drwxr-xr-x   3 junkhack  staff    102  9 22 22:32 lib
drwxr-xr-x   9 junkhack  staff    306  9 26 22:08 mkespfsimage
-rw-r--r--   1 junkhack  staff    638  9 22 22:32 mkimg.php
drwxr-xr-x   4 junkhack  staff    136  9 22 22:32 server
drwxr-xr-x  24 junkhack  staff    816  9 22 22:32 user
-rw-r--r--   1 junkhack  staff  31024  9 26 22:17 webpages.espfs★
HOPE:espeink junkhack$

 

★のファイルが生成されていればOK です。

なるほど、これでesp12 の中に入っているweb サーバがこのファイルシステムの中のファイルを読んで表示しているんですね。

やっとこれでhtml が書き込めるはずです。以下のようになりました。

HOPE:espeink junkhack$ make htmlflash
if [ $(stat -c '%s' webpages.espfs) -gt $(( 0x2E000 )) ]; then echo "webpages.espfs too big!"; false; fi
stat: illegal option -- c
usage: stat [-FlLnqrsx] [-f format] [-t timefmt] [file ...]
/bin/sh: line 0: [: -gt: unary operator expected
esptool -cp /dev/cu.SLAB_USBtoUART -cb 115200 -ca 0x12000 -cf webpages.espfs -v
esptool vb64eebd - (c) 2014 Ch. Klippel <ck@atelier-klippel.de>
opening port /dev/cu.SLAB_USBtoUART at 115200
opening bootloader
resetting board
trying to connect
trying to connect
Uploading 31024 bytes from webpages.espfs to flash at 0x00012000
...............................
starting app without reboot
closing bootloader
HOPE:espeink junkhack$ 

 

書き込めてはいるようですが、最初の部分で stat の使い方が悪そうと出ています。おそらくこれは、ファイルがでか過ぎないかどうかを見ているんだと思いますが、とりあえずスルーします。

あとは設定とか、WiFi E-ink とそれを見に行くサーバの設定などとなるはずです。

 

▼まとめ

・ESP12 で動作するWEB は、圧縮されたファイルシステムの中のファイルを見に行く

・そのファイルは、mkespfsimage で heatshrink を使った圧縮で作成される

・osx の find はデフォルト引数なしだと、動作しないので、gnu 版を入れる

・mkspsimage コマンドは、再度コンパイルする。

・ESP12 への書き込みは、ファームウェアは、make flash で書き込む

・ESP12 へのhtml ファイルの書き込みは、make htmlflash を使う

・make htmlflash を使ったとき、ファイルサイズの大きさをチェックしているようですがこれがosx では、動作していない模様

・おそらく書き込みには、Linux を使ったほうが楽です。

 

まだ、良くわからないことがありますが、それは追って調査します。

▼良くわからないこと

・最初の起動時に、192.168.4.1 で mode(3) のステーションで起動してくるが、このときのwifi アクセスポイントに入るパスワードは?

・EPS12 が設定を終えれば、定期間隔でWEB サーバを見に行くが、この処理はどうやればいいのか?

 

推測では、画像のURL を指定すればいける気がします。その画像ファイルは、bm 形式のもので。このあたりは、もう少し調査しないと白黒言えませんが、なんとかいけそうな気がしてきましたので、部品を発注したり、基板を発注したりするかどうか考えて見ます。実際のボードとE-ink ディスプレイがないとこれ以上の確認はちょっと厳しいです。できなくはないですが、あとは現場合わせで楽しんでもいいかなぁと。