ESP8266 Webserver Project

Moderator: Sprite_tm

User avatar
By MK1888
#12340
l3xluthor wrote:@MK1888 Thanks for your advice , Im going to do some test with that info and post my results later.


You're welcome. Just post your results to a new thread. This one is supposed to be about discussing the esphttpd code.
User avatar
By minoas
#12362 After fighting with it for a while I managed to get the ESP to display the kitties.The steps are listed bellow for anyone wishing to try.

    Installed esp-open-latest using git clone and complile, and it automatically set up esp_iot_sdk_v0.9.5.
    Added the directories (/opt/esp-open-sdk/xtensa-lx106-elf/bin, /opt/esp-open-sdk/esptool ) to the path as instructed
    Cloned the esp-httpd inside the sdk directory ( /opt/esp-open-sdk/sdk/ )
    Uncommented #include <stdint.h> from the three files ( heatshrink_decoder.h, espmissingincludes.h, base64.c)

Then modified the makefile:
Code: Select all# tnx to mamalala
# Changelog
# Changed the variables to include the header file directory
# Added global var for the XTENSA tool root
#
# This make file still needs some work.
#
#
# Output directors to store intermediate compiled files
# relative to the project directory
BUILD_BASE   = build
FW_BASE      = firmware

# Base directory for the compiler. Needs a / at the end; if not set it'll use the tools that are in
# the PATH.
XTENSA_TOOLS_ROOT ?= /opt/esp-open-sdk/xtensa-lx106-elf/bin/

# base directory of the ESP8266 SDK package, absolute
SDK_BASE   ?= /opt/esp-open-sdk/sdk
HTTPD_BASE      ?= $(shell pwd)

#Esptool.py path and port
ESPTOOL      ?= esptool.py
ESPPORT      ?= /dev/ttyUSB0
#ESPDELAY indicates seconds to wait between flashing the two binary images
ESPDELAY   ?= 3
ESPBAUD      ?= 115200

# name for the target project
TARGET      = httpd

# which modules (subdirectories) of the project to include in compiling
#MODULES      = driver user lwip/api lwip/app lwip/core lwip/core/ipv4 lwip/netif
MODULES      = driver user
EXTRA_INCDIR   = include \
      . \
      lib/heatshrink/

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

# 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 \
      -Wno-address

# 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
####
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)
   $(vecho) "FW $@"
   $(Q) $(ESPTOOL) elf2image $< -o $(FW_BASE)/

$(FW_FILE_2): $(TARGET_OUT)
   $(vecho) "FW $@"
   $(Q) $(ESPTOOL) elf2image $< -o $(FW_BASE)/
   
$(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)
   $(Q) $(ESPTOOL) --port $(ESPPORT) --baud $(ESPBAUD) write_flash 0x00000  $(addprefix $(HTTPD_BASE)/,$(FW_FILE_1))
   $(Q) [ $(ESPDELAY) -ne 0 ] && echo "Please put the ESP in bootloader mode..." || true
   $(Q) sleep $(ESPDELAY) || true
   $(Q) $(ESPTOOL) --port $(ESPPORT) --baud $(ESPBAUD) write_flash 0x40000 firmware/0x40000.bin

webpages.espfs: html/ html/wifi/ 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
   $(Q) $(ESPTOOL) --port $(ESPPORT) --baud $(ESPBAUD) write_flash 0x12000 webpages.espfs


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))))



Notes:
[*]The only thing I am not using from the original Makefile are those arguments
FW_FILE_1_ARGS = -bo $@ -bs .text -bs .data -bs .rodata -bc -ec
FW_FILE_2_ARGS = -es .irom0.text $@ -ec


Since I have never build using the binary esptool I was wondering if those are standard params for building those files, or if they are specific to the memory map of the file.

Omitting them and building flashing produced a working example, so any input on the necessity of those arguments is appreciated.

[*]I am using shell to get the current directory and then passed in as an absolute file path to the pythonic esptool. You can modify the tool to avoid IOErrors but it would be outside of our scope. If you restructure your folder or start nesting Makefiles this hack will go terribly wrong, so remember to hard code HTTPD_BASE.

[*]If the flashing progress fails during a percentage, Make sure you do not have floating pins and play with the BAUD rate. Different ESP chips like programming in different speeds for some reason.
User avatar
By izhak2
#12444 Hi,

I have some problem matching the results of the published binaries with my own fresh compiled ones.

I'm using v1.0.0 sdk from https://github.com/esp8266/esp8266-wiki/blob/master/sdk/esp_iot_sdk_v1.0.0_15_03_20.zip, and httpd sources from https://github.com/IOCare/esp8266GUI.
Also, I reached the same bad result with previous sdks: v0.9.3,4,5.

I successfully compiled the firmware binaries [0x00000, 0x40000] and flashed them to those offsets, with an already compiled webpages.espfs to offset 0x12000
[MD5 36618B279DDA4EA111BF982685F85158, MD5 10D9106326D4BFEDEDB26C10BC14B94C - the first was found on the GIT and the other while frustrated browsing through this topic].

Unfortunately, while flashing the published binaries with the espfs resulted in the bootstrap page as supposed to, with all the css and js stuff, flashing my own compiled binaries with the same espfs resulted in the same page, but with missing css and js stuff. Also, chrome inspector indicates that the css and js files are empty.

I couldn't find any similar problem through the topic, and am looking for help.

Thanks in advance!