contiki/cpu/avr/Makefile.avr

216 lines
7.2 KiB
Makefile
Raw Normal View History

# $Id: Makefile.avr,v 1.27 2010/12/22 21:13:09 dak664 Exp $
2006-06-18 07:44:59 +00:00
.SUFFIXES:
2009-07-23 16:13:48 +00:00
### Optimization setting. $make OPTI=0 for easier debugging of changed source file(s)
ifndef OPTI
OPTI=s
endif
2009-07-23 16:13:48 +00:00
### Define the CPU directory of the AVR port
2006-06-18 07:44:59 +00:00
CONTIKI_CPU=$(CONTIKI)/cpu/avr
2009-07-23 16:13:48 +00:00
### These directories will be searched for the specified source files
### TARGETLIBS are platform-specific routines in the contiki library path
CONTIKI_CPU_DIRS = . dev
core/lib/settings: Generalized Settings Manager to work on any platform This commit moves the Settings Manager from the AVR codebase into the Contiki core library. Any platform that implements the Contiki EEPROM API can now use the Settings Manager's key-value store for storing their persistent configuration info. The Settings Manager is a EEPROM-based key-value store. Keys are 16-bit integers and values may be up to 16,383 bytes long. It is intended to be used to store configuration-related information, like network settings, radio channels, etc. * Robust data format which requires no initialization. * Supports multiple values with the same key. * Data can be appended without erasing EEPROM. * Max size of settings data can be easily increased in the future, as long as it doesn't overlap with application data. The format was inspired by the [OLPC manufacturing data format][]. Since the beginning of EEPROM often contains application-specific information, the best place to store settings is at the end of EEPROM (the "top"). Because we are starting at the end of EEPROM, it makes sense to grow the list of key-value pairs downward, toward the start of EEPROM. Each key-value pair is stored in memory in the following format: Order | Size | Name | Description --------:|---------:|--------------|------------------------------- 0 | 2 | `key` | 16-bit key -2 | 1 | `size_check` | One's-complement of next byte -3 | 1 or 2 | `size` | The size of `value`, in bytes -4 or -5 | variable | `value` | Value associated with `key` The end of the key-value pairs is denoted by the first invalid entry. An invalid entry has any of the following attributes: * The `size_check` byte doesn't match the one's compliment of the `size` byte (or `size_low` byte). * The key has a value of 0x0000. [OLPC manufacturing data format]: http://wiki.laptop.org/go/Manufacturing_data
2012-05-17 16:03:52 +00:00
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
2009-07-23 16:13:48 +00:00
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
2009-07-23 16:13:48 +00:00
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
2009-07-23 16:13:48 +00:00
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
2006-06-18 07:44:59 +00:00
2009-07-23 16:13:48 +00:00
CONTIKI_TARGET_SOURCEFILES += $(AVR) $(SENSORS) \
2006-06-18 07:44:59 +00:00
$(SYSAPPS) $(ELFLOADER) \
$(TARGETLIBS)
2006-06-18 07:44:59 +00:00
CONTIKI_SOURCEFILES += $(CONTIKI_TARGET_SOURCEFILES)
### Compiler definitions
CC = avr-gcc
LD = avr-gcc
2006-06-18 07:44:59 +00:00
AS = avr-as
AR = avr-ar
2011-08-31 15:50:14 +00:00
ELF_SIZE = avr-size -C --mcu=$(MCU)
2006-06-18 07:44:59 +00:00
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)
2009-07-23 16:13:48 +00:00
ifndef BOOTLOADER_START
BOOTLOADER_START = 0x1F800
2009-07-23 16:13:48 +00:00
endif
2009-07-23 16:13:48 +00:00
LDFLAGS += -mmcu=$(MCU) -Wl,-Map=contiki-$(TARGET).map \
-Wl,--section-start=.bootloader=$(BOOTLOADER_START)
2006-06-18 07:44:59 +00:00
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
2006-06-18 07:44:59 +00:00
### Setup directory search path for source files
CONTIKI_TARGET_DIRS_CONCAT = ${addprefix $(CONTIKI)/platform/$(TARGET)/, \
$(CONTIKI_TARGET_DIRS)}
### Compilation rules
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
2006-06-18 07:44:59 +00:00
$(CC) $(CFLAGS) -c $< -o $@
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
%.ko: %.o
$(STRIP) -K _init -K _fini --strip-unneeded -g -x $< -o $@
%.elf: %.co $(PROJECT_OBJECTFILES) contiki-$(TARGET).a symbols.o
2006-06-18 07:44:59 +00:00
$(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
2010-11-12 17:15:00 +00:00
avr-size -C --mcu=$(MCU) $@
endif
%.hex: %.out
$(OBJCOPY) $^ -j .text -j .data -O ihex $@
2006-06-18 07:44:59 +00:00
%.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 $^ $@
2006-06-18 07:44:59 +00:00
%-stripped.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
$(STRIP) --strip-unneeded -g -x $@
#%.ce: %.c
# $(CC) $(CFLAGS) -c $< -o $@
# $(STRIP) --strip-unneeded -g -x $@
2006-06-18 07:44:59 +00:00
#%.ce: %.co
# $(LD) -i -r --unresolved-symbols=ignore-in-object-files -mavr5 -o $@ $^
# $(STRIP) --strip-unneeded -g -x $@
2006-06-18 07:44:59 +00:00
%.co: %.c
cp $(CONTIKI)/tools/empty-symbols.c symbols.c
cp $(CONTIKI)/tools/empty-symbols.h symbols.h
$(CC) $(CFLAGS) -DAUTOSTART_ENABLE -c $< -o $@
2006-06-18 07:44:59 +00:00
%-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:$<
2006-06-18 07:44:59 +00:00
symbols.c:
cp ${CONTIKI}/tools/empty-symbols.c symbols.c
cp ${CONTIKI}/tools/empty-symbols.h symbols.h