作者にヘルプ要請を出しておきました。作者からレスポンスがあるまで、自分なりにもう少し調べみます。
その後、再調査で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は、作成できている模様
・ファームウェアのどの領域にどうやって作成するのかを調査すればよさそう