CC = arm-none-eabi-gcc CPP = arm-none-eabi-cpp LD = arm-none-eabi-gcc AR = arm-none-eabi-ar OBJCOPY = arm-none-eabi-objcopy OBJDUMP = arm-none-eabi-objdump NM = arm-none-eabi-nm SIZE = arm-none-eabi-size SREC_CAT = srec_cat ### TI CC26xxware out-of-tree ### TI_CC26XXWARE is the home directory of the cc26xxware ### It MUST be provided as a path relative to $(CONTIKI) ### For example, if ### CONTIKI = /home/user/contiki ### and TI_CC26XXWARE is stored in ### /home/user/cc26xxware ### then set ### TI_CC26XXWARE = ../cc26xxware ifndef TI_CC26XXWARE $(error TI_CC26XXWARE not defined. Please see the README) endif ### cc26xxware sources will be added to the MODULES list TI_CC26XXWARE_SRC = $(TI_CC26XXWARE)/driverlib ### The directory with startup sources will be added to the CONTIKI_CPU_DIRS ### and the sources therein are added to the sources list explicitly. They are ### also listed explicitly in the linker command (through TARGET_STARTFILES), ### to make sure they always get linked in the image TI_CC26XXWARE_STARTUP = ../../$(TI_CC26XXWARE)/startup_files TI_CC26XXWARE_STARTUP_SRCS = ccfg.c startup_gcc.c ### MODULES will add some of these to the include pach, but we need to add ### them earlier to prevent filename clashes with Contiki core files CFLAGS += -I$(CONTIKI)/$(TI_CC26XXWARE) -I$(CONTIKI)/$(TI_CC26XXWARE_SRC) CFLAGS += -I$(CONTIKI)/$(TI_CC26XXWARE)/inc MODULES += $(TI_CC26XXWARE_SRC) LDSCRIPT = $(CONTIKI_CPU)/cc26xx.ld CFLAGS += -mcpu=cortex-m3 -mthumb -mlittle-endian CFLAGS += -ffunction-sections -fdata-sections CFLAGS += -fshort-enums -fomit-frame-pointer -fno-strict-aliasing CFLAGS += -Wall -std=c99 ### Workaround for driverlib's cpu.h which tests if defined(gcc) ### Delete if it gets fixed or if we stop using the driverlib CFLAGS += -Dgcc=__GNUC__ LDFLAGS += -mcpu=cortex-m3 -mthumb -mlittle-endian -nostartfiles LDFLAGS += -T $(LDSCRIPT) LDFLAGS += -Wl,--gc-sections,--sort-section=alignment LDFLAGS += -Wl,-Map=$(@:.elf=-$(TARGET).map),--cref,--no-warn-mismatch OBJCOPY_FLAGS += -O binary --gap-fill 0xff OBJDUMP_FLAGS += --disassemble --source --disassembler-options=force-thumb ### Are we building with code size optimisations? ifeq ($(SMALL),1) CFLAGS += -Os else CFLAGS += -O2 endif ### If the user-specified a Node ID, pass a define ifdef NODEID CFLAGS += -DIEEE_ADDR_NODE_ID=$(NODEID) endif ### CPU-dependent cleanup files CLEAN += symbols.c symbols.h *.d *.elf *.hex ### CPU-dependent directories CONTIKI_CPU_DIRS = . dev dev/rfc-api $(TI_CC26XXWARE_STARTUP) ### Use the existing debug I/O in cpu/arm/common CONTIKI_CPU_DIRS += ../arm/common/dbg-io ### CPU-dependent source files CONTIKI_CPU_SOURCEFILES += clock.c rtimer-arch.c cc26xx-rtc.c uart.c CONTIKI_CPU_SOURCEFILES += cc26xx-rf.c contiki-watchdog.c CONTIKI_CPU_SOURCEFILES += putchar.c ieee-addr.c batmon-sensor.c CONTIKI_CPU_SOURCEFILES += slip-arch.c slip.c cc26xx-uart.c lpm.c CONTIKI_CPU_SOURCEFILES += gpio-interrupt.c DEBUG_IO_SOURCEFILES += dbg-printf.c dbg-snprintf.c dbg-sprintf.c strformat.c CONTIKI_SOURCEFILES += $(CONTIKI_CPU_SOURCEFILES) $(DEBUG_IO_SOURCEFILES) TARGET_START_SOURCEFILES += fault-handlers.c $(TI_CC26XXWARE_STARTUP_SRCS) TARGET_STARTFILES = $(addprefix $(OBJECTDIR)/,$(call oname, $(TARGET_START_SOURCEFILES))) ### Don't treat the .elf as intermediate .PRECIOUS: %.elf %.hex %.bin ### Always re-build ieee-addr.o in case the command line passes a new NODEID FORCE: $(OBJECTDIR)/ieee-addr.o: ieee-addr.c FORCE | $(OBJECTDIR) $(TRACE_CC) $(Q)$(CC) $(CFLAGS) -c $< -o $@ ### Compilation rules CUSTOM_RULE_LINK=1 %.elf: $(TARGET_STARTFILES) %.co $(PROJECT_OBJECTFILES) $(PROJECT_LIBRARIES) contiki-$(TARGET).a $(LDSCRIPT) $(TRACE_LD) $(Q)$(LD) $(LDFLAGS) ${filter-out $(LDSCRIPT) %.a,$^} ${filter %.a,$^} $(TARGET_LIBFILES) -lm -o $@ %.i16hex: %.elf $(OBJCOPY) -O ihex $< $@ %.hex: %.i16hex $(SREC_CAT) $< -intel -o $@ -intel %.bin: %.elf $(OBJCOPY) $(OBJCOPY_FLAGS) $< $@ %.lst: %.elf $(OBJDUMP) $(OBJDUMP_FLAGS) $< > $@ ### We don't really need the .hex and .bin for the .$(TARGET) but let's make ### sure they get built %.$(TARGET): %.elf %.hex %.bin cp $< $@ # a target that gives a user-friendly memory profile, taking into account the RAM # that is statically occupied by the stack as defined in the linker script # see $(LDSCRIPT) RAM_SIZE = 0x00003E00 FLASH_SIZE = 0x0001E000 STACK_SIZE = 0 %.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;}'