The use of the ESP8266 in the world of IoT

User avatar
By scargill
#3323 It would be great if someone would put a guide to all of this in one place for non-Linux people... every guide I've seen up to now makes massive assumptions. I would love to compile that http server in Windows- there's a problem with searching for access points that the original writer has yet to resolve and I'd love to know if others have solved it - also given that this will all be using the SDK 9.2 version, I can't imagine it lasting long before the memory eats away - hopefully resolved in 9.3
User avatar
By bkrajendra
#3341
scargill wrote:It would be great if someone would put a guide to all of this in one place for non-Linux people... every guide I've seen up to now makes massive assumptions. I would love to compile that http server in Windows- there's a problem with searching for access points that the original writer has yet to resolve and I'd love to know if others have solved it - also given that this will all be using the SDK 9.2 version, I can't imagine it lasting long before the memory eats away - hopefully resolved in 9.3


Hey scargill I'm also windows user.
I can understand, Its as difficult for windows user to understand all of linux stuff as it is for linux user to get into windows.
But its not difficult if you really have passion for design and research. :)

You can find many post of mine frustrated with the many problem a windows user can get.
Finally I'm successful... my lubuntu image was working fine while I was struggling to run all
this in windows+cygwin.
The are 10 things to keep in mind.
In windows:
1) Have a Cygwin32/64
2) Add->Devel->Make
3) Add->Devel->gcc core
4) Add->Devel->gcc++
5) Download & extract toolchain (xtensa-lx106-elf) from official locations.
6) Download & extract SDK esp_iot_sdk_v0.9.2 or esp_iot_sdk_v0.9.3
7) keep folder structure as per your convenience..
8) I think having Python, esptool or espupload is totally optional. you can do it on windows through various GUI tools.
9) Use and try to understand the make files. You can follow the one I'm using, just replace variables.
10) change and keep watch on following important variables:
XTENSA_TOOLS_ROOT
SDK_EXTRA_INCLUDES
SDK_BASE
EXTRA_INCDIR
You can comment out esptool related lines if you dnt want to use it.
Make file sample:
Code: Select allBUILD_BASE   = build
FW_BASE      = firmware

# Base directory for the compiler
XTENSA_TOOLS_ROOT ?= D:/ESP8266/Projects/esp8266/xtensa-lx106-elf-161014/xtensa-lx106-elf/bin

#Extra Tensilica includes from the
SDK_EXTRA_INCLUDES ?= D:/ESP8266/Projects/esp8266/esp_iot_sdk_v0.9.3/include

# base directory of the ESP8266 SDK package, absolute
SDK_BASE   ?= D:/ESP8266/Projects/esp8266/esp_iot_sdk_v0.9.3



#Esptool.py path and port
ESPTOOL      ?= esptool
ESPPORT      ?= com1

# name for the target project
TARGET      = httpd

# which modules (subdirectories) of the project to include in compiling
MODULES      = driver user
EXTRA_INCDIR   = include \
      . \
      lib/heatshrink/ \
      $(SDK_EXTRA_INCLUDES)

# libraries used in this project, mainly provided by the SDK
LIBS      = c gcc pp hal phy net80211 lwip wpa main
# Added pp for SDK 9.3

# 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

# 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

# various paths from the SDK used in this project
SDK_LIBDIR   = lib
SDK_LDDIR   = ld
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_2   = 0x40000
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
AR      := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-ar
LD      := $(XTENSA_TOOLS_ROOT)/xtensa-lx106-elf-gcc



####
#### no user configurable options below here
####
FW_TOOL      ?= /usr/bin/esptool
SRC_DIR      := $(MODULES)
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))

FW_FILE_1   := $(addprefix $(FW_BASE)/,$(FW_FILE_1).bin)
FW_FILE_2   := $(addprefix $(FW_BASE)/,$(FW_FILE_2).bin)

V ?= $(VERBOSE)
ifeq ("$(V)","1")
Q :=
vecho := @true
else
Q := @
vecho := @echo
endif

vpath %.c $(SRC_DIR)

define compile-objects
$1/%.o: %.c
   $(vecho) "CC $$<"
   $(Q) $(CC) $(INCDIR) $(MODULE_INCDIR) $(EXTRA_INCDIR) $(SDK_INCDIR) $(CFLAGS)  -c $$< -o $$@
endef

.PHONY: all checkdirs clean

all: checkdirs $(TARGET_OUT) $(FW_FILE_1) $(FW_FILE_2)

$(FW_FILE_1): $(TARGET_OUT) firmware
   $(vecho) "FW $@"
   $(Q) $(FW_TOOL) -eo $(TARGET_OUT) $(FW_FILE_1_ARGS)

$(FW_FILE_2): $(TARGET_OUT) firmware
   $(vecho) "FW $@"
   $(Q) $(FW_TOOL) -eo $(TARGET_OUT) $(FW_FILE_2_ARGS)

$(TARGET_OUT): $(APP_AR)
   $(vecho) "LD $@"
   $(Q) $(LD) -L$(SDK_LIBDIR) $(LD_SCRIPT) $(LDFLAGS) -Wl,--start-group $(LIBS) $(APP_AR) -Wl,--end-group -o $@

$(APP_AR): $(OBJ)
   $(vecho) "AR $@"
   $(Q) $(AR) cru $@ $^

checkdirs: $(BUILD_DIR) $(FW_BASE)

$(BUILD_DIR):
   $(Q) mkdir -p $@

firmware:
   $(Q) mkdir -p $@

flash: $(FW_FILE_1) $(FW_FILE_2)
   -$(ESPTOOL) --port $(ESPPORT) write_flash 0x00000 firmware/0x00000.bin
   sleep 3
   -$(ESPTOOL) --port $(ESPPORT) write_flash 0x40000 firmware/0x40000.bin


# These automations are only required and should be design as per need and application.
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) --port $(ESPPORT) write_flash 0x12000 webpages.espfs

# Don't change anything below!
clean:
   $(Q) rm -f $(APP_AR)
   $(Q) rm -f $(TARGET_OUT)
   $(Q) find $(BUILD_BASE) -type f | xargs rm -f


   $(Q) rm -f $(FW_FILE_1)
   $(Q) rm -f $(FW_FILE_2)
   $(Q) rm -rf $(FW_BASE)

$(foreach bdir,$(BUILD_DIR),$(eval $(call compile-objects,$(bdir))))



I'm not an expert .. but I hope its helpful to you..!
If anyone is having more info on this please feel free to add to above point or suggest
changes.


--- Rajendra :idea: