b025759665
This was used in the past because sdld was very verbose when linking banked hex files. New sdld versions do not exhibit this level of verbosity and therefore the redirect can be stopped
173 lines
5.5 KiB
Makefile
173 lines
5.5 KiB
Makefile
### Compiler definitions
|
|
CC = sdcc
|
|
LD = sdcc
|
|
AS = sdcc
|
|
AR = sdcclib
|
|
OBJCOPY = objcopy
|
|
STRIP = strip
|
|
PACKIHX = packihx
|
|
BANK_ALLOC = $(CONTIKI)/cpu/cc2430/bank-alloc.py
|
|
SEGMENT_RULES = $(OBJECTDIR)/segment.rules
|
|
|
|
CFLAGS += --model-$(MEMORY_MODEL) --stack-auto -DSDCC_CC2430 --std-c99
|
|
CFLAGS += --fomit-frame-pointer
|
|
|
|
LDFLAGS += --model-$(MEMORY_MODEL) --stack-auto -DSDCC_CC2430 --out-fmt-ihx
|
|
LDFLAGS += --xram-loc 0xE000 --xram-size 0x1F00
|
|
LDFLAGS += --code-loc $(START_ADDR) --code-size $(CODE_SIZE)
|
|
|
|
ASFLAGS += -plosgff
|
|
|
|
AROPTS = -a
|
|
|
|
### Our object files are .rel, so we can't use the default finalize dependency
|
|
### generation. Override here.
|
|
define FINALIZE_SDCC_DEPENDENCY
|
|
cp $(@:.rel=.d) $(@:.rel=.$$$$); \
|
|
sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
|
|
-e '/^$$/ d' -e 's/$$/ :/' < $(@:.rel=.$$$$) >> $(@:.rel=.d); \
|
|
rm -f $(@:.rel=.$$$$)
|
|
endef
|
|
|
|
### Banking Guesswork:
|
|
### Examples outside examples/sensinode do not specify banking.
|
|
### We automatically turn it on if its unspecified and if we are building with
|
|
### UIP_CONF_IPV6
|
|
ifndef HAVE_BANKING
|
|
ifeq ($(UIP_CONF_IPV6),1)
|
|
HAVE_BANKING=1
|
|
else
|
|
HAVE_BANKING=0
|
|
endif
|
|
endif
|
|
|
|
### Does the project want us to offset the firmware?
|
|
### define start address and max code size accordingly, turn Disco on
|
|
ifeq ($(OFFSET_FIRMWARE),1)
|
|
START_ADDR = 0x01000
|
|
HOME_START = 00001000
|
|
ifeq ($(HAVE_BANKING),1)
|
|
CODE_SIZE = 0x1F000
|
|
else
|
|
CODE_SIZE = 0x0F000
|
|
endif
|
|
else
|
|
START_ADDR = 0x00000
|
|
HOME_START = 00000000
|
|
ifeq ($(HAVE_BANKING),1)
|
|
CODE_SIZE = 0x20000
|
|
else
|
|
CODE_SIZE = 0x10000
|
|
endif
|
|
endif
|
|
|
|
### Are we building with BANKing supoprt?
|
|
ifeq ($(HAVE_BANKING),1)
|
|
## Yes
|
|
MEMORY_MODEL=huge
|
|
LDFLAGS += -Wl-bBANK1=0x018000
|
|
LD_POST_FLAGS += -Wl-bBANK2=0x028000
|
|
LD_POST_FLAGS += -Wl-bBANK3=0x038000
|
|
LDFLAGS += -Wl-r
|
|
CFLAGS += -DHAVE_SDCC_BANKING
|
|
#use this in $(call c_seg,$<) to get segment for a source file.
|
|
c_seg = --codeseg $(shell python $(BANK_ALLOC) $1 $(SEGMENT_RULES) $2)
|
|
else
|
|
## No banking
|
|
MEMORY_MODEL=large
|
|
c_seg =
|
|
endif
|
|
|
|
### CPU-dependent cleanup files
|
|
CLEAN += *.lnk *.lk *.sym *.lib *.ihx *.rel *.mem *.rst *.asm *.hex
|
|
CLEAN += *.omf *.cdb *.banks
|
|
CLEAN += symbols.c symbols.h
|
|
|
|
### CPU-dependent directories
|
|
CONTIKI_CPU_DIRS = . dev
|
|
|
|
### CPU-dependent source files
|
|
CONTIKI_SOURCEFILES += bus.c clock.c uart0.c uart1.c cc2430_rf.c dma.c
|
|
CONTIKI_SOURCEFILES += uart_intr.c cc2430_rf_intr.c dma_intr.c
|
|
CONTIKI_SOURCEFILES += watchdog-cc2430.c rtimer-arch.c stack.c
|
|
CONTIKI_ASMFILES +=
|
|
|
|
CONTIKI_ASMOBJECTFILES = $(addprefix $(OBJECTDIR)/,$(CONTIKI_ASMFILES:.S=.rel))
|
|
|
|
CONTIKI_CASMOBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(CONTIKI_CASMFILES:.cS=.rel))
|
|
|
|
CONTIKI_PLATFORM_DIRS = $(PLATFORM_APPDIRS) \
|
|
$(addprefix $(CONTIKI)/platform/$(TARGET)/, $(CONTIKI_TARGET_DIRS))
|
|
|
|
CONTIKI_CPU_DIRS_LIST = $(addprefix $(CONTIKI_CPU)/, \
|
|
$(CONTIKI_CPU_DIRS))
|
|
|
|
oname = $(patsubst %.c,%.rel,$(patsubst %.S,%.rel,$(1)))
|
|
|
|
CONTIKI_OBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(call oname, $(CONTIKI_SOURCEFILES)))
|
|
|
|
PROJECT_OBJECTFILES = $(addprefix $(OBJECTDIR)/, \
|
|
$(call oname, $(PROJECT_SOURCEFILES)))
|
|
|
|
### Compilation rules
|
|
|
|
SEGMENT_RULE_FILES = $(foreach dir, . $(CONTIKI_PLATFORM_DIRS) \
|
|
$(CONTIKI_CPU_DIRS_LIST), $(wildcard $(dir)/segment.rules) )
|
|
|
|
# NB: Assumes SEGMENT_RULES was not overridden and is in $(OBJECTDIR)
|
|
$(SEGMENT_RULES): $(SEGMENT_RULE_FILES) | $(OBJECTDIR)
|
|
cat $(SEGMENT_RULE_FILES) | \
|
|
sed -e 's/#.*$$//' -e 's/^\s*//' -e '/^$$/d' > $@
|
|
|
|
CUSTOM_RULE_LINK=1
|
|
CUSTOM_RULE_C_TO_OBJECTDIR_O=1
|
|
CUSTOM_RULE_ALLOBJS_TO_TARGETLIB=1
|
|
|
|
$(OBJECTDIR)/%.rel: %.c $(SEGMENT_RULES) | $(OBJECTDIR)
|
|
$(CC) $(call c_seg,$<,$@) $(CFLAGS) -c $< -o $@ -Wp,-MMD,$(@:.rel=.d),-MQ,$@
|
|
@$(FINALIZE_SDCC_DEPENDENCY)
|
|
|
|
contiki-$(TARGET).lib: $(CONTIKI_OBJECTFILES) $(PROJECT_OBJECTFILES) \
|
|
$(CONTIKI_ASMOBJECTFILES) $(CONTIKI_CASMOBJECTFILES)
|
|
rm -f $@
|
|
for target in $^; do echo $$target >> $@; done
|
|
|
|
.PRECIOUS: %.$(TARGET) %.hex
|
|
|
|
# build app/example local object files. We need a separate rule so that we can
|
|
# pass -DAUTOSTART_ENABLE for those files only
|
|
$(OBJECTDIR)/%.app.rel: %.c $(SEGMENT_RULES) | $(OBJECTDIR)
|
|
$(CC) $(call c_seg,$<,$@) -DAUTOSTART_ENABLE $(CFLAGS) -c $< -o $@
|
|
|
|
# .ihx is the sdcc binary output file
|
|
%.ihx: $(OBJECTDIR)/%.app.rel $(CONTIKI_TARGET_MAIN) contiki-$(TARGET).lib
|
|
# Automatic bank relocation when building banked code
|
|
ifeq ($(HAVE_BANKING),1)
|
|
@echo "\nFirst Link"
|
|
@echo "==============="
|
|
$(CC) $(LDFLAGS) -o $@ $(CONTIKI_TARGET_MAIN) $(OBJECTDIR)/$*.app.rel -llibsdcc.lib -lcontiki-$(TARGET).lib
|
|
@echo "\nBank Allocation"
|
|
@echo "==============="
|
|
python $(BANK_ALLOC) $(basename $(@F)) $(SEGMENT_RULES) $(OFFSET_FIRMWARE)
|
|
@echo "\nFinal Link"
|
|
@echo "==============="
|
|
endif
|
|
$(CC) $(LDFLAGS) $(LD_POST_FLAGS) -o $@ $(CONTIKI_TARGET_MAIN) $(OBJECTDIR)/$*.app.rel -llibsdcc.lib -lcontiki-$(TARGET).lib
|
|
|
|
# Pack the hex file for programmers which dislike SDCC output hex format
|
|
%.hex: %.ihx
|
|
@echo "\nPack hex file"
|
|
@echo "==============="
|
|
ifeq ($(HAVE_BANKING),1)
|
|
srec_cat -disable_sequence_warnings $< -intel -crop 0x10000 0x1FFFF -offset -0x10000 -o bank1.hex -intel
|
|
srec_cat -disable_sequence_warnings $< -intel -crop 0x20000 0x2FFFF -offset -0x18000 -o bank2.hex -intel
|
|
srec_cat -disable_sequence_warnings $< -intel -crop 0x30000 0x3FFFF -offset -0x20000 -o bank3.hex -intel
|
|
srec_cat -disable_sequence_warnings $< -intel -crop 0x00000 0x0FFFF -o home.ihx -intel
|
|
srec_cat home.ihx -intel bank1.hex -intel bank2.hex -intel bank3.hex -intel -o $@ -intel
|
|
rm -f home.ihx bank1.hex bank2.hex bank3.hex
|
|
else
|
|
$(PACKIHX) $< > $@
|
|
endif
|