rendered paste bodyAS = avr-as
CC = avr-gcc
CXX = avr-g++
CFLAGS = -mmcu=$(MCU) -std=c99 -pipe -Os -Wall -W -Wextra -Werror
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
CXXFLAGS = $(CFLAGS)
LDFLAGS = $(GENTOO_LD_PATH_WORKAROUND)
#LDFLAGS += -Wl,-Map=$(subst $(suffix $<),.map,$<)
#ASFLAGS = -Wa,-adhlns=$(<:.S=.lst)
ASFLAGS = -Wa,-adhlns=$(subst $(suffix $<),.lst,$<)
NM = avr-nm
OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size
MCU = atmega8
PROGRAMMER_MCU = atmega8
AVRDUDE_PROGRAMMERID = usbtiny
AVRDUDE_PORT = /dev/ttyS0
# See:
# http://bugs.gentoo.org/show_bug.cgi?id=147155
# http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=336170
GENTOO_LD_PATH_WORKAROUND = -L /usr/x86_64-pc-linux-gnu/avr/lib/ # /usr/i686-pc-linux-gnu/avr/lib
PROGNAME = ctrl
#Basic rules
.PHONY: all clean erase dump uisp-dump
all: $(PROGNAME).hex $(PROGNAME).eep $(PROGNAME).lss
clean:
rm -f $(PROGNAME).{o,s,elf,hex,eep,lss,lst,map,sym}
load:
avrduder -p $(PROGRAMMER_MCU) -c $(AVRDUDE_PROGRAMMERID) -P $(AVRDUDE_PORT) \
-U flash:w:$(PROGNAME).hex:i
# -U eeprom:w:$(PROGNAME).eep:i
# If you uncommented the previous line, remember to add a backslash at the end of the line before it.
@echo Note: EEPROM was not written.
erase:
avrduder -p $(PROGRAMMER_MCU) -c $(AVRDUDE_PROGRAMMERID) -P $(AVRDUDE_PORT) \
-e
dump:
avrduder -p $(PROGRAMMER_MCU) -c $(AVRDUDE_PROGRAMMERID) -P $(AVRDUDE_PORT) \
-U flash:r:flash.dump:i \
-U eeprom:r:eeprom.dump:i \
-U hfuse:r:hfuse.dump:b \
-U lfuse:r:lfuse.dump:b \
-U lock:r:lock.dump:b \
-U signature:r:signature.dump:h
# I like avrdude, it's so simple and powerful.
# So, I'm making no effort to make uisp work.
# But the next command makes a firmware dump using uisp.
uisp-dump:
uisp -dprog=bsd -dpart=atmega8 -dlpt=/dev/parport0 --rd_fuses --download of=uisp.dump
$(PROGNAME).s: $(PROGNAME).c
$(PROGNAME).o: $(PROGNAME).c
$(PROGNAME).elf: $(PROGNAME).o
#The variables:
# $@ - The name of the target of the rule.
# $? - The names of all the prerequisites that are newer than the target.
# $< - The name of the first prerequisite.
# $^ - The names of all the prerequisites.
#Pattern-rules
%.s: %.c
$(CC) -S $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) -o $@ $<
%.o: %.c
$(CC) -c $(CPPFLAGS) $(CFLAGS) $(ASFLAGS) -o $@ $<
%.o: %.cpp
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) $(ASFLAGS) -o $@ $<
%.o: %.h
%.elf: %.o
$(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $<
# Create final output files (.hex, .eep) from ELF output file.
# Use -O ihex for Intel Hex format
# Use -O binary for binary format
%.hex: %.elf
$(OBJCOPY) -O ihex -R .eeprom $< $@
#$(OBJCOPY) -j .text -j .data -O ihex $< $@
%.eep: %.elf
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O ihex $< $@
# Create extended listing file from ELF output file.
%.lss: %.elf
$(OBJDUMP) -h -S -C $< > $@
# Create a symbol table from ELF output file.
%.sym: %.elf
$(NM) -n $< > $@