322 lines
9.6 KiB
Text
322 lines
9.6 KiB
Text
|
|
.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 = --debug --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 $(CONTIKI)/../iar-files \
|
|
-I $(IAR_PATH)/arm/inc --dlib_config=DLib_Config_Normal.h
|
|
|
|
CFLAGS += $(CFLAGSNO) $(OPTI) -D__ICCARM__
|
|
AROPTS = --create
|
|
ASFLAGS = -s+ -w+ --cpu Cortex-M3 -L$(OBJECTDIR)
|
|
LDFLAGS += --semihosting --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
|
|
|
|
ifeq ($(STM32W_CPUREV), CC)
|
|
LD-EXT=-stm32w108CC
|
|
${warning "using stm32w108CC specific ld file"}
|
|
else ifeq ($(STM32W_CPUREV), xB)
|
|
LD-EXT=-stm32w108xB
|
|
${warning "using stm32w108xB specific ld file"}
|
|
else
|
|
${error "Bad STM32W_CPUREV value or no STM32W_CPUREV value specified. Cpu revision should be specified. Please read cpu/stm32w108/README.txt for more details."}
|
|
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 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-EXT).ld
|
|
endif # CPU_LD_CONFIG
|
|
|
|
LDFLAGS += -L$(CONTIKI_CPU)\
|
|
-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 = 2*8192
|
|
FLASH_SIZE = 2*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;}'
|