178 lines
5.6 KiB
Makefile
178 lines
5.6 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
|
|
|
|
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
|
|
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) )
|
|
|
|
$(SEGMENT_RULES): $(SEGMENT_RULE_FILES)
|
|
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)
|
|
$(CC) $(call c_seg,$<,$@) $(CFLAGS) -c $< -o $@ -Wp,-MMD,$(@:.rel=.d),-MQ,$@
|
|
@$(FINALIZE_SDCC_DEPENDENCY)
|
|
|
|
$(OBJECTDIR)/%.rel: %.cS
|
|
cp $< $(OBJECTDIR)/$*.c
|
|
$(CC) $(CFLAGS) -E $(OBJECTDIR)/$*.c > $(OBJECTDIR)/tmp
|
|
perl -pe "s/^#(.*)/;$$1/" $(OBJECTDIR)/tmp > $(OBJECTDIR)/$*.S
|
|
$(AS) $(ASFLAGS) -o $@ $(OBJECTDIR)/$*.S
|
|
rm -f $(OBJECTDIR)/tmp
|
|
|
|
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)
|
|
$(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 > /dev/null
|
|
@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 > /dev/null
|
|
|
|
# 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
|