+#############################################################
+# (c) by CHERTS <sleuthhound@gmail.com>
+#############################################################
+# Base directory for the compiler
+XTENSA_TOOLS_ROOT ?= c:/Espressif/xtensa-lx106-elf/bin
+# base directory of the ESP8266 SDK package, absolute
+SDK_BASE ?= c:/Espressif/ESP8266_SDK
+SDK_TOOLS ?= c:/Espressif/utils
+#Extra Tensilica includes from the ESS VM
+SDK_EXTRA_INCLUDES ?= c:/Espressif/ESP8266_SDK/include
+SDK_EXTRA_LIBS ?= c:/Espressif/ESP8266_SDK/lib
+ESPTOOL ?=$(SDK_TOOLS)/esptool.exe
+# old - use c:/Espressif/utils/esptool.exe util
+# new - use c:/Espressif/utils/esptool-ck.exe util
+#Position and maximum length of espfs in flash memory
+#Static gzipping is disabled by default.
+#If USE_HEATSHRINK is set to "yes" then the espfs files will be compressed with Heatshrink and decompressed
+#on the fly while reading the file. Because the decompression is done in the esp8266, it does not require
+#any support in the browser.
+# BOOT = old - boot_v1.1
+# BOOT = new - boot_v1.2+
+# APP = 0 - eagle.flash.bin + eagle.irom0text.bin
+# SPI_SPEED = 20MHz, 26.7MHz, 40MHz, 80MHz
+# SPI_MODE: QIO, QOUT, DIO, DOUT
+# SPI_SIZE: 256KB, 512KB, 1024KB, 2048KB, 4096KB
+ifeq ($(ESPTOOLMODE), new)
+ifeq ($(SPI_SPEED), 26.7)
+ flashimageoptions = -ff 26m
+ ifeq ($(SPI_SPEED), 20)
+ flashimageoptions = -ff 20m
+ ifeq ($(SPI_SPEED), 80)
+ flashimageoptions = -ff 80m
+ flashimageoptions = -ff 40m
+ifeq ($(SPI_MODE), QOUT)
+ flashimageoptions += -fm qout
+ ifeq ($(SPI_MODE), DIO)
+ flashimageoptions += -fm dio
+ ifeq ($(SPI_MODE), DOUT)
+ flashimageoptions += -fm dout
+ flashimageoptions += -fm qio
+# flash larger than 1024KB only use 1024KB to storage user1.bin and user2.bin
+ flashimageoptions += -fs 2m
+ ifeq ($(SPI_SIZE), 1024)
+ flashimageoptions += -fs 8m
+ ifeq ($(SPI_SIZE), 2048)
+ flashimageoptions += -fs 16m
+ ifeq ($(SPI_SIZE), 4096)
+ flashimageoptions += -fs 32m
+ flashimageoptions += -fs 4m
+# name for the target project
+# which modules (subdirectories) of the project to include in compiling
+#MODULES = espfs httpd mqtt user
+MODULES = driver mqtt user
+#EXTRA_INCDIR = include \
+EXTRA_INCDIR = include $(SDK_BASE)/../include \
+# libraries used in this project, mainly provided by the SDK
+#LIBS = c gcc hal phy pp net80211 lwip wpa main
+LIBS = c gcc hal phy pp net80211 lwip wpa upgrade main ssl
+# compiler flags using during compilation of source files
+#CFLAGS = -Os -ggdb -std=c99 -Werror -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \
+# -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH -D_STDINT_H \
+# -Wno-address -DESPFS_POS=$(ESPFS_POS) -DESPFS_SIZE=$(ESPFS_SIZE)
+CFLAGS = -w -Os -ggdb -std=c99 -Wpointer-arith -Wundef -Wall -Wl,-EL -fno-inline-functions \
+ -nostdlib -mlongcalls -mtext-section-literals -D__ets__ -DICACHE_FLASH -D_STDINT_H \
+ -Wno-address -DESPFS_POS=$(ESPFS_POS) -DESPFS_SIZE=$(ESPFS_SIZE)
+# linker flags used to generate the main object file
+LDFLAGS = -nostdlib -Wl,--no-check-sections -u call_user_start -Wl,-static
+# linker script used for the above linkier step
+LD_SCRIPT = eagle.app.v6.ld
+ LD_SCRIPT = eagle.app.v6.$(boot).$(flash).app$(app).ld
+ BIN_NAME = user$(app).$(flash).$(boot)
+ifeq ($(esptoolmode), new)
+ ESPTOOL = $(SDK_TOOLS)/esptool-ck.exe
+# various paths from the SDK used in this project
+SDK_INCDIR = include include/json
+# select which tools to use as compiler, librarian and linker
+CC := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
+AR := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-ar
+LD := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc
+OBJCOPY := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-objcopy
+OBJDUMP := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-objdump
+# no user configurable options below here
+BUILD_DIR := $(addprefix $(BUILD_BASE)/,$(MODULES))
+SDK_LIBDIR := $(addprefix $(SDK_BASE)/,$(SDK_LIBDIR))
+SDK_INCDIR := $(addprefix -I$(SDK_BASE)/,$(SDK_INCDIR))
+SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.c))
+OBJ := $(patsubst %.c,$(BUILD_BASE)/%.o,$(SRC))
+LIBS := $(addprefix -l,$(LIBS))
+APP_AR := $(addprefix $(BUILD_BASE)/,$(TARGET)_app.a)
+TARGET_OUT := $(addprefix $(BUILD_BASE)/,$(TARGET).out)
+LD_SCRIPT := $(addprefix -T$(SDK_BASE)/$(SDK_LDDIR)/,$(LD_SCRIPT))
+INCDIR := $(addprefix -I,$(SRC_DIR))
+EXTRA_INCDIR := $(addprefix -I,$(EXTRA_INCDIR))
+MODULE_INCDIR := $(addsuffix /include,$(INCDIR))
+ifeq ("$(GZIP_COMPRESSION)","yes")
+CFLAGS += -DGZIP_COMPRESSION
+ifeq ("$(USE_HEATSHRINK)","yes")
+CFLAGS += -DESPFS_HEATSHRINK
+ $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS) -c $$< -o $$@
+.PHONY: all checkdirs clean flash flashinit flashonefile htmlfiles
+all: checkdirs $(TARGET_OUT)
+ cd html; find | ../mkespfsimage/mkespfsimage.exe > ../$(FW_BASE)/webpages.espfs; cd ..
+$(TARGET_OUT): $(APP_AR)
+ $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $@
+ $(vecho) "------------------------------------------------------------------------------"
+ $(vecho) "Section info:"
+ $(Q) $(OBJDUMP) -h -j .data -j .rodata -j .bss -j .text -j .irom0.text $@
+ $(vecho) "------------------------------------------------------------------------------"
+ $(vecho) "Section info:"
+ $(Q) $(SDK_TOOLS)/memanalyzer.exe $(OBJDUMP).exe $@
+ $(vecho) "------------------------------------------------------------------------------"
+ $(vecho) "Run objcopy, please wait..."
+ $(Q) $(OBJCOPY) --only-section .text -O binary $@ eagle.app.v6.text.bin
+ $(Q) $(OBJCOPY) --only-section .data -O binary $@ eagle.app.v6.data.bin
+ $(Q) $(OBJCOPY) --only-section .rodata -O binary $@ eagle.app.v6.rodata.bin
+ $(Q) $(OBJCOPY) --only-section .irom0.text -O binary $@ eagle.app.v6.irom0text.bin
+ $(vecho) "objcopy done"
+ $(vecho) "Run gen_appbin.exe"
+ $(Q) $(SDK_TOOLS)/gen_appbin.exe $@ 0 $(mode) $(freqdiv) $(size)
+ $(Q) mv eagle.app.flash.bin $(FW_BASE)/eagle.flash.bin
+ $(Q) mv eagle.app.v6.irom0text.bin $(FW_BASE)/eagle.irom0text.bin
+ $(vecho) "No boot needed."
+ $(vecho) "Generate eagle.flash.bin and eagle.irom0text.bin successully in folder $(FW_BASE)."
+ $(vecho) "eagle.flash.bin-------->0x00000"
+ $(vecho) "eagle.irom0text.bin---->0x40000"
+ $(Q) $(SDK_TOOLS)/gen_appbin.exe $@ 2 $(mode) $(freqdiv) $(size)
+ $(vecho) "Support boot_v1.2 and +"
+ $(Q) $(SDK_TOOLS)/gen_appbin.exe $@ 1 $(mode) $(freqdiv) $(size)
+ $(vecho) "Support boot_v1.1 and +"
+ $(Q) mv eagle.app.flash.bin $(FW_BASE)/upgrade/$(BIN_NAME).bin
+ $(vecho) "Generate $(BIN_NAME).bin successully in folder $(FW_BASE)/upgrade."
+ $(vecho) "boot_v1.x.bin------->0x00000"
+ $(vecho) "$(BIN_NAME).bin--->$(addr)"
+checkdirs: $(BUILD_DIR) $(FW_BASE)
+ $(Q) mkdir -p $@/upgrade
+flashonefile: all webpages.espfs
+ $(vecho) "Run objcopy, please wait..."
+ $(OBJCOPY) --only-section .text -O binary $(TARGET_OUT) eagle.app.v6.text.bin
+ $(OBJCOPY) --only-section .data -O binary $(TARGET_OUT) eagle.app.v6.data.bin
+ $(OBJCOPY) --only-section .rodata -O binary $(TARGET_OUT) eagle.app.v6.rodata.bin
+ $(OBJCOPY) --only-section .irom0.text -O binary $(TARGET_OUT) eagle.app.v6.irom0text.bin
+ $(vecho) "objcopy done"
+ $(SDK_TOOLS)/gen_appbin_old.exe $(TARGET_OUT) v6
+ $(SDK_TOOLS)/gen_flashbin.exe eagle.app.v6.flash.bin firmware/webpages.espfs $(ESPFS_POS)
+ rm -f eagle.app.v6.flash.bin
+ mv eagle.app.flash.bin eagle.app.v6.flash.bin
+ $(SDK_TOOLS)/gen_flashbin.exe eagle.app.v6.flash.bin eagle.app.v6.irom0text.bin 0x40000
+ rm -f eagle.app.v6.data.bin
+ rm -f eagle.app.v6.flash.bin
+ rm -f eagle.app.v6.irom0text.bin
+ rm -f eagle.app.v6.rodata.bin
+ rm -f eagle.app.v6.text.bin
+ mv eagle.app.flash.bin $(FW_BASE)/
+ $(vecho) "No boot needed."
+ $(vecho) "Generate eagle.app.flash.bin successully in folder $(FW_BASE)."
+ $(vecho) "eagle.app.flash.bin-------->0x00000"
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca 0x00000 -cf $(FW_BASE)/eagle.app.flash.bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x00000 $(FW_BASE)/eagle.app.flash.bin
+ $(vecho) "Flash boot_v1.2 and +"
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x00000 -cf $(SDK_BASE)/bin/boot_v1.2.bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x00000 $(SDK_BASE)/bin/boot_v1.2.bin
+ $(vecho) "Flash boot_v1.1 and +"
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x00000 -cf $(SDK_BASE)/bin/boot_v1.1.bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x00000 $(SDK_BASE)/bin/boot_v1.1.bin
+ $(vecho) "No boot needed."
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x00000 -cf $(FW_BASE)/eagle.flash.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca 0x40000 -cf $(FW_BASE)/eagle.irom0text.bin -v
+ if [ $$(stat -c '%s' webpages.espfs) -gt $$(( $(ESPFS_SIZE) )) ]; then echo "$(FW_BASE)/webpages.espfs too big!"; false; fi
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca $(ESPFS_POS) -cf $(FW_BASE)/webpages.espfs -v
+# $(SDK_TOOLS)/gen_flashbin.exe eagle.app.v6.flash.bin webpages.espfs 0x12000
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x00000 $(FW_BASE)/eagle.flash.bin 0x40000 $(FW_BASE)/eagle.irom0text.bin $(ESPFS_POS) $(FW_BASE)/webpages.espfs 0x79000 $(SDK_BASE)/bin/clear_eep.bin 0x7c000 $(SDK_BASE)/bin/esp_init_data_default.bin 0x7e000 $(SDK_BASE)/bin/blank.bin
+ ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x00000 -cf $(FW_BASE)/eagle.flash.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca 0x40000 -cf $(FW_BASE)/eagle.irom0text.bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x00000 $(FW_BASE)/eagle.flash.bin 0x40000 $(FW_BASE)/eagle.irom0text.bin $(ESPFS_POS) $(FW_BASE)/webpages.espfs 0x79000 $(SDK_BASE)/bin/clear_eep.bin 0x7c000 $(SDK_BASE)/bin/esp_init_data_default.bin 0x7e000 $(SDK_BASE)/bin/blank.bin
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca $(addr) -cf $(FW_BASE)/upgrade/$(BIN_NAME).bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) $(addr) $(FW_BASE)/upgrade/$(BIN_NAME).bin
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x79000 -cf $(SDK_BASE)/bin/clear_eep.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x7c000 -cf $(SDK_BASE)/bin/esp_init_data_default.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x7e000 -cf $(SDK_BASE)/bin/blank.bin -v
+# $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x79000 $(SDK_BASE)/bin/clear_eep.bin 0x7c000 $(SDK_BASE)/bin/esp_init_data_default.bin 0x7e000 $(SDK_BASE)/bin/blank.bin
+ $(vecho) "Flash init data:"
+ $(vecho) "Clear old settings (EEP area):"
+ $(vecho) "clear_eep.bin-------->0x79000"
+ $(vecho) "Default config (Clear SDK settings):"
+ $(vecho) "blank.bin-------->0x7E000"
+ $(vecho) "esp_init_data_default.bin-------->0x7C000"
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x79000 -cf $(SDK_BASE)/bin/clear_eep.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x7c000 -cf $(SDK_BASE)/bin/esp_init_data_default.bin -v
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -ca 0x7e000 -cf $(SDK_BASE)/bin/blank.bin -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) 0x79000 $(SDK_BASE)/bin/clear_eep.bin 0x7c000 $(SDK_BASE)/bin/esp_init_data_default.bin 0x7e000 $(SDK_BASE)/bin/blank.bin
+webpages.espfs: $(FW_BASE) cleanwebpages
+ cd html; find | ../mkespfsimage/mkespfsimage.exe > ../firmware/webpages.espfs; cd ..
+htmlflash: webpages.espfs
+ if [ $$(stat -c '%s' $(FW_BASE)/webpages.espfs) -gt $$(( $(ESPFS_SIZE) )) ]; then echo "$(FW_BASE)/webpages.espfs too big!"; false; fi
+# if [ $$(stat -c '%s' webpages.espfs) -gt $$(( $(ESPFS_SIZE) )) ]; then echo "$(FW_BASE)/webpages.espfs too big!"; false; fi
+ifeq ($(esptoolmode), new)
+ $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca $(ESPFS_POS) -cf $(FW_BASE)/webpages.espfs -v
+# $(ESPTOOL) -cp $(ESPPORT) -cd ck -cb 256000 -ca $(ESPFS_POS) -cf webpages.espfs -v
+ $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) $(ESPFS_POS) $(FW_BASE)/webpages.espfs
+# $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(flashimageoptions) $(ESPFS_POS) webpages.espfs
+ $(Q) rm -f $(TARGET_OUT)
+ $(Q) rm -rf $(BUILD_DIR)
+ $(Q) rm -rf $(BUILD_BASE)
+ $(Q) rm -f webpages.espfs
+ $(Q) rm -f webpages.espfs
+$(foreach bdir,$(BUILD_DIR),$(eval $(call compile-objects,$(bdir))))