# $Id: Makefile.msp430,v 1.35 2011/01/19 07:30:31 adamdunkels Exp $ ifdef nodeid CFLAGS += -DNODEID=$(nodeid) endif CFLAGS += -gstabs+ .SUFFIXES: ### Define the CPU directory CONTIKI_CPU=$(CONTIKI)/cpu/msp430 ### Define the source files we have in the MSP430 port ifndef CONTIKI_CPU_FAM_DIR ifneq (,$(findstring msp430f1,$(MCU))) CONTIKI_CPU_FAM_DIR = f1xxx endif endif ifndef CONTIKI_CPU_FAM_DIR ifneq (,$(findstring msp430f5,$(MCU))) CONTIKI_CPU_FAM_DIR = f5xxx endif endif ifndef CONTIKI_CPU_FAM_DIR ifneq (,$(findstring msp430f2,$(MCU))) CONTIKI_CPU_FAM_DIR = f2xxx f1xxx endif endif ifndef CONTIKI_CPU_FAM_DIR ${error Unhandled MSP430 family: "$(MCU)"} endif CONTIKI_CPU_DIRS = $(CONTIKI_CPU_FAM_DIR) . dev MSP430 = msp430.c flash.c clock.c leds.c leds-arch.c \ watchdog.c lpm.c mtarch.c rtimer-arch.c UIPDRIVERS = me.c me_tabs.c slip.c crc16.c ELFLOADER = elfloader.c elfloader-msp430.c symtab.c ifeq ($(TARGET_MEMORY_MODEL),large) ELFLOADER = elfloader-msp430x.c symtab.c endif CONTIKI_TARGET_SOURCEFILES += $(MSP430) \ $(SYSAPPS) $(ELFLOADER) \ $(UIPDRIVERS) CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) ### Compiler definitions ifdef WERROR CFLAGSWERROR=-Werror endif ifdef IAR CC = icc430 LD = xlink AS = iasm430 AR = xar OBJCOPY = ielftool STRIP = strip ifndef IAR_PATH # This works with cygwin... IAR_BIN_PATH := $(shell dirname "`which $(CC)`") IAR_PATH_C := $(shell dirname "$(IAR_BIN_PATH)") IAR_PATH := $(shell cygpath -m "$(IAR_PATH_C)") endif CFLAGS += --diag_suppress=Pa050 --silent #defaults on the MSP430X core include file here (xlfn.h) ifndef CFLAGSNO CFLAGSNO = --dlib_config "$(IAR_PATH)/LIB/DLIB/dl430xlfn.h" $(CFLAGSWERROR) # CFLAGSNO = --dlib_config $(IAR_PATH)/LIB/DLIB/dl430xlfn.h -Ohz --multiplier=32 --multiplier_location=4C0 --hw_workaround=CPU40 --core=430X $(CFLAGSWERROR) --data_model large --double=32 endif LDFLAGSNO += -B -l contiki-$(TARGET).map -s __program_start # Stack and heap size in hex ifndef IAR_STACK_SIZE IAR_STACK_SIZE=300 endif # Set this to a positive number (hex) to enable malloc/free with IAR compiler ifndef IAR_DATA16_HEAP_SIZE IAR_DATA16_HEAP_SIZE=100 endif ifndef IAR_DATA20_HEAP_SIZE IAR_DATA20_HEAP_SIZE=0 endif LDFLAGSNO += -D_STACK_SIZE=$(IAR_STACK_SIZE) -D_DATA16_HEAP_SIZE=$(IAR_DATA16_HEAP_SIZE) -D_DATA20_HEAP_SIZE=$(IAR_DATA20_HEAP_SIZE) CUSTOM_RULE_C_TO_O = 1 %.o: %.c $(TRACE_CC) $(Q)$(CC) $(CFLAGS) $< -o $@ define FINALIZE_CYGWIN_DEPENDENCY sed -e 's/ \([A-Z]\):\\/ \/cygdrive\/\L\1\//' -e 's/\\/\//g' \ <$(@:.o=.P) >$(@:.o=.d); \ rm -f $(@:.o=.P) endef CUSTOM_RULE_C_TO_OBJECTDIR_O = 1 $(OBJECTDIR)/%.o: %.c | $(OBJECTDIR) $(TRACE_CC) $(Q)$(CC) $(CFLAGS) $< --dependencies=m $(@:.o=.P) -o $@ ifeq ($(HOST_OS),Windows) @$(FINALIZE_CYGWIN_DEPENDENCY) endif CUSTOM_RULE_C_TO_CO = 1 %.co: %.c $(TRACE_CC) $(Q)$(CC) $(CFLAGS) -DAUTOSTART_ENABLE $< -o $@ AROPTS = -o else GCC = 1 CC = msp430-gcc LD = msp430-gcc AS = msp430-as AR = msp430-ar NM = msp430-nm OBJCOPY = msp430-objcopy STRIP = msp430-strip BSL = msp430-bsl # From version 4.6.x, mspgcc does not support generic MCU identifiers such as # msp430x1611 in contrast to msp430f1611 ifndef CC_MCU ifndef MSPGCC_VERSION MSPGCC_VERSION := ${shell $(CC) -dumpversion} endif endif ifndef CC_MCU ifneq (,$(findstring 4.4.,$(MSPGCC_VERSION))) CC_MCU := ${subst msp430f,msp430x,$(MCU)} endif endif ifndef CC_MCU ifneq (,$(findstring 3.2.,$(MSPGCC_VERSION))) CC_MCU := ${subst msp430f,msp430x,$(MCU)} endif endif ifndef CC_MCU CC_MCU := $(MCU) endif ### Checks for compiler version to enable 20-bit support ifndef IAR ifneq (,$(findstring 4.7.,$(shell msp430-gcc -dumpversion))) ifdef CPU_HAS_MSP430X ifeq ($(TARGET_MEMORY_MODEL),large) CFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL) CFLAGS += -mcode-region=far -mdata-region=far -msr20 -mc20 -md20 LDFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL) -mcode-region=far -mdata-region=far -msr20 -mc20 -md20 else TARGET_MEMORY_MODEL = medium CFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL) CFLAGS += -ffunction-sections -fdata-sections -mcode-region=any LDFLAGS += -mmemory-model=$(TARGET_MEMORY_MODEL) -Wl,-gc-sections endif endif endif endif ifndef CFLAGSNO CFLAGSNO = -Wall -mmcu=$(CC_MCU) $(CFLAGSWERROR) endif CFLAGS += -Os -fno-strict-aliasing LDFLAGS += -mmcu=$(CC_MCU) -Wl,-Map=contiki-$(TARGET).map ### These flags can reduce the code size and RAM usage with up to 10% ifeq ($(SMALL),1) CFLAGS += -ffunction-sections # CFLAGS += -fdata-sections LDFLAGS += -Wl,--gc-sections,--undefined=_reset_vector__,--undefined=InterruptVectors,--undefined=_copy_data_init__,--undefined=_clear_bss_init__,--undefined=_end_of_init__ endif # SMALL endif # IAR CFLAGS += $(CFLAGSNO) PROJECT_OBJECTFILES += ${addprefix $(OBJECTDIR)/,$(CONTIKI_TARGET_MAIN:.c=.o)} ### Compilation rules %-stripped.o: %.c $(CC) $(CFLAGS) -c $< -o $@ $(STRIP) --strip-unneeded -g -x $@ %.cm: %.co $(LD) -i -r --unresolved-symbols=ignore-in-object-files -mmsp430x149 -o $@ $^ $(STRIP) --strip-unneeded -g -x $@ %-stripped.o: %.o $(STRIP) --strip-unneeded -g -x -o $@ $< %.o: ${CONTIKI_TARGET}/loader/%.S $(TRACE_AS) $(Q)$(AS) -o $(notdir $(<:.S=.o)) $< %.firmware: %.${TARGET} mv $< $@ ifdef IAR %.ihex: %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(LD) $(LDFLAGSNO) -Fintel-extended $(TARGET_STARTFILES) ${filter-out %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -o $@ else %.ihex: %.$(TARGET) $(OBJCOPY) $^ -O ihex $@ endif $(CONTIKI)/tools/mspsim/build.xml: @echo '----------------' @echo 'Could not find the MSPSim build file. Did you run "git submodule update --init"?' @echo '----------------' $(CONTIKI)/tools/mspsim/mspsim.jar: $(CONTIKI)/tools/mspsim/build.xml (cd $(CONTIKI)/tools/mspsim && ant jar) %.mspsim: %.${TARGET} ${CONTIKI}/tools/mspsim/mspsim.jar java -jar ${CONTIKI}/tools/mspsim/mspsim.jar -platform=${TARGET} $< mspsim-maptable: contiki-${TARGET}.map java -classpath ${CONTIKI}/tools/mspsim/mspsim.jar se.sics.mspsim.util.MapTable $< core-labels.o: core.${TARGET} ${CONTIKI}/tools/msp430-make-labels core.${TARGET} > core-labels.S $(AS) -o $@ core-labels.S # cp core-labels.o app/ core-globals.o: core.${TARGET} ${CONTIKI}/tools/msp430-make-globals core.${TARGET} > core-globals.S $(AS) -o $@ core-globals.S loader-init.o: ${CONTIKI_TARGET}/loader/loader-init.S $(AS) -o $(notdir $(<:.S=.o)) $< # cp loader-init.o build-app/ ifdef CORE .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