.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;}'