Use latest upstream rboot, always build with OTA - use prebuilt rboot if
none is compiled locally.
This commit is contained in:
parent
1f1881a452
commit
d9202af2aa
20 changed files with 216 additions and 364 deletions
|
@ -1,34 +1,17 @@
|
||||||
# This is a wrapper around the rboot makefile, which gives us the parameters
|
# This is a wrapper around the rboot makefile, which gives us the parameters
|
||||||
# we need to use rboot with esp-open-rtos
|
# we need to use rboot with esp-open-rtos.
|
||||||
|
#
|
||||||
|
# Use 'make bootloader' to build a custom bootloader.
|
||||||
|
#
|
||||||
|
# 'make flash' for any esp-open-rtos program will use the compiled
|
||||||
|
# bootloader if it exists, or a prebuilt bootloader if no custom
|
||||||
|
# bootloader was compiled.
|
||||||
#
|
#
|
||||||
# The wrapper means we don't require esptool2 in the build process, so we can just use
|
# The wrapper means we don't require esptool2 in the build process, so we can just use
|
||||||
# esptool.py (still need xxd, grep, sed to generate the header - see below.)
|
# esptool.py (still need xxd, grep, sed to generate the header - see below.)
|
||||||
|
BOOTLOADER_DIR:=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
|
||||||
|
|
||||||
BUILD_DIR ?= build
|
include ../parameters.mk
|
||||||
FIRMWARE_DIR ?= firmware
|
|
||||||
|
|
||||||
# RBOOT configuration parameters.
|
|
||||||
# RBOOT_BIG_FLASH is required for esp-open-rtos.
|
|
||||||
export RBOOT_BIG_FLASH = 1
|
|
||||||
|
|
||||||
export RBOOT_BUILD_BASE=$(abspath $(BUILD_DIR))
|
|
||||||
|
|
||||||
# Default ESPTOOL params, all the same as when using normal esp-open-rtos makefiles
|
|
||||||
ESPTOOL ?= esptool.py
|
|
||||||
ESPPORT ?= /dev/ttyUSB0
|
|
||||||
ESPBAUD ?= 115200
|
|
||||||
|
|
||||||
FLASH_SIZE ?= 16
|
|
||||||
FLASH_MODE ?= qio
|
|
||||||
FLASH_SPEED ?= 40
|
|
||||||
|
|
||||||
ESPTOOL_ARGS=-fs $(FLASH_SIZE)m -fm $(FLASH_MODE) -ff $(FLASH_SPEED)m
|
|
||||||
|
|
||||||
ifeq ("$(V)","1")
|
|
||||||
Q :=
|
|
||||||
else
|
|
||||||
Q := @
|
|
||||||
endif
|
|
||||||
|
|
||||||
all: $(FIRMWARE_DIR)/rboot.bin
|
all: $(FIRMWARE_DIR)/rboot.bin
|
||||||
|
|
||||||
|
@ -52,14 +35,19 @@ $(BUILD_DIR)/rboot-hex2a.h: $(BUILD_DIR)/rboot-stage2a.elf $(BUILD_DIR)
|
||||||
$(Q) echo "const uint32 _text_addr = 0x$$(xtensa-lx106-elf-objdump -h -j .text $< | grep ".text" | grep -o '401.....' | head -n1);" >> $@.in
|
$(Q) echo "const uint32 _text_addr = 0x$$(xtensa-lx106-elf-objdump -h -j .text $< | grep ".text" | grep -o '401.....' | head -n1);" >> $@.in
|
||||||
$(Q) mv $@.in $@
|
$(Q) mv $@.in $@
|
||||||
|
|
||||||
|
|
||||||
|
RBOOT_BUILD_BASE="$(abspath $(BUILD_DIR))"
|
||||||
|
RBOOT_FW_BASE="$(abspath $(FIRMWARE_DIR))"
|
||||||
|
MAKE_VARS=RBOOT_EXTRA_INCDIR=$(BOOTLOADER_DIR) RBOOT_BUILD_BASE=$(RBOOT_BUILD_BASE) RBOOT_FW_BASE=$(RBOOT_FW_BASE)
|
||||||
|
|
||||||
$(BUILD_DIR)/rboot-stage2a.elf: $(BUILD_DIR)
|
$(BUILD_DIR)/rboot-stage2a.elf: $(BUILD_DIR)
|
||||||
$(Q) $(MAKE) -C rboot $(RBOOT_BUILD_BASE)/rboot-stage2a.elf
|
$(Q) $(MAKE) -C rboot $(RBOOT_BUILD_BASE)/rboot-stage2a.elf $(MAKE_VARS)
|
||||||
|
|
||||||
$(BUILD_DIR)/rboot.elf: $(BUILD_DIR)/rboot-hex2a.h
|
$(BUILD_DIR)/rboot.elf: $(BUILD_DIR)/rboot-hex2a.h
|
||||||
$(Q) $(MAKE) -C rboot $(RBOOT_BUILD_BASE)/rboot.elf
|
$(Q) $(MAKE) -C rboot $(RBOOT_BUILD_BASE)/rboot.elf $(MAKE_VARS)
|
||||||
|
|
||||||
$(BUILD_DIR) $(FIRMWARE_DIR):
|
$(BUILD_DIR) $(FIRMWARE_DIR):
|
||||||
$(Q) mkdir -p "$@"
|
mkdir -p $@
|
||||||
|
|
||||||
flash: $(FIRMWARE_DIR)/rboot.bin
|
flash: $(FIRMWARE_DIR)/rboot.bin
|
||||||
$(Q) $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(ESPTOOL_ARGS) 0x0 $<
|
$(Q) $(ESPTOOL) -p $(ESPPORT) -b $(ESPBAUD) write_flash $(ESPTOOL_ARGS) 0x0 $<
|
||||||
|
@ -68,4 +56,4 @@ clean:
|
||||||
$(Q) rm -rf $(BUILD_DIR)
|
$(Q) rm -rf $(BUILD_DIR)
|
||||||
$(Q) rm -rf $(FIRMWARE_DIR)
|
$(Q) rm -rf $(FIRMWARE_DIR)
|
||||||
|
|
||||||
.PHONY: all clean flash erase_config
|
.PHONY: all
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
OTA Bootloader (rboot) source module and support files.
|
OTA Bootloader (rboot) source module and support files.
|
||||||
|
|
||||||
Can be used to build an esp-open-rtos compatible rboot bootloader, for use when OTA=1.
|
|
||||||
|
|
||||||
It is also possible to use the upstream rboot verbatim, but *ensure that the `RBOOT_BIG_FLASH` option is enabled or images in slots other than 0 won't work correctly.
|
|
||||||
|
|
||||||
rboot is an open source bootloader by Richard Burton:
|
rboot is an open source bootloader by Richard Burton:
|
||||||
https://github.com/raburton/rboot
|
https://github.com/raburton/rboot
|
||||||
|
|
||||||
See the contents of the 'rboot' directory for more information.
|
Can be used to build an esp-open-rtos compatible rboot bootloader. Run 'make bootloader' in this directory to compile a new bootloader.
|
||||||
|
|
||||||
|
Compiling a new bootloader is optional, there's a prebuilt one in the "firmware_prebuilt" directory that will be used if no new bootloader was compiled.
|
||||||
|
|
||||||
|
It is also possible to use rboot from upstream verbatim, but *ensure that the `RBOOT_BIG_FLASH` option is enabled or images in slots other than 0 won't work correctly.
|
||||||
|
|
||||||
|
See the contents of the 'rboot' directory for more information on rboot.
|
||||||
|
|
BIN
bootloader/firmware_prebuilt/blank_config.bin
Normal file
BIN
bootloader/firmware_prebuilt/blank_config.bin
Normal file
Binary file not shown.
BIN
bootloader/firmware_prebuilt/rboot.bin
Normal file
BIN
bootloader/firmware_prebuilt/rboot.bin
Normal file
Binary file not shown.
|
@ -1 +1 @@
|
||||||
Subproject commit 4cf6132f6ee624318c04b2a8d9e37da64b7c283c
|
Subproject commit 30afbaa777e00abf9d7d469fb3345f118c4975c1
|
23
bootloader/rboot.h
Normal file
23
bootloader/rboot.h
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
/* rboot header overrides
|
||||||
|
|
||||||
|
This "wrapper" header contains default values for building rboot
|
||||||
|
on/for esp-open-rtos. It gets included both when building the
|
||||||
|
bootloader and when building extras/rboot-ota support. It includes
|
||||||
|
the default bootloader/rboot/rboot.h header via the gcc
|
||||||
|
include_next mechanism.
|
||||||
|
*/
|
||||||
|
#ifndef __RBOOT_H__
|
||||||
|
|
||||||
|
// Big flash support is required for esp-open-rtos (we use 8Mbit
|
||||||
|
// "slots" only.)
|
||||||
|
#define BOOT_BIG_FLASH
|
||||||
|
|
||||||
|
// enable 2 way communication between
|
||||||
|
// rBoot and the user app via the esp rtc data area
|
||||||
|
#define BOOT_RTC_ENABLED
|
||||||
|
|
||||||
|
// Call 'main' rboot.h to pick up defaults for other parameters
|
||||||
|
#include_next "rboot.h"
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
172
common.mk
172
common.mk
|
@ -20,149 +20,7 @@
|
||||||
# assume the 'root' directory (ie top of the tree) is the directory common.mk is in
|
# assume the 'root' directory (ie top of the tree) is the directory common.mk is in
|
||||||
ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
|
ROOT := $(dir $(lastword $(MAKEFILE_LIST)))
|
||||||
|
|
||||||
# include optional local overrides at the root level, then in program directory
|
include $(ROOT)parameters.mk
|
||||||
#
|
|
||||||
# Create either of these files for local system overrides if possible,
|
|
||||||
# instead of editing this makefile directly.
|
|
||||||
-include $(ROOT)local.mk
|
|
||||||
-include local.mk
|
|
||||||
|
|
||||||
# Flash size in megabits
|
|
||||||
# Valid values are same as for esptool.py - 2,4,8,16,32
|
|
||||||
FLASH_SIZE ?= 16
|
|
||||||
|
|
||||||
# Flash mode, valid values are same as for esptool.py - qio,qout,dio.dout
|
|
||||||
FLASH_MODE ?= qio
|
|
||||||
|
|
||||||
# Flash speed in MHz, valid values are same as for esptool.py - 80, 40, 26, 20
|
|
||||||
FLASH_SPEED ?= 40
|
|
||||||
|
|
||||||
# Output directories to store intermediate compiled files
|
|
||||||
# relative to the program directory
|
|
||||||
BUILD_DIR ?= $(PROGRAM_DIR)build/
|
|
||||||
FIRMWARE_DIR ?= $(PROGRAM_DIR)firmware/
|
|
||||||
|
|
||||||
# esptool.py from https://github.com/themadinventor/esptool
|
|
||||||
ESPTOOL ?= esptool.py
|
|
||||||
# serial port settings for esptool.py
|
|
||||||
ESPPORT ?= /dev/ttyUSB0
|
|
||||||
ESPBAUD ?= 115200
|
|
||||||
|
|
||||||
# set this to 0 if you don't need floating point support in printf/scanf
|
|
||||||
# this will save approx 14.5KB flash space and 448 bytes of statically allocated
|
|
||||||
# data RAM
|
|
||||||
#
|
|
||||||
# NB: Setting the value to 0 requires a recent esptool.py (Feb 2016 / commit ebf02c9)
|
|
||||||
PRINTF_SCANF_FLOAT_SUPPORT ?= 1
|
|
||||||
|
|
||||||
# Set OTA to 1 to build an image that supports rBoot OTA bootloader
|
|
||||||
#
|
|
||||||
# Requires 16mbit or higher flash sizes, with 8mbit
|
|
||||||
# images for each OTA "slot"
|
|
||||||
OTA ?= 0
|
|
||||||
|
|
||||||
ifeq ($(OTA),1)
|
|
||||||
# Tell C preprocessor that we're building for OTA
|
|
||||||
CPPFLAGS = -DOTA
|
|
||||||
endif
|
|
||||||
|
|
||||||
FLAVOR ?= release # or debug
|
|
||||||
|
|
||||||
# Compiler names, etc. assume gdb
|
|
||||||
CROSS ?= xtensa-lx106-elf-
|
|
||||||
|
|
||||||
# Path to the filteroutput.py tool
|
|
||||||
FILTEROUTPUT ?= $(ROOT)/utils/filteroutput.py
|
|
||||||
|
|
||||||
AR = $(CROSS)ar
|
|
||||||
CC = $(CROSS)gcc
|
|
||||||
CPP = $(CROSS)cpp
|
|
||||||
LD = $(CROSS)gcc
|
|
||||||
NM = $(CROSS)nm
|
|
||||||
C++ = $(CROSS)g++
|
|
||||||
SIZE = $(CROSS)size
|
|
||||||
OBJCOPY = $(CROSS)objcopy
|
|
||||||
OBJDUMP = $(CROSS)objdump
|
|
||||||
|
|
||||||
# Source components to compile and link. Each of these are subdirectories
|
|
||||||
# of the root, with a 'component.mk' file.
|
|
||||||
COMPONENTS ?= $(EXTRA_COMPONENTS) FreeRTOS lwip core
|
|
||||||
|
|
||||||
# binary esp-iot-rtos SDK libraries to link. These are pre-processed prior to linking.
|
|
||||||
SDK_LIBS ?= main net80211 phy pp wpa
|
|
||||||
|
|
||||||
# open source libraries linked in
|
|
||||||
LIBS ?= hal gcc c
|
|
||||||
|
|
||||||
# set to 0 if you want to use the toolchain libc instead of esp-open-rtos newlib
|
|
||||||
OWN_LIBC ?= 1
|
|
||||||
|
|
||||||
# Note: you will need a recent esp
|
|
||||||
ENTRY_SYMBOL ?= call_user_start
|
|
||||||
|
|
||||||
# Set this to zero if you don't want individual function & data sections
|
|
||||||
# (some code may be slightly slower, linking will be slighty slower,
|
|
||||||
# but compiled code size will come down a small amount.)
|
|
||||||
SPLIT_SECTIONS ?= 1
|
|
||||||
|
|
||||||
# Set this to 1 to have all compiler warnings treated as errors (and stop the
|
|
||||||
# build). This is recommended whenever you are working on code which will be
|
|
||||||
# submitted back to the main project, as all submitted code will be expected to
|
|
||||||
# compile without warnings to be accepted.
|
|
||||||
WARNINGS_AS_ERRORS ?= 0
|
|
||||||
|
|
||||||
# Common flags for both C & C++_
|
|
||||||
C_CXX_FLAGS ?= -Wall -Wl,-EL -nostdlib $(EXTRA_C_CXX_FLAGS)
|
|
||||||
# Flags for C only
|
|
||||||
CFLAGS ?= $(C_CXX_FLAGS) -std=gnu99 $(EXTRA_CFLAGS)
|
|
||||||
# Flags for C++ only
|
|
||||||
CXXFLAGS ?= $(C_CXX_FLAGS) -fno-exceptions -fno-rtti $(EXTRA_CXXFLAGS)
|
|
||||||
|
|
||||||
# these aren't technically preprocesor args, but used by all 3 of C, C++, assembler
|
|
||||||
CPPFLAGS += -mlongcalls -mtext-section-literals
|
|
||||||
|
|
||||||
LDFLAGS = -nostdlib -Wl,--no-check-sections -L$(BUILD_DIR)sdklib -L$(ROOT)lib -u $(ENTRY_SYMBOL) -Wl,-static -Wl,-Map=$(BUILD_DIR)$(PROGRAM).map $(EXTRA_LDFLAGS)
|
|
||||||
|
|
||||||
ifeq ($(WARNINGS_AS_ERRORS),1)
|
|
||||||
C_CXX_FLAGS += -Werror
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(SPLIT_SECTIONS),1)
|
|
||||||
C_CXX_FLAGS += -ffunction-sections -fdata-sections
|
|
||||||
LDFLAGS += -Wl,-gc-sections
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(FLAVOR),debug)
|
|
||||||
C_CXX_FLAGS += -g -O0
|
|
||||||
LDFLAGS += -g -O0
|
|
||||||
else ifeq ($(FLAVOR),sdklike)
|
|
||||||
# These are flags intended to produce object code as similar as possible to
|
|
||||||
# the output of the compiler used to build the SDK libs (for comparison of
|
|
||||||
# disassemblies when coding replacement routines). It is not normally
|
|
||||||
# intended to be used otherwise.
|
|
||||||
CFLAGS += -O2 -Os -fno-inline -fno-ipa-cp -fno-toplevel-reorder
|
|
||||||
LDFLAGS += -O2
|
|
||||||
else
|
|
||||||
C_CXX_FLAGS += -g -O2
|
|
||||||
LDFLAGS += -g -O2
|
|
||||||
endif
|
|
||||||
|
|
||||||
GITSHORTREV=\"$(shell cd $(ROOT); git rev-parse --short -q HEAD 2> /dev/null)\"
|
|
||||||
ifeq ($(GITSHORTREV),\"\")
|
|
||||||
GITSHORTREV="\"(nogit)\"" # (same length as a short git hash)
|
|
||||||
endif
|
|
||||||
CPPFLAGS += -DGITSHORTREV=$(GITSHORTREV)
|
|
||||||
|
|
||||||
ifeq ($(OTA),0)
|
|
||||||
LINKER_SCRIPTS = $(ROOT)ld/nonota.ld
|
|
||||||
else
|
|
||||||
LINKER_SCRIPTS = $(ROOT)ld/ota.ld
|
|
||||||
endif
|
|
||||||
LINKER_SCRIPTS += $(ROOT)ld/common.ld $(ROOT)ld/rom.ld
|
|
||||||
|
|
||||||
####
|
|
||||||
#### no user configurable options below here
|
|
||||||
####
|
|
||||||
|
|
||||||
ifndef PROGRAM
|
ifndef PROGRAM
|
||||||
$(error "Set the PROGRAM environment variable in your Makefile before including common.mk")
|
$(error "Set the PROGRAM environment variable in your Makefile before including common.mk")
|
||||||
|
@ -184,20 +42,7 @@ LIB_ARGS = $(addprefix -l,$(LIBS))
|
||||||
PROGRAM_OUT = $(BUILD_DIR)$(PROGRAM).out
|
PROGRAM_OUT = $(BUILD_DIR)$(PROGRAM).out
|
||||||
LDFLAGS += $(addprefix -T,$(LINKER_SCRIPTS))
|
LDFLAGS += $(addprefix -T,$(LINKER_SCRIPTS))
|
||||||
|
|
||||||
# firmware tool arguments
|
FW_FILE = $(addprefix $(FIRMWARE_DIR),$(PROGRAM).bin)
|
||||||
ESPTOOL_ARGS=-fs $(FLASH_SIZE)m -fm $(FLASH_MODE) -ff $(FLASH_SPEED)m
|
|
||||||
|
|
||||||
ifeq ($(OTA),0)
|
|
||||||
# for non-OTA, we create two different files for uploading into the flash
|
|
||||||
# these are the names and options to generate them
|
|
||||||
FW_ADDR_1 = 0x00000
|
|
||||||
FW_ADDR_2 = 0x20000
|
|
||||||
FW_FILE_1 = $(addprefix $(FIRMWARE_DIR),$(FW_ADDR_1).bin)
|
|
||||||
FW_FILE_2 = $(addprefix $(FIRMWARE_DIR),$(FW_ADDR_2).bin)
|
|
||||||
else
|
|
||||||
# for OTA, it's a single monolithic image
|
|
||||||
FW_FILE = $(addprefix $(FIRMWARE_DIR),$(PROGRAM)-ota.bin)
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Common include directories, shared across all "components"
|
# Common include directories, shared across all "components"
|
||||||
# components will add their include directories to this argument
|
# components will add their include directories to this argument
|
||||||
|
@ -223,7 +68,7 @@ Q := @
|
||||||
vecho := @echo
|
vecho := @echo
|
||||||
endif
|
endif
|
||||||
|
|
||||||
.PHONY: all clean debug_print flash flash_bootloader erase_flash
|
.PHONY: all clean flash erase_flash
|
||||||
|
|
||||||
all: $(PROGRAM_OUT) $(FW_FILE_1) $(FW_FILE_2) $(FW_FILE)
|
all: $(PROGRAM_OUT) $(FW_FILE_1) $(FW_FILE_2) $(FW_FILE)
|
||||||
|
|
||||||
|
@ -364,17 +209,8 @@ $(FW_FILE): $(PROGRAM_OUT) $(FIRMWARE_DIR)
|
||||||
$(vecho) "FW $@"
|
$(vecho) "FW $@"
|
||||||
$(Q) $(ESPTOOL) elf2image --version=2 $(ESPTOOL_ARGS) $< -o $(FW_FILE)
|
$(Q) $(ESPTOOL) elf2image --version=2 $(ESPTOOL_ARGS) $< -o $(FW_FILE)
|
||||||
|
|
||||||
ifeq ($(OTA),0)
|
|
||||||
flash: $(FW_FILE_1) $(FW_FILE_2)
|
|
||||||
$(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) write_flash $(ESPTOOL_ARGS) $(FW_ADDR_2) $(FW_FILE_2) $(FW_ADDR_1) $(FW_FILE_1)
|
|
||||||
else
|
|
||||||
flash: $(FW_FILE)
|
flash: $(FW_FILE)
|
||||||
$(vecho) "Flashing OTA image slot 0 (bootloader not updated)"
|
$(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) write_flash $(ESPTOOL_ARGS) 0x0 $(RBOOT_BIN) 0x1000 $(RBOOT_CONF) 0x2000 $(FW_FILE)
|
||||||
$(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) write_flash $(ESPTOOL_ARGS) 0x2000 $(FW_FILE)
|
|
||||||
endif
|
|
||||||
|
|
||||||
flash_bootloader:
|
|
||||||
$(MAKE) -C $(ROOT)/bootloader flash
|
|
||||||
|
|
||||||
erase_flash:
|
erase_flash:
|
||||||
$(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) erase_flash
|
$(ESPTOOL) -p $(ESPPORT) --baud $(ESPBAUD) erase_flash
|
||||||
|
|
|
@ -12,8 +12,6 @@
|
||||||
* Copyright (C) 2015 Superhouse Automation Pty Ltd
|
* Copyright (C) 2015 Superhouse Automation Pty Ltd
|
||||||
* BSD Licensed as described in the file LICENSE
|
* BSD Licensed as described in the file LICENSE
|
||||||
*/
|
*/
|
||||||
#ifdef OTA
|
|
||||||
|
|
||||||
#define RBOOT_CONFIG_BASE (0x40200000 + 0x1000)
|
#define RBOOT_CONFIG_BASE (0x40200000 + 0x1000)
|
||||||
#define RBOOT_ROMS_OFFS 0x8 /* offset of rboot_config_t.roms array in config */
|
#define RBOOT_ROMS_OFFS 0x8 /* offset of rboot_config_t.roms array in config */
|
||||||
|
|
||||||
|
@ -74,5 +72,3 @@ Cache_Read_Enable:
|
||||||
movi a0, cache_return_save /* restore a0 return address */
|
movi a0, cache_return_save /* restore a0 return address */
|
||||||
l32i a0, a0, 0
|
l32i a0, a0, 0
|
||||||
ret.n
|
ret.n
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
PROGRAM=ota_basic
|
PROGRAM=ota_basic
|
||||||
OTA=1
|
|
||||||
EXTRA_COMPONENTS=extras/rboot-ota extras/mbedtls
|
EXTRA_COMPONENTS=extras/rboot-ota extras/mbedtls
|
||||||
include ../../common.mk
|
include ../../common.mk
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@
|
||||||
#include "mbedtls/sha256.h"
|
#include "mbedtls/sha256.h"
|
||||||
|
|
||||||
#include "ota-tftp.h"
|
#include "ota-tftp.h"
|
||||||
#include "rboot.h"
|
|
||||||
#include "rboot-api.h"
|
#include "rboot-api.h"
|
||||||
|
|
||||||
#define TFTP_IMAGE_SERVER "192.168.1.23"
|
#define TFTP_IMAGE_SERVER "192.168.1.23"
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
# Component makefile for extras/rboot-ota
|
# Component makefile for extras/rboot-ota
|
||||||
|
|
||||||
INC_DIRS += $(rboot-ota_ROOT)
|
# global include directories need to find rboot.h for integration, even
|
||||||
|
# when just including rboot-api.h :(
|
||||||
|
INC_DIRS += $(rboot-ota_ROOT) $(ROOT)bootloader $(ROOT)bootloader/rboot
|
||||||
|
|
||||||
# args for passing into compile rule generation
|
|
||||||
rboot-ota_SRC_DIR = $(rboot-ota_ROOT)
|
rboot-ota_SRC_DIR = $(rboot-ota_ROOT)
|
||||||
|
|
||||||
$(eval $(call component_compile_rules,rboot-ota))
|
$(eval $(call component_compile_rules,rboot-ota))
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include <espressif/esp_system.h>
|
#include <espressif/esp_system.h>
|
||||||
|
|
||||||
#include "ota-tftp.h"
|
#include "ota-tftp.h"
|
||||||
#include "rboot.h"
|
|
||||||
#include "rboot-api.h"
|
#include "rboot-api.h"
|
||||||
|
|
||||||
#define TFTP_FIRMWARE_FILE "firmware.bin"
|
#define TFTP_FIRMWARE_FILE "firmware.bin"
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
// esp-open-rtos additions Copyright 2016 Angus Gratton
|
// esp-open-rtos additions Copyright 2016 Angus Gratton
|
||||||
//////////////////////////////////////////////////
|
//////////////////////////////////////////////////
|
||||||
|
|
||||||
#include <rboot.h>
|
#include <rboot-api.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
//#include <c_types.h>
|
//#include <c_types.h>
|
||||||
//#include <spi_flash.h>
|
//#include <spi_flash.h>
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <rboot-integration.h>
|
||||||
#include <rboot.h>
|
#include <rboot.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
#include <task.h>
|
#include <task.h>
|
||||||
|
|
||||||
|
/***************************************************
|
||||||
|
* Platform configuration definitions *
|
||||||
|
***************************************************/
|
||||||
|
|
||||||
#define uint8 uint8_t
|
#define uint8 uint8_t
|
||||||
#define uint16 uint16_t
|
#define uint16 uint16_t
|
||||||
#define uint32 uint32_t
|
#define uint32 uint32_t
|
||||||
|
|
|
@ -1,116 +0,0 @@
|
||||||
#ifndef __RBOOT_H__
|
|
||||||
#define __RBOOT_H__
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
// rBoot open source boot loader for ESP8266.
|
|
||||||
// Copyright 2015 Richard A Burton
|
|
||||||
// richardaburton@gmail.com
|
|
||||||
// See license.txt for license terms.
|
|
||||||
//////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define RBOOT_INTEGRATION
|
|
||||||
|
|
||||||
// uncomment to use only c code
|
|
||||||
// if you aren't using gcc you may need to do this
|
|
||||||
//#define BOOT_NO_ASM
|
|
||||||
|
|
||||||
// Note: enabling RBOOT_CONFIG_CHECKSUM here means the config sector
|
|
||||||
// is always written by esp-open-rtos with a checksum.
|
|
||||||
//
|
|
||||||
// This means it will work whether the bootloader has config
|
|
||||||
// checksumming enabled or not.
|
|
||||||
|
|
||||||
#define BOOT_CONFIG_CHKSUM
|
|
||||||
|
|
||||||
// uncomment to enable big flash support (>1MB)
|
|
||||||
#define BOOT_BIG_FLASH
|
|
||||||
|
|
||||||
// uncomment to enable 2 way communication between
|
|
||||||
// rBoot and the user app via the esp rtc data area
|
|
||||||
#define BOOT_RTC_ENABLED
|
|
||||||
|
|
||||||
// uncomment to enable GPIO booting
|
|
||||||
//#define BOOT_GPIO_ENABLED
|
|
||||||
|
|
||||||
// uncomment to include .irom0.text section in the checksum
|
|
||||||
// roms must be built with esptool2 using -iromchksum option
|
|
||||||
//#define BOOT_IROM_CHKSUM
|
|
||||||
|
|
||||||
// uncomment to add a boot delay, allows you time to connect
|
|
||||||
// a terminal before rBoot starts to run and output messages
|
|
||||||
// value is in microseconds
|
|
||||||
//#define BOOT_DELAY_MICROS 2000000
|
|
||||||
|
|
||||||
// increase if required
|
|
||||||
#define MAX_ROMS 4
|
|
||||||
|
|
||||||
#define CHKSUM_INIT 0xef
|
|
||||||
|
|
||||||
#define SECTOR_SIZE 0x1000
|
|
||||||
#define BOOT_CONFIG_SECTOR 1
|
|
||||||
|
|
||||||
#define BOOT_CONFIG_MAGIC 0xe1
|
|
||||||
#define BOOT_CONFIG_VERSION 0x01
|
|
||||||
|
|
||||||
#define MODE_STANDARD 0x00
|
|
||||||
#define MODE_GPIO_ROM 0x01
|
|
||||||
#define MODE_TEMP_ROM 0x02
|
|
||||||
|
|
||||||
#define RBOOT_RTC_MAGIC 0x2334ae68
|
|
||||||
#define RBOOT_RTC_READ 1
|
|
||||||
#define RBOOT_RTC_WRITE 0
|
|
||||||
#define RBOOT_RTC_ADDR 64
|
|
||||||
|
|
||||||
#ifdef RBOOT_INTEGRATION
|
|
||||||
#include <rboot-integration.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/** @brief Structure containing rBoot configuration
|
|
||||||
* @note ROM addresses must be multiples of 0x1000 (flash sector aligned).
|
|
||||||
* Without BOOT_BIG_FLASH only the first 8Mbit (1MB) of the chip will
|
|
||||||
* be memory mapped so ROM slots containing .irom0.text sections must
|
|
||||||
* remain below 0x100000. Slots beyond this will only be accessible via
|
|
||||||
* spi read calls, so use these for stored resources, not code. With
|
|
||||||
* BOOT_BIG_FLASH the flash will be mapped in chunks of 8MBit (1MB), so
|
|
||||||
* ROMs can be anywhere, but must not straddle two 8MBit (1MB) blocks.
|
|
||||||
* @ingroup rboot
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint8 magic; ///< Our magic, identifies rBoot configuration - should be BOOT_CONFIG_MAGIC
|
|
||||||
uint8 version; ///< Version of configuration structure - should be BOOT_CONFIG_VERSION
|
|
||||||
uint8 mode; ///< Boot loader mode (MODE_STANDARD | MODE_GPIO_ROM)
|
|
||||||
uint8 current_rom; ///< Currently selected ROM (will be used for next standard boot)
|
|
||||||
uint8 gpio_rom; ///< ROM to use for GPIO boot (hardware switch) with mode set to MODE_GPIO_ROM
|
|
||||||
uint8 count; ///< Quantity of ROMs available to boot
|
|
||||||
uint8 unused[2]; ///< Padding (not used)
|
|
||||||
uint32 roms[MAX_ROMS]; ///< Flash addresses of each ROM
|
|
||||||
#ifdef BOOT_CONFIG_CHKSUM
|
|
||||||
uint8 chksum; ///< Checksum of this configuration structure (if BOOT_CONFIG_CHKSUM defined)
|
|
||||||
#endif
|
|
||||||
} rboot_config;
|
|
||||||
|
|
||||||
#ifdef BOOT_RTC_ENABLED
|
|
||||||
/** @brief Structure containing rBoot status/control data
|
|
||||||
* @note This structure is used to, optionally, communicate between rBoot and
|
|
||||||
* the user app. It is stored in the ESP RTC data area.
|
|
||||||
* @ingroup rboot
|
|
||||||
*/
|
|
||||||
typedef struct {
|
|
||||||
uint32 magic; ///< Magic, identifies rBoot RTC data - should be RBOOT_RTC_MAGIC
|
|
||||||
uint8 next_mode; ///< The next boot mode, defaults to MODE_STANDARD - can be set to MODE_TEMP_ROM
|
|
||||||
uint8 last_mode; ///< The last (this) boot mode - can be MODE_STANDARD, MODE_GPIO_ROM or MODE_TEMP_ROM
|
|
||||||
uint8 last_rom; ///< The last (this) boot rom number
|
|
||||||
uint8 temp_rom; ///< The next boot rom number when next_mode set to MODE_TEMP_ROM
|
|
||||||
uint8 chksum; ///< Checksum of this structure this will be updated for you passed to the API
|
|
||||||
} rboot_rtc_data;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
15
ld/nonota.ld
15
ld/nonota.ld
|
@ -1,15 +0,0 @@
|
||||||
/* Memory layout for esp-open-rtos when not using OTA
|
|
||||||
(ie ROM bootloader only, no second stage rboot)
|
|
||||||
*/
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
dport0_0_seg : org = 0x3FF00000, len = 0x10
|
|
||||||
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
|
|
||||||
iram1_0_seg : org = 0x40100000, len = 0x08000
|
|
||||||
/* irom0 section, mapped from SPI flash
|
|
||||||
- Origin is offset by 0x20000 to leave space for bootloader RAM sections.
|
|
||||||
|
|
||||||
- Length is max 8Mbit of mappable flash, minus start offset
|
|
||||||
*/
|
|
||||||
irom0_0_seg : org = 0x40220000, len = (1M - 0x20000)
|
|
||||||
}
|
|
15
ld/ota.ld
15
ld/ota.ld
|
@ -1,15 +0,0 @@
|
||||||
/* Memory layout for esp-open-rtos when using OTA second stage bootloader */
|
|
||||||
|
|
||||||
MEMORY
|
|
||||||
{
|
|
||||||
dport0_0_seg : org = 0x3FF00000, len = 0x10
|
|
||||||
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
|
|
||||||
iram1_0_seg : org = 0x40100000, len = 0x08000
|
|
||||||
/* irom0 section, mapped from SPI flash
|
|
||||||
- Origin is offset by 0x2010 to create spacer for second stage bootloader image,
|
|
||||||
header.
|
|
||||||
|
|
||||||
- Length is max 8Mbit of mappable flash, minus start offset
|
|
||||||
*/
|
|
||||||
irom0_0_seg : org = 0x40202010, len = (1M - 0x2010)
|
|
||||||
}
|
|
|
@ -1,7 +1,17 @@
|
||||||
/*
|
/* Memory layout for esp-open-rtos when using OTA second stage bootloader */
|
||||||
* Common (OTA and non-OTA) parts for the esp-open-rtos Linker Script
|
MEMORY
|
||||||
*
|
{
|
||||||
|
dport0_0_seg : org = 0x3FF00000, len = 0x10
|
||||||
|
dram0_0_seg : org = 0x3FFE8000, len = 0x14000
|
||||||
|
iram1_0_seg : org = 0x40100000, len = 0x08000
|
||||||
|
/* irom0 section, mapped from SPI flash
|
||||||
|
- Origin is offset by 0x2010 to create spacer for second stage bootloader image,
|
||||||
|
header.
|
||||||
|
|
||||||
|
- Length is max 8Mbit of mappable flash, minus start offset
|
||||||
*/
|
*/
|
||||||
|
irom0_0_seg : org = 0x40202010, len = (1M - 0x2010)
|
||||||
|
}
|
||||||
|
|
||||||
/* FreeRTOS memory management functions
|
/* FreeRTOS memory management functions
|
||||||
|
|
141
parameters.mk
Normal file
141
parameters.mk
Normal file
|
@ -0,0 +1,141 @@
|
||||||
|
# Parameters for the esp-open-rtos make process
|
||||||
|
#
|
||||||
|
# You can edit this file to change parameters, but a better option is
|
||||||
|
# to create a local.mk file and add overrides there. The local.mk file
|
||||||
|
# can be in the root directory, or the program directory alongside the
|
||||||
|
# Makefile, or both.
|
||||||
|
#
|
||||||
|
-include $(ROOT)local.mk
|
||||||
|
-include local.mk
|
||||||
|
|
||||||
|
# Flash size in megabits
|
||||||
|
# Valid values are same as for esptool.py - 2,4,8,16,32
|
||||||
|
FLASH_SIZE ?= 16
|
||||||
|
|
||||||
|
# Flash mode, valid values are same as for esptool.py - qio,qout,dio.dout
|
||||||
|
FLASH_MODE ?= qio
|
||||||
|
|
||||||
|
# Flash speed in MHz, valid values are same as for esptool.py - 80, 40, 26, 20
|
||||||
|
FLASH_SPEED ?= 40
|
||||||
|
|
||||||
|
# Output directories to store intermediate compiled files
|
||||||
|
# relative to the program directory
|
||||||
|
BUILD_DIR ?= $(PROGRAM_DIR)build/
|
||||||
|
FIRMWARE_DIR ?= $(PROGRAM_DIR)firmware/
|
||||||
|
|
||||||
|
# esptool.py from https://github.com/themadinventor/esptool
|
||||||
|
ESPTOOL ?= esptool.py
|
||||||
|
# serial port settings for esptool.py
|
||||||
|
ESPPORT ?= /dev/ttyUSB0
|
||||||
|
ESPBAUD ?= 115200
|
||||||
|
|
||||||
|
# firmware tool arguments
|
||||||
|
ESPTOOL_ARGS=-fs $(FLASH_SIZE)m -fm $(FLASH_MODE) -ff $(FLASH_SPEED)m
|
||||||
|
|
||||||
|
|
||||||
|
# set this to 0 if you don't need floating point support in printf/scanf
|
||||||
|
# this will save approx 14.5KB flash space and 448 bytes of statically allocated
|
||||||
|
# data RAM
|
||||||
|
#
|
||||||
|
# NB: Setting the value to 0 requires a recent esptool.py (Feb 2016 / commit ebf02c9)
|
||||||
|
PRINTF_SCANF_FLOAT_SUPPORT ?= 1
|
||||||
|
|
||||||
|
FLAVOR ?= release # or debug
|
||||||
|
|
||||||
|
# Compiler names, etc. assume gdb
|
||||||
|
CROSS ?= xtensa-lx106-elf-
|
||||||
|
|
||||||
|
# Path to the filteroutput.py tool
|
||||||
|
FILTEROUTPUT ?= $(ROOT)/utils/filteroutput.py
|
||||||
|
|
||||||
|
AR = $(CROSS)ar
|
||||||
|
CC = $(CROSS)gcc
|
||||||
|
CPP = $(CROSS)cpp
|
||||||
|
LD = $(CROSS)gcc
|
||||||
|
NM = $(CROSS)nm
|
||||||
|
C++ = $(CROSS)g++
|
||||||
|
SIZE = $(CROSS)size
|
||||||
|
OBJCOPY = $(CROSS)objcopy
|
||||||
|
OBJDUMP = $(CROSS)objdump
|
||||||
|
|
||||||
|
# Source components to compile and link. Each of these are subdirectories
|
||||||
|
# of the root, with a 'component.mk' file.
|
||||||
|
COMPONENTS ?= $(EXTRA_COMPONENTS) FreeRTOS lwip core
|
||||||
|
|
||||||
|
# binary esp-iot-rtos SDK libraries to link. These are pre-processed prior to linking.
|
||||||
|
SDK_LIBS ?= main net80211 phy pp wpa
|
||||||
|
|
||||||
|
# open source libraries linked in
|
||||||
|
LIBS ?= hal gcc c
|
||||||
|
|
||||||
|
# set to 0 if you want to use the toolchain libc instead of esp-open-rtos newlib
|
||||||
|
OWN_LIBC ?= 1
|
||||||
|
|
||||||
|
# Note: you will need a recent esp
|
||||||
|
ENTRY_SYMBOL ?= call_user_start
|
||||||
|
|
||||||
|
# Set this to zero if you don't want individual function & data sections
|
||||||
|
# (some code may be slightly slower, linking will be slighty slower,
|
||||||
|
# but compiled code size will come down a small amount.)
|
||||||
|
SPLIT_SECTIONS ?= 1
|
||||||
|
|
||||||
|
# Set this to 1 to have all compiler warnings treated as errors (and stop the
|
||||||
|
# build). This is recommended whenever you are working on code which will be
|
||||||
|
# submitted back to the main project, as all submitted code will be expected to
|
||||||
|
# compile without warnings to be accepted.
|
||||||
|
WARNINGS_AS_ERRORS ?= 0
|
||||||
|
|
||||||
|
# Common flags for both C & C++_
|
||||||
|
C_CXX_FLAGS ?= -Wall -Wl,-EL -nostdlib $(EXTRA_C_CXX_FLAGS)
|
||||||
|
# Flags for C only
|
||||||
|
CFLAGS ?= $(C_CXX_FLAGS) -std=gnu99 $(EXTRA_CFLAGS)
|
||||||
|
# Flags for C++ only
|
||||||
|
CXXFLAGS ?= $(C_CXX_FLAGS) -fno-exceptions -fno-rtti $(EXTRA_CXXFLAGS)
|
||||||
|
|
||||||
|
# these aren't all technically preprocesor args, but used by all 3 of C, C++, assembler
|
||||||
|
CPPFLAGS += -mlongcalls -mtext-section-literals
|
||||||
|
|
||||||
|
LDFLAGS = -nostdlib -Wl,--no-check-sections -L$(BUILD_DIR)sdklib -L$(ROOT)lib -u $(ENTRY_SYMBOL) -Wl,-static -Wl,-Map=$(BUILD_DIR)$(PROGRAM).map $(EXTRA_LDFLAGS)
|
||||||
|
|
||||||
|
ifeq ($(WARNINGS_AS_ERRORS),1)
|
||||||
|
C_CXX_FLAGS += -Werror
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(SPLIT_SECTIONS),1)
|
||||||
|
C_CXX_FLAGS += -ffunction-sections -fdata-sections
|
||||||
|
LDFLAGS += -Wl,-gc-sections
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(FLAVOR),debug)
|
||||||
|
C_CXX_FLAGS += -g -O0
|
||||||
|
LDFLAGS += -g -O0
|
||||||
|
else ifeq ($(FLAVOR),sdklike)
|
||||||
|
# These are flags intended to produce object code as similar as possible to
|
||||||
|
# the output of the compiler used to build the SDK libs (for comparison of
|
||||||
|
# disassemblies when coding replacement routines). It is not normally
|
||||||
|
# intended to be used otherwise.
|
||||||
|
CFLAGS += -O2 -Os -fno-inline -fno-ipa-cp -fno-toplevel-reorder
|
||||||
|
LDFLAGS += -O2
|
||||||
|
else
|
||||||
|
C_CXX_FLAGS += -g -O2
|
||||||
|
LDFLAGS += -g -O2
|
||||||
|
endif
|
||||||
|
|
||||||
|
GITSHORTREV=\"$(shell cd $(ROOT); git rev-parse --short -q HEAD 2> /dev/null)\"
|
||||||
|
ifeq ($(GITSHORTREV),\"\")
|
||||||
|
GITSHORTREV="\"(nogit)\"" # (same length as a short git hash)
|
||||||
|
endif
|
||||||
|
CPPFLAGS += -DGITSHORTREV=$(GITSHORTREV)
|
||||||
|
|
||||||
|
LINKER_SCRIPTS += $(ROOT)ld/program.ld $(ROOT)ld/rom.ld
|
||||||
|
|
||||||
|
# rboot firmware binary paths for flashing
|
||||||
|
RBOOT_BIN = $(ROOT)bootloader/firmware/rboot.bin
|
||||||
|
RBOOT_PREBUILT_BIN = $(ROOT)bootloader/firmware_prebuilt/rboot.bin
|
||||||
|
RBOOT_CONF = $(ROOT)bootloader/firmware_prebuilt/blank_config.bin
|
||||||
|
|
||||||
|
# if a custom bootloader hasn't been compiled, use the
|
||||||
|
# prebuilt binary from the source tree
|
||||||
|
ifeq (,$(wildcard $(RBOOT_BIN)))
|
||||||
|
RBOOT_BIN=$(RBOOT_PREBUILT_BIN)
|
||||||
|
endif
|
Loading…
Reference in a new issue