espeink make その3

さて、その後esptool っていうのを調査しました。

Makefile には、-eo や、2番目の引数の変数に展開される –bo や –bs などがあります。

---- Makefile
::
# we create two different files for uploading into the flash
# these are the names and options to generate them
FW_FILE_1    = 0x00000
FW_FILE_1_ARGS    = -bo @ -bs .text -bs .data -bs .rodata -bc -ec
FW_FILE_2    = 0x40000
FW_FILE_2_ARGS    = -es .irom0.text@ -ec
::
(FW_FILE_1):(TARGET_OUT) firmware
    (vecho) "FW@"
    (Q)(ESPTOOL) -eo (TARGET_OUT)(FW_FILE_1_ARGS)★
::

 

python の esptool.py の引数をチェックしてみると

https://github.com/themadinventor/esptool/blob/master/esptool.py

そんな引数はないので、おかしいよなぁと思い再度ググると、esptool-ck という C で書かれたヘルパーツールがあるじゃありませんか? esptool という名前は同じなので、てっきりpython のツールのことだと思っていました。

https://github.com/igrr/esptool-ck

あ、これですね、きっと。入れてみることに。

▼esptool-ck

・以下よりdownload

https://github.com/igrr/esptool-ck/releases

 

osx なので、ボリュームをマウントしておきます。

$ sudo hdiutil mount ~/Documents/case-sensitive.dmg
$ cd /Volumes/case-sensitive

バージョンは新しいのをまず試してみます。

$ wget https://github.com/igrr/esptool-ck/archive/0.4.6.tar.gz
$ tar xvfz 0.4.6.tar.gz 
$ mv esptool-ck-0.4.6/ esptool-ck
$ cd esptool-ck

 

gcc は入っているので、make し実行権限をつけます。

$make
$ chmod +x esptool

 

・/opt/配下にシンボリックリンクを張っておきます。

$ sudo ln -s /Volumes/case-sensitive/esp-open-sdk/ /opt/Espressif

・パスを反映

$ export PATH=/opt/Espressif/xtensa-lx106-elf/bin:/opt/Espressif/esptool-ck:$PATH
$ echo 'export PATH=/opt/Espressif/xtensa-lx106-elf/bin:/opt/Espressif/esptool-ck:$PATH' >> ~/.bashrc

・呼び出せればOK

$ which esptool
/opt/Espressif/esptool-ck/esptool

★espeink のソースディレクトリへ

sed -i 's/opt\/Espressif\/crosstool-NG\/builds\/xtensa-lx106-elf\/bin/opt\/Espressif\/xtensa-lx106-elf\/bin/g' Makefile
sed -i 's/\/opt\/Espressif\/ESP8266_SDK/\/opt\/Espressif\/sdk\//g' Makefile
sed -i 's/\/opt\/Espressif\/include/\/opt\/Espressif\/sdk\/include/g' Makefile
sed -i 's/\/opt\/Espressif\/arch\/lib/\/opt\/Espressif\/sdk\/lib/g' Makefile
sed -i 's/ttyUSB0/cu.SLAB_USBtoUART/g' Makefile

 

さて、make されてファームウェアもできるでしょうか?

$ make
CC user/cgiwifi.c
CC user/config.c
CC user/eink.c
CC user/espfs.c
CC user/heatshrink_decoder.c
CC user/httpd.c
CC user/httpdclient.c
CC user/httpdespfs.c
CC user/io.c
CC user/stdout.c
CC user/user_main.c
AR build/einkdisp_app.a
LD build/einkdisp.out
FW firmware/0x00000.bin
FW firmware/0x40000.bin

 

あっさり行けましたね。でも、サイズが小さいような気がします。

$ ls -al build/ firmware/
build/:
total 1464
drwxr-xr-x   6 junkhack  staff     204  9 25 02:03 .
drwxr-xr-x  16 junkhack  staff     544  9 25 02:03 ..
drwxr-xr-x   2 junkhack  staff      68  9 25 02:03 driver
-rwxr-xr-x   1 junkhack  staff  514717  9 25 02:03 einkdisp.out
-rw-r--r--   1 junkhack  staff  231744  9 25 02:03 einkdisp_app.a
drwxr-xr-x  13 junkhack  staff     442  9 25 02:03 user

firmware/:
total 408
drwxr-xr-x   4 junkhack  staff     136  9 25 02:03 .
drwxr-xr-x  16 junkhack  staff     544  9 25 02:03 ..
-rw-r--r--   1 junkhack  staff   37632  9 25 02:03 0x00000.bin
-rw-r--r--   1 junkhack  staff  166264  9 25 02:03 0x40000.bin

 

500k くらいあるeinkdisp.out がファームに入っていないような気がします。ユーザ領域じゃないのでしょうかね。メモリマップはあまり見ていないので、これをどのように書き込めばいいかはまだ不明です。

 

が、コンパイルはエラーなく通るようになりました。

SDK は、1.0.1 でとりあえずやっています。

$ cd /opt/Espressif/
HOPE:Espressif junkhack$ ll
total 128
-rw-r--r--   1 junkhack  staff  11263  9 22 22:52 Makefile
-rw-r--r--   1 junkhack  staff   5725  9 22 22:52 README.md
-rw-r--r--   1 junkhack  staff   1101  9 22 22:52 c_types-c99.patch
drwxr-xr-x  18 junkhack  staff   1462  9 22 23:24 crosstool-NG
-rw-r--r--   1 junkhack  staff    199  9 22 22:52 crosstool-config-overrides
-rw-r--r--   1 junkhack  staff    146  9 22 22:52 empty_user_rf_pre_init.c
drwxr-xr-x@ 10 junkhack  staff    442  9 23 22:34 esp_iot_sdk_v0.9.5
drwxr-xr-x@ 10 junkhack  staff    374  4 24 17:08 esp_iot_sdk_v1.0.1
drwxr-xr-x@ 10 junkhack  staff    408  9 23 14:43 esp_iot_sdk_v1.1.1
drwxr-xr-x@ 10 junkhack  staff    374  6 12 20:49 esp_iot_sdk_v1.1.2
drwxr-xr-x  10 junkhack  staff    442  9 23 00:24 esp_iot_sdk_v1.3.0
drwxr-xr-x@ 10 junkhack  staff    374  9 18 21:55 esp_iot_sdk_v1.4.0
drwxr-xr-x   2 junkhack  staff    272  9 22 22:56 esptool
drwxr-xr-x   9 junkhack  staff    646  9 24 19:58 esptool-ck
drwxr-xr-x   9 junkhack  staff    510  9 24 19:44 esptool-ck_git
drwxr-xr-x   2 junkhack  staff    170  9 22 22:52 examples
drwxr-xr-x   6 junkhack  staff    612  9 23 00:25 lx106-hal
-rw-r--r--   1 junkhack  staff  24726  8  8 16:20 release_note.txt
lrwxr-xr-x   1 junkhack  staff     18  9 23 23:53 sdk -> esp_iot_sdk_v1.0.1
drwxr-xr-x   8 junkhack  staff    306  9 23 00:21 xtensa-lx106-elf

 

Makefile には、以下のオプションも指定されているので、書き込みできるはずです。

::
flash: (FW_FILE_1)(FW_FILE_2)
    (Q)(ESPTOOL) -cp (ESPPORT) -cb(ESPBAUD) -ca 0x00000 -cf firmware/0x00000.bin -v
    (Q) [(ESPDELAY) -ne 0 ] && echo "Please put the ESP in bootloader mode..." || true
    (Q) sleep(ESPDELAY) || true
    (Q)(ESPTOOL) -cp (ESPPORT) -cb(ESPBAUD) -ca 0x40000 -cf firmware/0x40000.bin -v

::


webpages.espfs: html/ mkespfsimage/mkespfsimage
    cd html; find | ../mkespfsimage/mkespfsimage > ../webpages.espfs; cd ..

mkespfsimage/mkespfsimage: mkespfsimage/
    make -C mkespfsimage

htmlflash: webpages.espfs
    if [ (stat -c '%s' webpages.espfs) -gt(( 0x2E000 )) ]; then echo "webpages.espfs too big!"; false; fi
    (ESPTOOL) -cp(ESPPORT) -cb $(ESPBAUD) -ca 0x12000 -cf webpages.espfs -v
::

土日にesp に書き込んでみることにします。

 

esp12 をつなげていないと、以下のようになりました。

HOPE:espeink junkhackmake 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 

HOPE:espeink junkhackmake mkespfsimage/mkespfsimage
make: `mkespfsimage/mkespfsimage' is up to date.
HOPE:espeink junkhack 

HOPE:espeink junkhackmake 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 <[email protected]>
opening port /dev/cu.SLAB_USBtoUART at 115200
opening bootloader
resetting board
trying to connect
trying to connect
trying to connect
resetting board
trying to connect
trying to connect
trying to connect
resetting board
trying to connect
trying to connect
trying to connect
warning: espcomm_sync failed
error: espcomm_open failed
make: *** [htmlflash] Error 255
HOPE:espeink junkhack 

HOPE:espeink junkhackmake flash
esptool vb64eebd - (c) 2014 Ch. Klippel <[email protected]>
opening port /dev/cu.SLAB_USBtoUART at 115200
opening bootloader
resetting board
trying to connect
trying to connect
trying to connect
resetting board
trying to connect
trying to connect
trying to connect
resetting board
trying to connect
trying to connect
trying to connect
warning: espcomm_sync failed
error: espcomm_open failed
make: *** [flash] Error 255
HOPE:espeink junkhack 

▼まとめ

・esptool は python のじゃなくて、C 製の esptool-ck というのを使う

・esptool-ck にはいろいろなオプションがあるようです。

・配線を以下のようにして、resetmethod=wifio などとすれば、UART の RTS and DTRを使ってブートモードにしたりできるようです。

https://github.com/esp8266/Arduino/issues/22

・できた2つのファームはサイズが小さいようだが?

・make のオプションに書き込みや、その他の何か作業するものがある

espeink make その2

作者にヘルプ要請を出しておきました。作者からレスポンスがあるまで、自分なりにもう少し調べみます。

その後、再調査でSDK 1.3.0を使うと、
unknown type name ‘uint16_t’
が出るようです。以下に情報が。

https://github.com/pfalcon/esp-open-sdk/issues/90

これは、再度指定すれば回避できそうです。
#include <stdint.h>

まぁ、でもこんなことは作者はやっていないわけで、ということは、もっと古いsdkでやっているということだと思うので代えてみます。esp_iot_sdk_v1.1.1 で とりあえずチャレンジ。

$ rm sdk
$ ln -s esp_iot_sdk_v1.1.1 sdk

・unknown type name は出なくなるが、conflicting types が出る。

    $ make
    CC user/cgiwifi.c
    In file included from user/cgiwifi.c:20:0:
    include/espmissingincludes.h:42:5: error: conflicting types for 'os_random'
     int os_random();
         ^
    In file included from user/cgiwifi.c:15:0:
    /Volumes/case-sensitive/esp-open-sdk/sdk/include/osapi.h:45:15: note: previous declaration of 'os_random' was here
     unsigned long os_random(void);
                   ^
    make: *** [build/user/cgiwifi.o] Error 1

 

・ちょっと状況は違うかもですが、以下に情報が。


http://www.esp8266.com/viewtopic.php?p=18868

おそらく作者からのコメントで、include/espmissingincludes.h のos_randomを取ってしまえば?と。

はい、とりました。

---- espmissingincludes.h
::
uint32 system_get_time();
//int os_random();
int rand(void);
::

 

・すると、user/cgiwifi.c は通り、次なるエラーが。プロトタイプ宣言がないようです。

    $ make
    CC user/cgiwifi.c
    CC user/config.c
    CC user/eink.c
    user/eink.c: In function 'einkTimerCb':
    user/eink.c:60:3: error: implicit declaration of function 'os_update_cpu_frequency' [-Werror=implicit-function-declaration]
       os_update_cpu_frequency(160);
       ^
    cc1: all warnings being treated as errors
    make: *** [build/user/eink.o] Error 1

 

 

einkTimerCb関数の中から呼ばれているようです。

こいつは、ソース全体をgrep しても出ないので、sdk の組み込み関数のようです。なんと宣言すればよいのでしょうかね?

以下のリリースノートによると、esp_iot_sdk_v1.1.0_15_05_26 でなくなったようです!

http://www.esp8266.com/viewtopic.php?p=18496

その前の、esp_iot_sdk_v1.0.1/include/osapi.h にはあるようです。

ということは、作者はesp_iot_sdk_v1.0.1より前のSDK を使っていたということですね。

ソース修正はとりあえず、後回しで、今は作者の環境を推測し、最後までコンパイルが通る環境を探るのが優先です。

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

の一覧から、esp_iot_sdk_v1.0.1_15_04_24 がありました。

リリース日は、Fri Apr 24, 2015 10:49 pm です。

http://bbs.espressif.com/viewtopic.php?f=46&t=398

ダウンロードし、解凍してシンボリックリンクを張り直します。

$ rm sdk

$ ln -s esp_iot_sdk_v1.0.1 sdk

・再度make

$ make clean
$ make
CC user/cgiwifi.c
CC user/config.c
CC user/eink.c
CC user/espfs.c
CC user/heatshrink_decoder.c
CC user/httpd.c
CC user/httpdclient.c
CC user/httpdespfs.c
CC user/io.c
CC user/stdout.c
CC user/user_main.c
AR build/einkdisp_app.a
LD build/einkdisp.out
FW firmware/0x00000.bin
make: esptool: No such file or directory
make: *** [firmware/0x00000.bin] Error 1

 

・おおお、make は通ったようです。esptool がないとか言っていますね。

$ which esptool.py

/usr/local/bin/esptool.py

・あるので、以下のように指定し直します。

---- Makefile
::
#Esptool.py path and port
ESPTOOL        ?= /usr/local/bin/esptool.py
::

・さて、再度挑戦。

$ make clean
$ make
CC user/cgiwifi.c
CC user/config.c
CC user/eink.c
CC user/espfs.c
CC user/heatshrink_decoder.c
CC user/httpd.c
CC user/httpdclient.c
CC user/httpdespfs.c
CC user/io.c
CC user/stdout.c
CC user/user_main.c
AR build/einkdisp_app.a
LD build/einkdisp.out
FW firmware/0x00000.bin
usage: esptool [-h] [--port PORT] [--baud BAUD]
               
               {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,flash_id,read_flash,erase_flash}
               ...
esptool: error: argument operation: invalid choice: 'build/einkdisp.out' (choose from 'load_ram', 'dump_mem', 'read_mem', 'write_mem', 'write_flash', 'run', 'image_info', 'make_image', 'elf2image', 'read_mac', 'flash_id', 'read_flash', 'erase_flash')
make: *** [firmware/0x00000.bin] Error 2

 

・ううむ、esptool の使い方が違うよと出ているようです。

makefile には次のように書かれています。

---- Makefile
::
(FW_FILE_1):(TARGET_OUT) firmware
    (vecho) "FW@"
    (Q)(ESPTOOL) -eo (TARGET_OUT)(FW_FILE_1_ARGS)
::

 

使い方は、以下のようです。

-eo とかなんでしょうね? 説明にありませんが、、、

 

    $ esptool.py -h
    usage: esptool [-h] [--port PORT] [--baud BAUD]
                   
                   {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,flash_id,read_flash,erase_flash}
                   ...
    
    ESP8266 ROM Bootloader Utility
    
    positional arguments:
      {load_ram,dump_mem,read_mem,write_mem,write_flash,run,image_info,make_image,elf2image,read_mac,flash_id,read_flash,erase_flash}
                            Run esptool {command} -h for additional help
        load_ram            Download an image to RAM and execute
        dump_mem            Dump arbitrary memory to disk
        read_mem            Read arbitrary memory location
        write_mem           Read-modify-write to arbitrary memory location
        write_flash         Write a binary blob to flash
        run                 Run application code in flash
        image_info          Dump headers from an application image
        make_image          Create an application image from binary files
        elf2image           Create an application image from ELF file
        read_mac            Read MAC address from OTP ROM
        flash_id            Read SPI flash manufacturer and device ID
        read_flash          Read SPI flash content
        erase_flash         Perform Chip Erase on SPI flash
    
    optional arguments:
      -h, --help            show this help message and exit
      --port PORT, -p PORT  Serial port device
      --baud BAUD, -b BAUD  Serial port baud rate

 

・変数には以下が入っているので、★は以下のようです。

/usr/local/bin/esptool.py -eo build/einkdisp.out -bo $@ -bs .text -bs .data -bs .rodata -bc -ec

 

うーん、よくわかりませんね。まぁ、とにかくesptool.pyの使い方ということを調査すれば解決するかもです。

esptool.pyっていうのは、アップロードするだけのものと思っていましたが、他にも用途があるということですかね。

 

---- Makefile
::
BUILD_BASE    = build
::
ESPTOOL        ?= /usr/local/bin/esptool.py
::
# name for the target project
TARGET        = einkdisp
::
TARGET_OUT    := (addprefix(BUILD_BASE)/,(TARGET).out)
::
# we create two different files for uploading into the flash
# these are the names and options to generate them
FW_FILE_1    = 0x00000
FW_FILE_1_ARGS    = -bo@ -bs .text -bs .data -bs .rodata -bc -ec
FW_FILE_2    = 0x40000
FW_FILE_2_ARGS    = -es .irom0.text @ -ec
::(FW_FILE_1): (TARGET_OUT) firmware(vecho) "FW @"(Q) (ESPTOOL) -eo(TARGET_OUT) $(FW_FILE_1_ARGS)★
::

 

・以下な感じにしてみると、作られますが、ファイルサイズが小さいので、やっぱりだめかな?

---- Makefile
::
(FW_BASE)/%.bin:(TARGET_OUT) | (FW_BASE)(vecho) "FW (FW_BASE)/"(Q) (ESPTOOL) elf2image -o(FW_BASE)/ (TARGET_OUT)
#(Q) (ESPTOOL) -o(TARGET_OUT) (FW_FILE_1_ARGS)(FW_FILE_2): (TARGET_OUT) firmware(vecho) "FW (FW_BASE)/"(Q) (ESPTOOL) -o(TARGET_OUT) $(FW_FILE_2_ARGS)
::

 

$ make
CC user/cgiwifi.c
CC user/config.c
CC user/eink.c
CC user/espfs.c
CC user/heatshrink_decoder.c
CC user/httpd.c
CC user/httpdclient.c
CC user/httpdespfs.c
CC user/io.c
CC user/stdout.c
CC user/user_main.c
AR build/einkdisp_app.a
LD build/einkdisp.out
FW firmware/

$ ls -ltr firmware/ build/
firmware/:
total 408
-rw-r--r--  1 junkhack  staff  166264  9 24 02:00 0x40000.bin
-rw-r--r--  1 junkhack  staff   37632  9 24 02:00 0x00000.bin

build/:
total 1464
drwxr-xr-x   2 junkhack  staff      68  9 23 02:05 driver
drwxr-xr-x  13 junkhack  staff     442  9 24 02:00 user
-rw-r--r--   1 junkhack  staff  231984  9 24 02:00 einkdisp_app.a
-rwxr-xr-x   1 junkhack  staff  514957  9 24 02:00 einkdisp.out

 

このあたりを読んでみますか。

https://github.com/themadinventor/esptool

とりあえず、本日はここまで。

▼まとめ

・sdk は、esp_iot_sdk_v1.0.1より前のを使っていたようです。

・esp_iot_sdk_v1.0.1_15_04_24 でコンパイルエラーはなくなった

・esptool.py でファームウェアを作るところがうまくいかない

・linux 版のesptool.py とかだと、あのオプション指定が通るのか?

・実行ファイルeinkdisp.outは、作成できている模様

・ファームウェアのどの領域にどうやって作成するのかを調査すればよさそう

espeink のソースをコンパイル

さて、ハードの調査が終わったので、今度はソースファイルの調査です。

まず、ざっとソースコードを見てみます。

osx 10.9.5 でやっています。

▼ソースをゲット
$ git clone http://git.spritesserver.nl/espeink.git/
$ cd espeink/
$ git submodule init
$ git submodule update

以下のことがわかりました。

▼ソフトウェア概略
・ESP12 の中で動作するwebサーバがmkespfsimageを使いe-ink にレンダリング
・データ受け渡しは、PhantomJS(pixelserver.js)を使っているよう
・画像形式は、.bm という白黒2値(グレー表示はあるのかな?)800×600を使用
・デフォルトで60秒ごとにsleep から目覚めるよう -> sleeptime , system_deep_sleep(60*1000*1000);
・初回起動時は、アクセスポイントの表示の初期設定が動作。メモリの特定領域に値があるかないかを見ている模様 -> RTC_MAGIC
・ライセンスは、Beer-Ware license 🙂
https://en.wikipedia.org/wiki/Beerware
  これは作者のジョークかと。GPLライブラリーにリンクしているのでこのソースもGPLになりますが、
  何か作者に送りたいですよね。
・圧縮ライブラリに、Heatshrink使用
https://github.com/atomicobject/heatshrink
  Lempel–Ziv–Storer–Szymanski (LZSS)ベースのようです。
・ソースをビルドするには、SDK (toolchain) が必要
・esp-open-sdkの環境を作れば良いかと思う
・環境構築は、osx でまずチャレンジ

 

PhantomJSって何でしょうか?

とりあえず、まぁ、使ってみれば理解も深まるはずです。

osx のローカルに入れてみます。

$ brew install phantomjs

サンプルはググって以下のようにしました。

---- test.js
// Headless ブラウザの生成
var page = require('webpage').create();

// URL を開く
page.open('http://hack.gpl.jp/about/', function(status) {
    if (status === 'success') {
        // スクリーンキャプチャ
        page.render('junkhack.png');
        // ブラウザ内で JS を実行してデータを受け取る
        var title = page.evaluate(function() {
            var title = document.title;
            return title;
        });
        console.log(title);
    }
    // exit しないと終了しない
    phantom.exit();
});

 

・実行してみます。

$ phantomjs test.js

カレントディレクトリに、junkhack.png ができている。ほーなるほど。

ということは、PhantomJSが動作するサーバが必要だってことでしょうかね?ESP12 でPhantomJSが動作するということですかね?ちょっとこのあたりは良くわかっていません。

その内、進むにつれ解るはずだと思うので、スルーします。

 

junkhack 2

とりあえず、osx でビルドする環境を整えてみることにしてみます。

 

▼ビルドする環境の構築 for osx 10.9.5

・以下にある説明通り

https://github.com/pfalcon/esp-open-sdk

$ brew tap homebrew/dupes

$ brew install binutils coreutils automake wget gawk libtool gperf gnu-sed –with-default-names grep

★ちょっと時間はかかります。エラーになっていないかコンソールを確認。

 

・sed は gnu のを使うようにするようです。以下のようにならなければ、パスを.bash_profileに設定しておきます。

    $ which sed

    /usr/local/opt/gnu-sed/libexec/gnubin/sed

$ export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"

 

・10G の大文字小文字ファイル名を区別するHFS+ボリュームを作製。マウントし、移動。

$ sudo hdiutil create ~/Documents/case-sensitive.dmg -volname "case-sensitive" -size 10g -fs "Case-sensitive HFS+"
$ sudo hdiutil mount ~/Documents/case-sensitive.dmg
$ cd /Volumes/case-sensitive

$ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git

スタンドアローンなSDK を作れば、-Iと-Lフラグを付けなくてよいようですが、espeink のmakefile は

-I と -L は指定されているので、SDK を分離して作ります。

$ cd esp-open-sdk/

$ make STANDALONE=n

★ちょっと時間はかかります。コーヒータイムです。

ESP8266 のチップは、ケイデンス・デザイン・システムズ社が作っているXtensaプロセッサなんですね。

Espressif Systems社がカスタマイズした、テンシリカXtensaプロセッサが載っているということの

ようです。

https://www.cadence.co.jp/news/2015-01-29-929.html

 

・さて、以下のようになっていればOKです。パスを追加します。

    ::

    Xtensa toolchain is built, to use it:

    export PATH=/Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

    Espressif ESP8266 SDK is installed. Toolchain contains only Open Source components

    To link external proprietary libraries add:

    xtensa-lx106-elf-gcc -I/Volumes/case-sensitive/esp-open-sdk/sdk/include -L/Volumes/case-sensitive/esp-open-sdk/sdk/lib

 

・ここもパスを通しておきます。

---- .bashrc 追記
export PATH=/Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin:$PATH
以下に、コンパイラがあります。

$ ls /Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin

esptool.py            xtensa-lx106-elf-ct-ng.config    xtensa-lx106-elf-gcov        xtensa-lx106-elf-ranlib

xtensa-lx106-elf-addr2line    xtensa-lx106-elf-elfedit    xtensa-lx106-elf-gdb        xtensa-lx106-elf-readelf

xtensa-lx106-elf-ar        xtensa-lx106-elf-g++        xtensa-lx106-elf-gprof        xtensa-lx106-elf-size

xtensa-lx106-elf-as        xtensa-lx106-elf-gcc        xtensa-lx106-elf-ld        xtensa-lx106-elf-strings

xtensa-lx106-elf-c++        xtensa-lx106-elf-gcc-4.8.2    xtensa-lx106-elf-ld.bfd        xtensa-lx106-elf-strip

xtensa-lx106-elf-c++filt    xtensa-lx106-elf-gcc-ar        xtensa-lx106-elf-nm

xtensa-lx106-elf-cc        xtensa-lx106-elf-gcc-nm        xtensa-lx106-elf-objcopy

xtensa-lx106-elf-cpp        xtensa-lx106-elf-gcc-ranlib    xtensa-lx106-elf-objdump

 

・コンパイラが呼び出せればOKです。

$ which xtensa-lx106-elf-gcc

/Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc

$ xtensa-lx106-elf-gcc –version

xtensa-lx106-elf-gcc (crosstool-NG 1.20.0) 4.8.2

Copyright (C) 2013 Free Software Foundation, Inc.

This is free software; see the source for copying conditions.  There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

・何かコンパイルして動作確認してみましょう。

$ git clone https://github.com/esp8266/source-code-examples.git
$ cd source-code-examples/blinky

 

・sed で make ファイルの指定を書き換えます。

※パスがあるので、解りにくい。sed は s/置き換え前/置き換え後/g です。

以下だと、

Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin

を以下に置き換え

esp-open-sdk/xtensa-lx106-elf/bin

  Espressif/ESP8266_SDK

  を以下に置き換え

  esp-open-sdk/sdk

  Espressif

  を以下に置き換え

  esp-open-sdk

  opt/

  を以下に置き換え

  Volumes/case-sensitive/

$ sed -i 's/Espressif\/crosstool-NG\/builds\/xtensa-lx106-elf\/bin/esp-open-sdk\/xtensa-lx106-elf\/bin/g' Makefile
$ sed -i 's/Espressif\/ESP8266_SDK/esp-open-sdk\/sdk/g' Makefile
$ sed -i 's/Espressif/esp-open-sdk/g' Makefile
$ sed -i 's/opt\//Volumes\/case-sensitive\//g' Makefile

 

make してみます。

$ make

・以下が実行結果です。エラーなくビルドできればまぁ、動くでしょう。

$ tree

.

├── Makefile

├── README

├── build

│   ├── app.out★実行バイナリファイル

│   ├── app_app.a

│   ├── driver

│   └── user

│       └── user_main.o

├── firmware

│   ├── 0x00000.bin★

│   └── 0x40000.bin★

└── user

    ├── user_config.h

    └── user_main.c

5 directories, 9 files

 

▼とりあえず、esp-open-sdk でコンパイルしてみます。Makefile のコピーを取ってパスを書き換え。

$ cd espeinkのソース

$ cp Makefile Makefile_org

※行頭の$ は取ってあります。

sed -i 's/Espressif\/crosstool-NG\/builds\/xtensa-lx106-elf\/bin/esp-open-sdk\/xtensa-lx106-elf\/bin/g' Makefile
sed -i 's/Espressif\/ESP8266_SDK/esp-open-sdk\/sdk/g' Makefile
sed -i 's/Espressif/esp-open-sdk/g' Makefile
sed -i 's/opt\/Espressif\/arch\/lib/Volumes\/case-sensitive\/esp-open-sdk\/sdk\/lib/g' Makefile
sed -i 's/opt\//Volumes\/case-sensitive\//g' Makefile

・osx じゃなく、Linux でやっている場合はほどよく書き換え。以下のようにパスを変更しました。

$ diff Makefile Makefile_org 
15c15
< XTENSA_TOOLS_ROOT ?= /Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin
---
> XTENSA_TOOLS_ROOT ?= /opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin
18,19c18,19
< SDK_EXTRA_INCLUDES ?= /Volumes/case-sensitive/esp-open-sdk/include
< SDK_EXTRA_LIBS ?= /Volumes/case-sensitive/esp-open-sdk/sdk/lib
---
> SDK_EXTRA_INCLUDES ?= /opt/Espressif/include
> SDK_EXTRA_LIBS ?= /opt/Espressif/arch/lib
22c22
< SDK_BASE    ?= /Volumes/case-sensitive/esp-open-sdk/sdk
---
> SDK_BASE    ?= /opt/Espressif/ESP8266_SDK

 

・さて、makeしてみます。

make しましたが、なんかエラーでますね。作者は、SDK バージョンいくつを使っていたのでしょうか?

unknown type name ‘uint32_t’

unknown type name ‘uint8_t’

unknown type name ‘uint16_t’

conflicting types for ‘os_random’

    $ make

    CC user/cgiwifi.c

    In file included from /Volumes/case-sensitive/esp-open-sdk/sdk/include/os_type.h:10:0,

                     from /Volumes/case-sensitive/esp-open-sdk/sdk/include/user_interface.h:9,

                     from user/cgiwifi.c:17:

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/ets_sys.h:14:1: error: unknown type name ‘uint32_t’

     typedef uint32_t ETSSignal;

     ^

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/ets_sys.h:15:1: error: unknown type name ‘uint32_t’

     typedef uint32_t ETSParam;

     ^

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/ets_sys.h:27:1: error: unknown type name ‘uint32_t’

     typedef uint32_t ETSHandle;

     ^

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/ets_sys.h:32:5: error: unknown type name ‘uint32_t’

         uint32_t              timer_expire;

         ^

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/ets_sys.h:33:5: error: unknown type name ‘uint32_t’

         uint32_t              timer_period;

         ^

    In file included from user/cgiwifi.c:17:0:

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/user_interface.h:316:1: error: unknown type name ‘uint8_t’

     void wifi_promiscuous_set_mac(const uint8_t *address);

     ^

    In file included from user/cgiwifi.c:20:0:

    user/io.h:3:16: error: unknown type name ‘uint16_t’

     void ioSpiSend(uint16_t data);

                    ^

    user/io.h:8:18: error: unknown type name ‘uint8_t’

     void ioEinkWrite(uint8_t data);

                      ^

    In file included from user/cgiwifi.c:21:0:

    include/espmissingincludes.h:42:5: error: conflicting types for ‘os_random’

     int os_random();

         ^

    In file included from user/cgiwifi.c:16:0:

    /Volumes/case-sensitive/esp-open-sdk/sdk/include/osapi.h:45:15: note: previous declaration of ‘os_random’ was here

     unsigned long os_random(void);

                   ^

    make: *** [build/user/cgiwifi.o] Error 1

 

▼sdk をいろいろ代えて試し、0.9.5あたりから試しました。

$ cd /Volumes/case-sensitive/esp-open-sdk/

$ ln -s esp_iot_sdk_v0.9.5 sdk

▼バイナリはできるけども、ファームウェアができないので、Makefile を書き換え。

※ まだ実機で試していないので、これで良いか不明ですが。

$ cat Makefile.patch 
--- Makefile_org    2015-09-11 00:13:00.000000000 +0900
+++ Makefile    2015-09-23 15:29:56.000000000 +0900
@@ -12,18 +12,18 @@ BUILD_BASE    = build
 FW_BASE        = firmware
 
 # Base directory for the compiler
-XTENSA_TOOLS_ROOT ?= /opt/Espressif/crosstool-NG/builds/xtensa-lx106-elf/bin
+XTENSA_TOOLS_ROOT ?= /Volumes/case-sensitive/esp-open-sdk/xtensa-lx106-elf/bin
 
 #Extra Tensilica includes from the ESS VM
-SDK_EXTRA_INCLUDES ?= /opt/Espressif/include
-SDK_EXTRA_LIBS ?= /opt/Espressif/arch/lib
+SDK_EXTRA_INCLUDES ?= /Volumes/case-sensitive/esp-open-sdk/include
+SDK_EXTRA_LIBS ?= /Volumes/case-sensitive/esp-open-sdk/sdk/lib
 
 # base directory of the ESP8266 SDK package, absolute
-SDK_BASE    ?= /opt/Espressif/ESP8266_SDK
+SDK_BASE    ?= /Volumes/case-sensitive/esp-open-sdk/sdk
 
 #Esptool.py path and port
-ESPTOOL        ?= esptool
-ESPPORT        ?= /dev/ttyUSB0
+ESPTOOL        ?= esptool.py
+ESPPORT        ?= /dev/tty.SLAB_USBtoUART
 #ESPDELAY indicates seconds to wait between flashing the two binary images
 ESPDELAY    ?= 3
 ESPBAUD        ?= 115200
@@ -61,9 +61,9 @@ SDK_INCDIR    = include include/json
 # we create two different files for uploading into the flash
 # these are the names and options to generate them
 FW_FILE_1    = 0x00000
-FW_FILE_1_ARGS    = -bo $@ -bs .text -bs .data -bs .rodata -bc -ec
+#FW_FILE_1_ARGS    = -bo $@ -bs .text -bs .data -bs .rodata -bc -ec
 FW_FILE_2    = 0x40000
-FW_FILE_2_ARGS    = -es .irom0.text $@ -ec
+#FW_FILE_2_ARGS    = -es .irom0.text $@ -ec
 
 # select which tools to use as compiler, librarian and linker
 CC        := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
@@ -117,13 +117,17 @@ endef
 
 all: checkdirs $(TARGET_OUT) $(FW_FILE_1) $(FW_FILE_2)
 
-$(FW_FILE_1): $(TARGET_OUT) firmware
-    $(vecho) "FW $@"
-    $(Q) $(ESPTOOL) -eo $(TARGET_OUT) $(FW_FILE_1_ARGS)
-
-$(FW_FILE_2): $(TARGET_OUT) firmware
-    $(vecho) "FW $@"
-    $(Q) $(ESPTOOL) -eo $(TARGET_OUT) $(FW_FILE_2_ARGS)
+$(FW_BASE)/%.bin: $(TARGET_OUT) | $(FW_BASE)
+    $(vecho) "FW $(FW_BASE)/"
+    $(Q) $(ESPTOOL) elf2image -o $(FW_BASE)/ $(TARGET_OUT)
+    
+#$(FW_FILE_1): $(TARGET_OUT) firmware
+#    $(vecho) "FW $@"
+#    $(Q) $(ESPTOOL) -eo $(TARGET_OUT) $(FW_FILE_1_ARGS)
+
+#$(FW_FILE_2): $(TARGET_OUT) firmware
+#    $(vecho) "FW $@"
+#    $(Q) $(ESPTOOL) -eo $(TARGET_OUT) $(FW_FILE_2_ARGS)
 
 $(TARGET_OUT): $(APP_AR)
     $(vecho) "LD $@"
@@ -138,14 +142,20 @@ checkdirs: $(BUILD_DIR) $(FW_BASE)
 $(BUILD_DIR):
     $(Q) mkdir -p $@
 
-firmware:
+#firmware:
+#    $(Q) mkdir -p $@
+$(FW_BASE):
     $(Q) mkdir -p $@
 
+#flash: $(FW_FILE_1) $(FW_FILE_2)
+#    $(Q) $(ESPTOOL) -cp $(ESPPORT) -cb $(ESPBAUD) -ca 0x00000 -cf firmware/0x00000.bin -v
+#    $(Q) [ $(ESPDELAY) -ne 0 ] && echo "Please put the ESP in bootloader mode..." || true
+#    $(Q) sleep $(ESPDELAY) || true
+#    $(Q) $(ESPTOOL) -cp $(ESPPORT) -cb $(ESPBAUD) -ca 0x40000 -cf firmware/0x40000.bin -v
 flash: $(FW_FILE_1) $(FW_FILE_2)
-    $(Q) $(ESPTOOL) -cp $(ESPPORT) -cb $(ESPBAUD) -ca 0x00000 -cf firmware/0x00000.bin -v
-    $(Q) [ $(ESPDELAY) -ne 0 ] && echo "Please put the ESP in bootloader mode..." || true
-    $(Q) sleep $(ESPDELAY) || true
-    $(Q) $(ESPTOOL) -cp $(ESPPORT) -cb $(ESPBAUD) -ca 0x40000 -cf firmware/0x40000.bin -v
+    $(ESPTOOL) --port $(ESPPORT) write_flash $(FW_FILE_1_ADDR) $(FW_FILE_1) $(FW_FILE_2_ADDR) $(FW_FILE_2)
+
+
 
 clean:
     $(Q) rm -f $(APP_AR)

・再度make

$ make clean

$ make

CC user/cgiwifi.c

CC user/config.c

CC user/eink.c

CC user/espfs.c

CC user/heatshrink_decoder.c

CC user/httpd.c

CC user/httpdclient.c

CC user/httpdespfs.c

CC user/io.c

CC user/stdout.c

CC user/user_main.c

AR build/einkdisp_app.a

LD build/einkdisp.out

FW firmware/

エラーはなくなりました。

・とりあえず、こんな感じになっています。

$ tree

.

├── Makefile

├── Makefile.patch

├── Makefile_org

├── README

├── build

│   ├── driver

│   ├── einkdisp.out★これはどの領域に書き込めばいいのでしょうかね?

│   ├── einkdisp_app.a

│   └── user

│       ├── cgiwifi.o

│       ├── config.o

│       ├── eink.o

│       ├── espfs.o

│       ├── heatshrink_decoder.o

│       ├── httpd.o

│       ├── httpdclient.o

│       ├── httpdespfs.o

│       ├── io.o

│       ├── stdout.o

│       └── user_main.o

├── firmware

│   ├── 0x00000.bin★

│   └── 0x40000.bin★

├── html

│   ├── 140medley.min.js

│   ├── apconnect.bm

│   ├── batempty.bm

│   ├── connecting.html

│   ├── icons.png

│   ├── neterror.bm

│   ├── style.css

│   └── wifi.tpl

├── icons

│   ├── apconnect.png

│   ├── batempty.png

│   └── neterror.png

├── include

│   ├── espmissingincludes-ip.h

│   ├── espmissingincludes.h

│   ├── ip_addr.h

│   ├── lwipopts.h

│   ├── spi_register.h

│   ├── stdint.h

│   ├── uart_hw.h

│   └── user_config.h

├── lib

│   └── heatshrink

│       ├── LICENSE

│       ├── Makefile

│       ├── README.md

│       ├── dec_sm.dot

│       ├── enc_sm.dot

│       ├── greatest.h

│       ├── heatshrink.c

│       ├── heatshrink_common.h

│       ├── heatshrink_config.h

│       ├── heatshrink_decoder.c

│       ├── heatshrink_decoder.h

│       ├── heatshrink_encoder.c

│       ├── heatshrink_encoder.h

│       ├── test_heatshrink_dynamic.c

│       ├── test_heatshrink_dynamic_theft.c

│       └── test_heatshrink_static.c

├── mkespfsimage

│   ├── Makefile

│   ├── espfsformat.h

│   ├── heatshrink_encoder.c

│   ├── heatshrink_encoder.o

│   ├── main.c

│   ├── main.o

│   └── mkespfsimage

├── mkimg.php

├── server

│   ├── README

│   └── pixelserver.js

└── user

    ├── cgiwifi.c

    ├── cgiwifi.h

    ├── config.c

    ├── config.h

    ├── eink.c

    ├── eink.h

    ├── espfs.c

    ├── espfs.h

    ├── heatshrink_config_httpd.h

    ├── heatshrink_decoder.c

    ├── httpd.c

    ├── httpd.h

    ├── httpdclient.c

    ├── httpdclient.h

    ├── httpdconfig.h

    ├── httpdespfs.c

    ├── httpdespfs.h

    ├── io.c

    ├── io.h

    ├── stdout.c

    ├── stdout.h

    └── user_main.c

12 directories, 86 files

 

▼まとめ

・SDK にいくつを使っていたか不明。作者に聞くことに

・PhantomJS で動作する pixelserver.js は別サーバにおくのかどうか?

・ビルドするには、esp-open-sdk を使えばいいのか、それとも他の方法か不明。

・ビルドしてできたものは、どのようにどの領域に書き込めばいいのか不明。

 

▼参考

http://nemuisan.blog.bai.ne.jp/?eid=215341

http://dsas.blog.klab.org/

http://www.homu.net/esp8266%E7%94%A8open-sdk%E3%82%92macosx%E7%94%A8%E3%81%AB%E3%83%93%E3%83%AB%E3%83%89%E3%81%99%E3%82%8B/

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

https://github.com/esp8266/esp8266-wiki/tree/master/sdk

http://nemuisan.blog.bai.ne.jp/?eid=215341

ED060SC4 のpin 9 と pin 10

ED060SC4のデータシートには、Pin9 と Pin10 はNC とありますが、作者の手書きの図には つながっているようです。

schema_esp

作者のサイトに行くと、どうやらED060SC4のリビジョン違いでNCになっているものとそうでないものがあるようです。FPCケーブルを見ると、そのpin がつながっていないものは、NC でつながっているように見えるものは新しいものかもしれません。

この違いで、作者はロジックアナライザで解析したそうです。

コネクタの位置でいうと、以下の部分です。

aaa

とりあえず、PCB上では配線しておいて、E-ink のものを見て判断するしかないようです。NC のものであればカットすればよいはずです。

aaaa

今のところの理解では、ED060SC4 のリビジョン2であればこのpin は作者のようにつなげば良いはずです。それにしても、このあたりの配線、via が多くなってしまいました。0.3mm 幅でもう少し綺麗に配線しないとですね。自動配線に頼りっぱなしで。

PCB の裏面のシルクに画像を入れてみた

E-ink controller は CC BY-SA だったので、そのロゴと、オープンソース・ハードウェアのロゴも入れてみました。

これは、ミラーした状態にする必要があるのかわかりませんでしたが、ちょっとテストで入れてみることに。

osshw

横幅2000px くらいのビットマップ画像を白黒にして、黒いところだけチェックを入れるといいようです。

画像は、bmp 形式でインポートするとウィザードがあるようでした。係数に、0.4 を入れて縮小しておきました。レイヤーは、bPlace に入れておけばよいようです。

複数選択をして、レイヤーを変更する方法がなかなかわからず、操作に手惑いました。

・ポイント

グループ選択する

チェンジアイコンからレイヤーを指定。

その後、グループ選択してある対象をクリック

 

インターフェイスが悪いというか、ちょっとこのあたりは要改善してほしいですね。

 

画像でロゴが入れられるということは、JunkHack のロゴも何か作りたくなってきますね。

 

さて、次はソースコードでも見てみますか。

プリント基板データを作成中

だいぶ、自動配線のコツもつかんで、Eagle の操作も少しづつ覚えてきました。Name の文字の大きさや位置を調整するのがわからなかったのですが、どうやら、smash してから文字を選択できる状態に分解して回転や、右クリックでプロパティーで文字の大きさやスタイルなどを調整するようです。

 

自動配線のコツは、ある程度配置を最善にして90%くらいまで最初に配線。その後、部分的に消したり、一部手動で途中まで配線したりして、再度自動配線をすると、うまくいきます。

 

インダクタは、流通も多いTDK のこれを使うことに。接地する面が少なく、配線しやすい。

SLF7045T-220MR90-PF

datasheet
SLF7045 type

SLF7045T-220MR90-PF

x 10 \933
http://www.aliexpress.com/item/7x7MM-22uH-960mA-Shielded-SMD-Power-Inductors-Inductance-SLF7032T-220MR96-TDK/1084729640.html?isOrigTitle=true

tdk

ちょっと配置を変えて、今のところはこんな感じになっています。smd はリフローというつけ方が楽そうで、半田ペーストをステンシルで一気につけて、SMD 部品を置いてあとはホットプレートで230度まで加熱するという感じだそうです。

Eagle で、tCream というレイヤーが半田をつける面で、以下がそれです。

mask

ステンシルを作る説明は、SWATCH SCIENCE さんの trac にありました。

Craft ROBOを使ったリフローはんだづけ用ステンシルの作製

動画を見ると、ほーなるほどとなります。

[youtube https://www.youtube.com/watch?v=prjB_myCwSY]

なるほどー 。この方法なら、うまく半田付けできるかも。実際に紙に印刷してみたんですが、めちゃくちゃ細かいのでできるかちょっと心配ですが。