############################################################################## # # # Teacup - Lean and efficient firmware for RepRap printers # # # # by Triffid Hunter, Traumflug, jakepoz, many others. # # # # This firmware is Copyright (c) ... # # 2009 - 2010 Michael Moon aka Triffid_Hunter # # 2010 - 2013 Markus "Traumflug" Hitter # # # # This program is free software; you can redistribute it and/or modify # # it under the terms of the GNU General Public License as published by # # the Free Software Foundation; either version 2 of the License, or # # (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # # # ############################################################################## ############################################################################## # # # Makefile for AVR (ATmega-based) targets. Use it with # # # # make -f Makefile-AVR # # # # or copy/link it to Makefile for convenience. # # # ############################################################################## ############################################################################## # # # Change these to suit your hardware # # # ############################################################################## # MCU ?= atmega168 # MCU ?= atmega328p MCU ?= atmega644 # MCU ?= atmega644 # MCU ?= atmega1284p # MCU ?= atmega1280 # MCU ?= atmega2560 # MCU ?= at90usb1286 # MCU ?= atmega32u4 # CPU clock rate # F_CPU ?= 8000000L F_CPU ?= 16000000L # F_CPU ?= 20000000L ############################################################################## # # # Where to find your compiler and linker. Later, this is completed like # # CC = $(TOOLCHAIN)gcc # # # ############################################################################## TOOLCHAIN = avr- # TOOLCHAIN = /usr/bin/avr- # TOOLCHAIN = /hardware/tools/avr/bin/avr- ############################################################################## # # # Programmer settings for "make program" # # # ############################################################################## # avrdude, typical for AVR-based architectures. # # Flags: # -c Typically stk500 or stk500v2. # -b Upload baud rate. Depends on the bootloader in # use. Not used for USB programmers. # -p See MCU above. # -P Serial port the electronics is connected to. # -C Optional, default is /etc/avrdude.conf. UPLOADER ?= avrdude # UPLOADER = /hardware/tools/avrdude ifndef UPLOADER_FLAGS UPLOADER_FLAGS = -c stk500v2 # UPLOADER_FLAGS += -b 19200 # UPLOADER_FLAGS += -b 57600 UPLOADER_FLAGS += -b 115200 UPLOADER_FLAGS += -p $(MCU) # UPLOADER_FLAGS += -P COM1 # UPLOADER_FLAGS += -P /dev/ttyACM0 UPLOADER_FLAGS += -P /dev/ttyUSB0 # UPLOADER_FLAGS += -C /hardware/tools/avrdude.conf endif ############################################################################## # # # Below here, defaults should be ok. # # # ############################################################################## PROGRAM = teacup # The thing we build by default, and also the thing we clean. TARGET = $(PROGRAM).hex # Arduino IDE takes the "compile everything available"-approach, so we have # to keep this working and can take a shortcut: SOURCES = $(wildcard *.c) CFLAGS += -DF_CPU=$(F_CPU) CFLAGS += -DMCU_STR=\"$(MCU)\" CFLAGS += -mmcu=$(MCU) CFLAGS += -g CFLAGS += -Wall CFLAGS += -Wstrict-prototypes CFLAGS += -std=gnu99 CFLAGS += -funsigned-char CFLAGS += -funsigned-bitfields CFLAGS += -fpack-struct CFLAGS += -fshort-enums CFLAGS += -Winline CFLAGS += -fno-move-loop-invariants CFLAGS += -fno-tree-scev-cprop CFLAGS += -Os CFLAGS += -ffunction-sections CFLAGS += -finline-functions-called-once CFLAGS += -mcall-prologues CFLAGS += -Wa,-adhlns=$(@:.o=.al) LDFLAGS = -Wl,--as-needed ifneq ($(realpath ../simulavr/src/simulavr_info.h),) # Neccessary for simulavr support, doesn't hurt others. CFLAGS += -DSIMINFO LDFLAGS += -Wl,--section-start=.siminfo=0x900000 else # Doesn't work for simulavr, can't allow dead code removal. LDFLAGS += -Wl,--gc-sections endif LIBS = -lm -include Makefile-common # Architecture specific targets .PHONY: program size all: $(PROGRAM).hex $(BUILDDIR)/$(PROGRAM).lst $(BUILDDIR)/$(PROGRAM).sym size program: $(PROGRAM).hex config.h $(UPLOADER) $(UPLOADER_FLAGS) -U flash:w:$(PROGRAM).hex ## Interpret TARGET section sizes wrt different AVR chips ## Usage: $(call show_size,section-name,section-regex,Atmega168-size-in-k,Atmega328p-size-in-k,Atmega644p-size-in-k,Atmega1280-size-in-k) define show_size @$(OBJDUMP) -h $^ | \ perl -MPOSIX -ne \ '/.($2)\s+([0-9a-f]+)/ && do { $$a += eval "0x$$2" }; \ END { printf " %-7s: %5d bytes %3d%% %3d%% %3d%% %3d%%\n", "$1", $$a, \ ceil($$a * 100 / ($3 * 1024)), \ ceil($$a * 100 / ($4 * 1024)), \ ceil($$a * 100 / ($5 * 1024)), \ ceil($$a * 100 / ($6 * 1024)) \ }' endef size: $(BUILDDIR)/$(PROGRAM).elf @echo " SIZES ATmega... '168 '328(P) '644(P) '1280" $(call show_size,FLASH,text,14,30,62,126) $(call show_size,RAM,data|bss,1,2,4,8) $(call show_size,EEPROM,eeprom,1,2,2,4)