Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions Makefile.dep
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,12 @@ USEPKG += nanocoap
USEMODULE += gnrc_sock_udp
endif

ifneq (,$(filter fw_slots,$(USEMODULE)))
FEATURES_REQUIRED += periph_flashpage
FEATURES_REQUIRED += flash_slots
USEMODULE += hashes
endif

# include package dependencies
-include $(USEPKG:%=$(RIOTPKG)/%/Makefile.dep)

Expand Down
57 changes: 57 additions & 0 deletions Makefile.include
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,14 @@ RIOTMAKE ?= $(RIOTBASE)/makefiles
RIOTPKG ?= $(RIOTBASE)/pkg
RIOTPROJECT ?= $(shell git rev-parse --show-toplevel 2>/dev/null || pwd)
GITCACHE ?= $(RIOTBASE)/dist/tools/git/git-cache
FW_METADATA ?= $(RIOTBASE)/dist/tools/firmware_metadata
APPDIR ?= $(CURDIR)
BINDIRBASE ?= $(APPDIR)/bin
ifdef FW_SLOT
BINDIR ?= $(BINDIRBASE)/$(BOARD)/slot$(FW_SLOT)
else
BINDIR ?= $(BINDIRBASE)/$(BOARD)
endif
PKGDIRBASE ?= $(BINDIRBASE)/pkg/$(BOARD)

__DIRECTORY_VARIABLES := \
Expand All @@ -41,6 +46,7 @@ override RIOTMAKE := $(abspath $(RIOTMAKE))
override RIOTPKG := $(abspath $(RIOTPKG))
override RIOTPROJECT := $(abspath $(RIOTPROJECT))
override GITCACHE := $(abspath $(GITCACHE))
override FW_METADATA := $(abspath $(FW_METADATA))
override APPDIR := $(abspath $(APPDIR))
override BINDIRBASE := $(abspath $(BINDIRBASE))
override BINDIR := $(abspath $(BINDIR))
Expand Down Expand Up @@ -274,12 +280,16 @@ endif
# the binaries to link
BASELIBS += $(BINDIR)/${APPLICATION}.a
BASELIBS += $(APPDEPS)
BASELIBS += $(SINGLE_SLOT)

.PHONY: all clean flash term doc debug debug-server reset objdump help info-modules
.PHONY: ..in-docker-container

ELFFILE ?= $(BINDIR)/$(APPLICATION).elf
HEXFILE ?= $(ELFFILE:.elf=.hex)
ifdef FW_SLOT
BINFILE ?= $(ELFFILE:.elf=.bin)
endif

# variables used to compile and link c++
CPPMIX ?= $(if $(wildcard *.cpp),1,)
Expand All @@ -289,6 +299,17 @@ LINKFLAGPREFIX ?= -Wl,

DIRS += $(EXTERNAL_MODULE_DIRS)

# needed for bootloader...
ifdef FW_SLOT
TMPBIN = $(ELFFILE:.elf=.bin)
SLOTFILE = $(ELFFILE:.elf=slot$(FW_SLOT).o)
METADATA_FILE = $(BINDIR)/$(APPLICATION)-metadata-$(APPID)-$(VERSION).bin
FW_BINFILE = $(BINDIR)/$(APPLICATION)-slot$(FW_SLOT)-$(APPID)-$(VERSION).bin
FW_OBJFILE = $(BINDIR)/$(APPLICATION)-slot$(FW_SLOT)-$(APPID)-$(VERSION).o
BOOTLOADER_FILE = $(abspath $(BINDIR)/bootloader-$(APPLICATION).elf)
HEXFILE = $(BOOTLOADER_FILE:.elf=.hex)
endif #FW_SLOT

ifeq ($(BUILD_IN_DOCKER),1)
all: ..in-docker-container
else
Expand All @@ -303,9 +324,38 @@ else
endif
$(Q)$(SIZE) $(ELFFILE)
$(Q)$(OBJCOPY) $(OFLAGS) $(ELFFILE) $(HEXFILE)
ifdef FW_SLOTS
$(Q)$(OBJCOPY) -O binary $(ELFFILE) $(BINFILE)
endif
endif
endif # BUILD_IN_DOCKER


ifdef FW_SLOT
firmware-slot: $(FW_OBJFILE)
$(FW_OBJFILE): all generate-metadata
$(Q)$(OBJCOPY) -O binary $(ELFFILE) $(TMPBIN)
$(Q)$(FW_METADATA)/bin/generate-metadata $(TMPBIN) $(VERSION) $(APPID) $(METADATA_FILE)
$(Q)srec_cat $(TMPBIN) -binary -offset $(FW_METADATA_SPACE) $(METADATA_FILE) -binary -o $(FW_BINFILE) -binary
$(Q)$(FW_METADATA)/bin/generate-metadata $(FW_BINFILE) $(VERSION) $(APPID) $(METADATA_FILE) --with-metadata
$(Q)srec_cat $(TMPBIN) -binary -offset $(FW_METADATA_SPACE) $(METADATA_FILE) -binary -o $(FW_BINFILE) -binary
$(Q)$(OBJCOPY) --output-target elf32-littlearm --binary-architecture=arm \
--change-section-vma .data=$(OFFSET_SLOT_$(FW_SLOT))\
--change-section-lma .data=$(OFFSET_SLOT_$(FW_SLOT))\
--rename-section .data=.slot.$(FW_SLOT).text \
--input-target binary $(FW_BINFILE) \
$(FW_OBJFILE)

bootloader: $(FW_OBJFILE)
$(Q)env -i ELFFILE=$(BOOTLOADER_FILE) PATH=$(PATH) \
make BOARD=$(BOARD) SINGLE_SLOT=$(FW_OBJFILE) -C $(RIOTBASE)/bootloader all

generate-metadata: $(FW_METADATA)/bin/generate-metadata

$(FW_METADATA)/bin/generate-metadata:
$(Q)env -i FW_METADATA_SPACE=$(FW_METADATA_SPACE) make -C $(FW_METADATA)
endif # FW_SLOT

..compiler-check:
@command -v $(CC) >/dev/null 2>&1 || \
{ $(COLOR_ECHO) \
Expand All @@ -314,6 +364,13 @@ endif # BUILD_IN_DOCKER

..build-message:
@$(COLOR_ECHO) '${COLOR_GREEN}Building application "$(APPLICATION)" for "$(BOARD)" with MCU "$(MCU)".${COLOR_RESET}'

ifdef FW_SLOT
@$(COLOR_ECHO) '${COLOR_PURPLE}This is a build for FW slot $(FW_SLOT).${COLOR_RESET}'
endif
ifeq ($(BOOTLOADER),1)
@$(COLOR_ECHO) '${COLOR_PURPLE}This is a Bootloader build.${COLOR_RESET}'
endif
@$(COLOR_ECHO)

# add extra include paths for packages in $(USEMODULE)
Expand Down
41 changes: 41 additions & 0 deletions bootloader/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# name of your application
APPLICATION = bootloader

# If no BOARD is found in the environment, use this default:
BOARD ?= iotlab-m3

# This has to be the absolute path to the RIOT base directory:
RIOTBASE ?= $(CURDIR)/..

# Comment this out to disable code in RIOT that does safety checking
# which is not needed in a production environment but helps in the
# development process:
CFLAGS += -DDEVELHELP

# Mark this example as the bootloader
BOOTLOADER = 1

# Activate interactive bootloader, if no specified
INTERACTIVE_BOOTLOADER ?= 1
CFLAGS += -DINTERACTIVE_BOOTLOADER=$(INTERACTIVE_BOOTLOADER)

# Import metadata space size, otherwise it will be defaulted to 0x100 by
# the code
CFLAGS += -DFW_METADATA_SPACE=$(FW_METADATA_SPACE)

# Increase stack memory for flashpage requirements
CFLAGS += -DTHREAD_STACKSIZE_MAIN=\(3*THREAD_STACKSIZE_DEFAULT\)

# Change this to 0 show compiler invocation lines by default:
QUIET ?= 1

# Use fw_slots module to manage images on ROM
USEMODULE += fw_slots

# Add also the shell, some shell commands
ifeq ($(INTERACTIVE_BOOTLOADER),1)
USEMODULE += shell
USEMODULE += shell_commands
endif

include $(RIOTBASE)/Makefile.include
1 change: 1 addition & 0 deletions bootloader/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
TODO
Loading