# $Id: Makefile.avr,v 1.27 2010/12/22 21:13:09 dak664 Exp $ .SUFFIXES: ### Optimization setting. $make OPTI=0 for easier debugging of changed source file(s) ifndef OPTI OPTI=s endif ### Define the CPU directory of the AVR port CONTIKI_CPU=$(CONTIKI)/cpu/avr ### These directories will be searched for the specified source files ### TARGETLIBS are platform-specific routines in the contiki library path CONTIKI_CPU_DIRS = . dev AVR = clock.c mtarch.c eeprom.c flash.c rs232.c leds-arch.c \ watchdog.c rtimer-arch.c bootloader.c ELFLOADER = elfloader.c elfloader-avr.c symtab-avr.c TARGETLIBS = random.c leds.c ifdef USB ### Add the directories for the USB stick and remove the default rs232 driver CONTIKI_CPU_DIRS += dev/usb dev/usb/serial dev/usb/rndis dev/usb/storage CONTIKI_TARGET_SOURCEFILES += $(USB) //AVR = clock.c mtarch.c eeprom.c flash.c leds-arch.c watchdog.c rtimer-arch.c endif #For a coffee file system, the application makefile can define COFFEE_FILES=n #to select the type and COFFEE_ADDRESS=0xaaaaaaaa as the starting byte address. #If only one is define the other will use the (Raven webserver 1284p) defaults #of a static file system in program flash starting at 0x10000 (word address=0x8000) #For program flash the starting address is rounded down to a page boundary in cfs-coffee-arch.h #It should be rounded down here too if someone can figure out how :) ifdef COFFEE_ADDRESS #if address is passed force definition of COFFEE_FILES ifndef COFFEE_FILES #use program flash for static file system if not specified COFFEE_FILES=3 endif endif ifdef COFFEE_FILES #if files are defined force definition of COFFEE_ADDRESS ifndef COFFEE_ADDRESS ifeq ($(COFFEE_FILES), 1) #1=eeprom static COFFEE_ADDRESS=DEFAULT else ifeq ($(COFFEE_FILES), 2) #2=eeprom dynamic COFFEE_ADDRESS=DEFAULT else ifeq ($(COFFEE_FILES), 3) #3=program flash static COFFEE_ADDRESS=0x14000 else ifeq ($(COFFEE_FILES), 4) #4=program flash dynamic COFFEE_ADDRESS=0x10000 else print "Unsupported coffee file type!" endif endif COFFEE_ADDRESS1 = $(shell echo $$(( $(COFFEE_ADDRESS) + 1 ))) CONTIKI_TARGET_SOURCEFILES += cfs-coffee.c cfs-coffee-arch.c CFLAGS += -DCOFFEE_FILES=$(COFFEE_FILES) -DCOFFEE_ADDRESS=$(COFFEE_ADDRESS) ifneq ($(COFFEE_ADDRESS), DEFAULT) LDFLAGS+= -Wl,--section-start=.coffeefiles=$(COFFEE_ADDRESS) endif #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 .coffeesection 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)/contiki-raven-main.o : coffee #Raven Webserver uses COFFEE_FILES $(OBJECTDIR)/httpd-fs.o : coffee #this file contains httpd-fsdata.c which has the .coffeesection data $(OBJECTDIR)/httpd.c.o : coffee #uses defines to read from file system $(OBJECTDIR)/httpd-cgi.o : coffee #uses defines to read from file system $(OBJECTDIR)/cfs-coffee.o : coffee #core routine requires recompilation #endif #endif endif CONTIKI_TARGET_SOURCEFILES += $(AVR) $(SENSORS) \ $(SYSAPPS) $(ELFLOADER) \ $(TARGETLIBS) CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES) ### Compiler definitions CC = avr-gcc CXX = avr-g++ LD = avr-gcc AS = avr-as AR = avr-ar ELF_SIZE = avr-size -C --mcu=$(MCU) OBJCOPY = avr-objcopy STRIP = avr-strip CFLAGSNO = -Wall -mmcu=$(MCU) -gdwarf-2 -fno-strict-aliasing \ -I$(CONTIKI)/platform/$(TARGET) \ -I. -I$(CONTIKI)/core -I$(CONTIKI_CPU) $(USB_INCLUDES) \ $(CONTIKI_PLAT_DEFS) CFLAGS += $(CFLAGSNO) -O$(OPTI) ASFLAGS += -mmcu=$(MCU) ifndef BOOTLOADER_START BOOTLOADER_START = 0x1F800 endif LDFLAGS += -mmcu=$(MCU) -Wl,-Map=contiki-$(TARGET).map \ -Wl,--section-start=.bootloader=$(BOOTLOADER_START) SMALL ?= 1 ### These flags help significantly reduce the code size ifeq ($(SMALL),1) CFLAGS += -ffunction-sections CFLAGS += -fdata-sections LDFLAGS += -Wl,--gc-sections endif # SMALL ### Setup directory search path for source files CONTIKI_TARGET_DIRS_CONCAT = ${addprefix $(CONTIKI)/platform/$(TARGET)/, \ $(CONTIKI_TARGET_DIRS)} ### Compilation rules $(OBJECTDIR)/%.o: %.c | $(OBJECTDIR) $(CC) $(CFLAGS) -c $< -o $@ %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ $(OBJECTDIR)/%.o: %.cpp | $(OBJECTDIR) $(CXX) $(CFLAGS) -c $< -o $@ %.o: %.cpp $(CXX) $(CFLAGS) -c $< -o $@ %.ko: %.o $(STRIP) -K _init -K _fini --strip-unneeded -g -x $< -o $@ %.elf: %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a symbols.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(filter-out %.a,$^) $(filter %.a,$^) $(LDLIBS) #Allow top-level makefile to always show size even when build is up to date ifndef NOAVRSIZE avr-size -C --mcu=$(MCU) $@ endif %.hex: %.out $(OBJCOPY) $^ -j .text -j .data -O ihex $@ %.ihex: %.out $(OBJCOPY) $^ -O ihex $@ # Add a namelist to the kernel %.out: %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a cp ${CONTIKI}/tools/empty-symbols.c symbols.c cp ${CONTIKI}/tools/empty-symbols.h symbols.h $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LIBC) symbols.c ifdef SYMBOLS $(CONTIKI)/tools/avr-make-symbols $@ $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LIBC) symbols.c $(CONTIKI)/tools/avr-make-symbols $@ $(CC) $(LDFLAGS) $(CFLAGS) -o $@ $^ $(LIBC) symbols.c endif #%.hex: %.elf # $(OBJCOPY) -R .eeprom -R .fuse -R .signature $^ -O ihex $@ %.eep: %.out -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma .eeprom=0 -O ihex $^ $@ %-stripped.o: %.c $(CC) $(CFLAGS) -c $< -o $@ $(STRIP) --strip-unneeded -g -x $@ #%.ce: %.c # $(CC) $(CFLAGS) -c $< -o $@ # $(STRIP) --strip-unneeded -g -x $@ #%.ce: %.co # $(LD) -i -r --unresolved-symbols=ignore-in-object-files -mavr5 -o $@ $^ # $(STRIP) --strip-unneeded -g -x $@ %.co: %.c cp $(CONTIKI)/tools/empty-symbols.c symbols.c cp $(CONTIKI)/tools/empty-symbols.h symbols.h $(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@ %-stripped.o: %.o $(STRIP) --strip-unneeded -g -x -o $@ $< %.o: ${CONTIKI_TARGET}/loader/%.S $(AS) -o $(notdir $(<:.S=.o)) $< %.srec: %.$(TARGET) $(OBJCOPY) -O srec $< $@ ### Upload image #Let avrdude use defaults if port or programmer not defined AVRDUDE ?= avrdude ifdef AVRDUDE_PORT AVRDUDE_PORT:=-P $(AVRDUDE_PORT) endif ifdef AVRDUDE_PROGRAMMER AVRDUDE_PROGRAMMER:=-c $(AVRDUDE_PROGRAMMER) endif ifdef AVRDUDE_MCU AVRDUDE_MCU:=-p $(AVRDUDE_MCU) else AVRDUDE_MCU:=-p $(MCU) endif %.u: %.hex $(AVRDUDE) $(AVRDUDE_MCU) $(AVRDUDE_OPTIONS) $(AVRDUDE_PORT) $(AVRDUDE_PROGRAMMER) -U flash:w:$< %.eu: %.eep $(AVRDUDE) $(AVRDUDE_MCU) ${AVRDUDE_OPTIONS} ${AVRDUDE_PORT} ${AVRDUDE_PROGRAMMER} -U eeprom:w:$< symbols.c: cp ${CONTIKI}/tools/empty-symbols.c symbols.c cp ${CONTIKI}/tools/empty-symbols.h symbols.h