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