contiki/cpu/stm32w108/Makefile.stm32w108
Peter A. Bigot 5fc0575e99 Makefile.include: support make clean all
Historically $(OBJECTDIR) was created when Makefile.include is read.  A
consequence is that combining "clean" with "all" (or any other build
target) results in an error because the clean removes the object
directory that is required to exist when building dependencies.
Creating $(OBJECTDIR) on-demand ensures it is present when needed.

Removed creation of $(OBJECTDIR) on initial read, and added an order-only
dependency forcing its creation all Makefile* rules where the target is
explicitly or implicitly in $(OBJECTDIR).
2013-06-20 17:45:41 -05:00

311 lines
9.1 KiB
Makefile

.SUFFIXES:
define \n
endef
ifdef IAR
${info Using IAR...}
#IAR_PATH = C:/Program\ Files/IAR\ Systems/Embedded\ Workbench\ 5.4\ Evaluation
ifeq ($(IAR_PATH),)
${error IAR_PATH not defined! You must specify IAR root directory}
endif
endif
### Define the CPU directory
CONTIKI_CPU=$(CONTIKI)/cpu/stm32w108
### Define the source files we have in the STM32W port
CONTIKI_CPU_DIRS = . dev hal simplemac hal/micro/cortexm3 hal/micro/cortexm3/stm32w108
STM32W_C = leds-arch.c leds.c clock.c watchdog.c uart1.c uart1-putchar.c slip-uart1.c slip.c\
stm32w-radio.c stm32w-systick.c uip-arch.c rtimer-arch.c adc.c micro.c sleep.c \
micro-common.c micro-common-internal.c clocks.c mfg-token.c nvm.c flash.c rand.c system-timer.c
STM32W_S = spmr.s79 context-switch.s79
ifdef IAR
STM32W_C += low-level-init.c
STM32W_S += cstartup-m.s
else
STM32W_C += crt-stm32w108.c
endif
ifdef ELF_LOADER
ELFLOADER = elfloader-arch.c symtab.c
endif
# .s and .s79 not specified here because in Makefile.include only .c and .S suffixes are replaced with .o.
CONTIKI_TARGET_SOURCEFILES += $(STM32W_C) \
$(SYSAPPS) $(ELFLOADER) \
$(TARGETLIBS)
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
ifdef IAR
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library.a
else
ifdef PRINTF_FLOAT
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/hal/micro/cortexm3/e_stdio_thumb2.a
else
TARGET_LIBFILES = $(CONTIKI_CPU)/simplemac/library/simplemac-library-gnu.a $(CONTIKI_CPU)/lib/e_stdio_intonly_thumb2.a
endif
endif
# `$(CC) -print-file-name=thumb2/libc.a` `$(CC) -print-file-name=thumb2/libgcc.a`
### Compiler definitions
ifdef IAR
CC = iccarm
LD = ilinkarm
AS = iasmarm
AR = iarchive
OBJCOPY = ielftool
STRIP = strip
ifndef DEBUG
OPTI = -Ohz --no_unroll
endif
CFLAGSNO = --endian=little --cpu=Cortex-M3 -e --diag_suppress Pa050 -D BOARD_HEADER=\"board.h\" \
-D BOARD_MB851 -D "PLATFORM_HEADER=\"hal/micro/cortexm3/compiler/iar.h\"" -D CORTEXM3 \
-D CORTEXM3_STM32W108 -D PHY_STM32W108XX -D DISABLE_WATCHDOG -D ENABLE_ADC_EXTENDED_RANGE_BROKEN \
-D __SOURCEFILE__=\"$*.c\" -lC $(OBJECTDIR) \
-I $(IAR_PATH)/arm/inc --dlib_config=DLib_Config_Normal.h
CFLAGS += $(CFLAGSNO) $(OPTI)
AROPTS = --create
ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR)
LDFLAGS += --redirect _Printf=_PrintfSmall --redirect _Scanf=_ScanfSmall --map=contiki-$(TARGET).map
ifndef COFFEE
LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg.icf
endif
OBJOPTS = --bin
else
# GCC
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
AS = arm-none-eabi-gcc
NM = arm-none-eabi-nm
AR = arm-none-eabi-ar
OBJCOPY = arm-none-eabi-objcopy
STRIP = arm-none-eabi-strip
SIZE = arm-none-eabi-size
ifndef DEBUG
OPTI = -Os -ffunction-sections
endif
CFLAGSNO = -mthumb -mcpu=cortex-m3 -D "PLATFORM_HEADER=\"hal/micro/cortexm3/compiler/gnu.h\"" \
-D BOARD_HEADER=\"board.h\" -g -Wall -Wno-strict-aliasing -mlittle-endian \
-D BOARD_MB851 -D CORTEXM3 -D CORTEXM3_STM32W108 -D PHY_STM32W108XX -D DISABLE_WATCHDOG -D ENABLE_ADC_EXTENDED_RANGE_BROKEN \
-D __SOURCEFILE__=\"$*.c\"
CFLAGS += $(CFLAGSNO) $(OPTI)
ASFLAGS = -mthumb -mcpu=cortex-m3 -c -g -Wall -Os -ffunction-sections \
-mlittle-endian -fshort-enums -x assembler-with-cpp -Wa,-EL
ifndef CPU_LD_CONFIG
CPU_LD_CONFIG=$(CONTIKI_CPU)/gnu.ld
endif # CPU_LD_CONFIG
LDFLAGS += -mcpu=cortex-m3 \
-mthumb \
-Wl,-T -Xlinker $(CPU_LD_CONFIG) \
-Wl,-static \
-u Default_Handler \
-nostartfiles \
-Wl,-Map -Xlinker contiki-$(TARGET).map
ifndef ELF_LOADER
# Do not use garbage collection when the elfloader is used.
LDFLAGS += -Wl,--gc-sections
endif
SIZEFLAGS = -A
OBJOPTS = -O binary
endif
ifdef COFFEE_ADDRESS
COFFEE = 1
endif
# Default values for coffee section start.
ifndef COFFEE_ADDRESS
COFFEE_ADDRESS = 0x8010c00
endif
ifeq ($(COFFEE),1)
CONTIKI_TARGET_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c
CFLAGS += -DCOFFEE_ADDRESS=$(COFFEE_ADDRESS)
#If $make invokation passed starting address use phony target to force synchronization of source to .coffeefiles section
#Warning: recompilation will not be forced if the starting address is then dropped, with dire consequences:
# -->Source that uses COFFEE_FILES and read macros for conditional compilation will be left hanging!
# -->Object modules that used .coffeefiles will overlap the .data section.
# -->$make clean is safest.
#ifeq ($(origin COFFEE_ADDRESS), command line)
# ifeq ($(COFFEE_FILES), 2) #safest to force recompilation even if eeprom address is changed, might have been switched from flash
.PHONY : coffee
coffee:
$(OBJECTDIR)/cfs-coffee-arch.o : coffee #cfs-coffee-arch uses COFFEE_FILES, COFFEE_ADDRESS
$(OBJECTDIR)/cfs-coffee.o : coffee #core routine requires recompilation
else
# Coffee starts at the end of the flash, before NVM section.
COFFEE_ADDRESS = 0x801F800
endif
ifndef IAR
LDFLAGS+= -Wl,--section-start=.coffee=$(COFFEE_ADDRESS)
else #IAR
ifeq ($(COFFEE),1)
LDFLAGS+= --config $(CONTIKI_CPU)/iar-cfg-coffee.icf
endif
endif
FLASHER = sudo $(CONTIKI)/tools/stm32w/stm32w_flasher/py_files/stm32w_flasher.py
# Check if we are running under Windows
ifeq ($(HOST_OS),Windows)
FLASHER = $(CONTIKI)/tools/stm32w/stm32w_flasher/stm32w_flasher.exe
endif
ifndef PORT
# Flash with jlink
FLASHEROPTS = -f -r
else
# Flash on serial port with on-board bootloader
FLASHEROPTS = -f -i rs232 -p $(PORT) -r
ifdef BTM
#if already in bootloader mode
FLASHEROPTS += -b
endif
endif
### Custom rules
OBJECTDIR = obj_$(TARGET)
ssubst = ${patsubst %.s,%.o,${patsubst %.s79,%.o,$(1)}}
CONTIKI_OBJECTFILES += ${addprefix $(OBJECTDIR)/,${call ssubst, $(STM32W_S)}}
vpath %.s79 $(CONTIKI_CPU)/hal/micro/cortexm3
vpath %.s $(CONTIKI_CPU)/hal/micro/cortexm3
ifdef IAR
# Check if we are in cygwin environment, so we must have paths like /cygdrive/c/... (checking TERM doesn't always work.)
ifneq (,$(findstring cygdrive,$(shell pwd)))
${info Cygwin detected.}
SEDCOMMAND = sed -e '1s,\($(OBJECTDIR)\\$*\)\.o: \(.\):,\1.o : /cygdrive/\l\2,g' -e '1!s,\($(OBJECTDIR)\\$*\)\.o: \(.\):, /cygdrive/\l\2,g' -e 's,\\\([^ ]\),/\1,g' -e 's,$$, \\,' -e '$$s, \\$$,,' < $(@:.o=.P) > $(@:.o=.d)
else
SEDCOMMAND = sed -e '1s,\($(OBJECTDIR)\\$*\)\.o:,\1.o : ,g' -e '1!s,\($(OBJECTDIR)\\$*\)\.o:, ,g' -e 's,\\\([^ ]\),/\1,g' -e 's,$$, \\,' -e '$$s, \\$$,,' < $(@:.o=.P) > $(@:.o=.d)
endif
CUSTOM_RULE_C_TO_OBJECTDIR_O = 1
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
$(CC) $(CFLAGS) $< --dependencies=m $(@:.o=.P) -o $@
@$(SEDCOMMAND); rm -f $(@:.o=.P)
@$(FINALIZE_DEPENDENCY)
CUSTOM_RULE_C_TO_CO = 1
%.co: %.c
$(CC) $(CFLAGS) -DAUTOSTART_ENABLE $< -o $@
else #IAR
CUSTOM_RULE_C_TO_CE = 1
%.ce: %.c
$(CC) $(CFLAGS) -fno-merge-constants -fno-function-sections -DAUTOSTART_ENABLE -c $< -o $@
$(STRIP) --strip-unneeded -g -x $@
CUSTOM_RULE_LINK = 1
ifdef CORE
ifeq ($(wildcard $(CORE)),)
${error $(CORE) doesn\'t exist}
endif
.PHONY: symbols.c symbols.h
symbols.c:
$(NM) $(CORE) | awk -f $(CONTIKI)/tools/mknmlist > symbols.c
else
symbols.c symbols.h:
cp ${CONTIKI}/tools/empty-symbols.c symbols.c
cp ${CONTIKI}/tools/empty-symbols.h symbols.h
endif
%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(OBJECTDIR)/symbols.o
$(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} -Wl,-\( ${filter %.a,$^} $(TARGET_LIBFILES) -Wl,-\) -o $@
@echo >> contiki-$(TARGET).map
@$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map
#%.$(TARGET): %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) $(CONTIKI_OBJECTFILES)
# $(LD) $(LDFLAGS) $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@
# @echo "\n" >> contiki-$(TARGET).map
# @$(SIZE) $(SIZEFLAGS) $@ >> contiki-$(TARGET).map
endif #IAR
MOTELIST = $(CONTIKI)/tools/stm32w/motelist-linux
MOTES = $(shell $(MOTELIST) 2>&- | awk '{print $$2}' | grep '\/')
motelist: stm-motelist
stm-motelist:
$(MOTELIST)
stm-motes:
@echo $(MOTES)
$(OBJECTDIR)/%.o: %.s79 | $(OBJECTDIR)
$(AS) $(ASFLAGS) -o $@ $<
$(OBJECTDIR)/%.o: %.s | $(OBJECTDIR)
$(AS) $(ASFLAGS) -o $@ $<
%.bin: %.$(TARGET)
$(OBJCOPY) $(OBJOPTS) $< $@
# reset all stm32w devices sequentially, as stm32w_flasher cannot access different ports in parallel
stm-reset:
$(foreach PORT, $(MOTES), $(FLASHER) -r -p $(PORT);$(\n))
@echo Done
ifdef MOTE
%.upload: %.bin
$(FLASHER) $(FLASHEROPTS) $< -p $(word $(MOTE), $(MOTES))
else # MOTE
%.upload: %.bin
$(foreach PORT, $(MOTES), $(FLASHER) $(FLASHEROPTS) $< -p $(PORT);$(\n))
endif # MOTE
ifdef MOTE
login:
$(SERIALDUMP) -b115200 -d10000 $(USBDEVPREFIX)$(word $(MOTE), $(MOTES))
else
login:
$(SERIALDUMP) -b115200 -d10000 $(USBDEVPREFIX)$(firstword $(MOTES))
endif
# a target that gives a user-friendly memory profile, taking into account the RAM
# that is statically occupied by the stack as defined in cpu/stm32w108/gnu.ld
RAM_SIZE = 8192
FLASH_SIZE = 128*1024
STACK_SIZE = 1280
%.size: %.$(TARGET)
@size -A $< | egrep "data|bss" | awk '{s+=$$2} END {s=s+$(STACK_SIZE); f=$(RAM_SIZE)-s; printf "[RAM] used %6d, free %6d\n",s,f;}'
@size -A $< | egrep "text|isr_vector" | awk '{s+=$$2} END {f=$(FLASH_SIZE)-s; printf "[Flash] used %6d, free %6d\n",s,f;}'