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は、作成できている模様

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