206 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
| include OBJECTS
 | |
| 
 | |
| #==== Main Options =============================================================
 | |
| 
 | |
| MCU = atmega328p
 | |
| F_CPU = 16000000
 | |
| LFUSE = 0xf1
 | |
| HFUSE = 0xdf
 | |
| 
 | |
| 
 | |
| OBJDIR = build/avr
 | |
| BACKUPDIR = backup
 | |
| 
 | |
| 
 | |
| 
 | |
| #==== Compile Options ==========================================================
 | |
| 
 | |
| OPT = s
 | |
| 
 | |
| CPU = -mmcu=$(MCU) -I.
 | |
| CPU += -DF_CPU=$(F_CPU)UL
 | |
| CPU += -O$(OPT)
 | |
| #CFLAGS += -mint8
 | |
| #CFLAGS += -mshort-calls
 | |
| CFLAGS += -funsigned-char
 | |
| CFLAGS += -funsigned-bitfields
 | |
| CFLAGS += -fpack-struct
 | |
| CFLAGS += -fshort-enums
 | |
| #CFLAGS += -fno-unit-at-a-time
 | |
| CFLAGS += -Wall
 | |
| CFLAGS += -Wstrict-prototypes
 | |
| CFLAGS += -Wundef
 | |
| #CFLAGS += -Wunreachable-code
 | |
| #CFLAGS += -Wsign-compare
 | |
| #CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
 | |
| #CFLAGS += -flto
 | |
| 
 | |
| CFLAGS += -std=gnu99
 | |
| CXXFLAGS += -std=c++11
 | |
| 
 | |
| 
 | |
| CFLAGS += -I$(INCDIR) -DAVR -Ideps/ssd1306/src/
 | |
| CXXFLAGS += -I$(INCDIR) -DAVR -Ideps/ssd1306/src/
 | |
| 
 | |
| LDFLAGS = -Llib -lssd1306
 | |
| 
 | |
| 
 | |
| 
 | |
| #==== Programming Options (avrdude) ============================================
 | |
| 
 | |
| AVRDUDE_PROGRAMMER = arduino
 | |
| AVRDUDE_PORT = /dev/arduinoACM
 | |
| AVRDUDE_BAUD = 115200
 | |
| 
 | |
| #AVRDUDE_NO_VERIFY = -V
 | |
| 
 | |
| AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -b $(AVRDUDE_BAUD) -c $(AVRDUDE_PROGRAMMER) $(AVRDUDE_NO_VERIFY)
 | |
| 
 | |
| 
 | |
| 
 | |
| #==== Targets ==================================================================
 | |
| 
 | |
| CC = avr-gcc
 | |
| CXX = avr-g++
 | |
| OBJCOPY = avr-objcopy
 | |
| OBJDUMP = avr-objdump
 | |
| AVRDUDE = avrdude
 | |
| AVRSIZE = avr-size
 | |
| REMOVE = rm -f
 | |
| REMOVEDIR = rm -rf
 | |
| TAIL = tail
 | |
| AWK = awk
 | |
| 
 | |
| 
 | |
| SRC_PATH = $(SRC:%=$(SRCDIR)/%)
 | |
| 
 | |
| OBJ = $(SRC_PATH:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
 | |
| 
 | |
| 
 | |
| AVRDUDE_WRITE_FLASH = -U flash:w:$(OBJDIR)/$(TARGET).hex
 | |
| AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(OBJDIR)/$(TARGET).eep
 | |
| 
 | |
| MEMORYTYPES = flash eeprom fuse lfuse hfuse efuse boot calibration lock signature application apptable prodsig usersig
 | |
| 
 | |
| 
 | |
| avr: build
 | |
| 
 | |
| all: build
 | |
| 
 | |
| 
 | |
| help:
 | |
| 	@echo 'Basic targets:'
 | |
| 	@echo '  build       Create all files.'
 | |
| 	@echo '  clean       Remove files created by make.'
 | |
| 	@echo '  size        Show the size of each section in the .elf file.'
 | |
| 	@echo
 | |
| 	@echo 'Create files:'
 | |
| 	@echo '  elf         Create binary .elf file.'
 | |
| 	@echo '  hex         Create .hex file containing .text and .data sections.'
 | |
| 	@echo '  eep         Create .eep file with the EEPROM content.'
 | |
| 	@echo '  lss         Create .lss file with a listing of the program.'
 | |
| 	@echo
 | |
| 	@echo 'Flashing:'
 | |
| 	@echo '  program     Write flash and EEPROM.'
 | |
| 	@echo '  flash       Write only flash.'
 | |
| 	@echo '  eeprom      Write only EEPROM.'
 | |
| 	@echo '  backup      Backup MCU content to "$(BACKUPDIR)". Available memory types:'
 | |
| 	@echo '              $(MEMORYTYPES)'
 | |
| 	@echo
 | |
| 	@echo 'Fuses:'
 | |
| 	@echo '  readfuses   Read fuses from MCU.'
 | |
| 	@echo '  writefuses  Write fuses to MCU using .fuse section.'
 | |
| 	@echo '  printfuses  Print fuses from .fuse section.'
 | |
| 
 | |
| 
 | |
| build: elf hex eep lss size
 | |
| 
 | |
| 
 | |
| elf: $(OBJDIR)/$(TARGET).elf
 | |
| hex: $(OBJDIR)/$(TARGET).hex
 | |
| eep: $(OBJDIR)/$(TARGET).eep
 | |
| lss: $(OBJDIR)/$(TARGET).lss
 | |
| size: $(OBJDIR)/$(TARGET).size
 | |
| 
 | |
| 
 | |
| program: flash eeprom
 | |
| 
 | |
| 
 | |
| flash: $(OBJDIR)/$(TARGET).hex
 | |
| 	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH)
 | |
| 
 | |
| 
 | |
| eeprom: $(OBJDIR)/$(TARGET).eep
 | |
| 	$(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_EEPROM)
 | |
| 
 | |
| 
 | |
| readfuses:
 | |
| 	$(AVRDUDE) $(AVRDUDE_FLAGS) -U lfuse:r:-:i -U hfuse:r:-:i
 | |
| 
 | |
| 
 | |
| writefuses:
 | |
| 	$(AVRDUDE) $(AVRDUDE_FLAGS) -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m
 | |
| 
 | |
| 
 | |
| #writefuses: FUSES = $(shell $(OBJDUMP) -s --section=.fuse $(TARGET).elf | tail -1 | awk '{print substr($$2,1,2),substr($$2,3,2),substr($$2,5,2)}')
 | |
| #writefuses: $(TARGET).elf
 | |
| #	$(AVRDUDE) $(AVRDUDE_FLAGS) \
 | |
| #	$(if $(word 1,$(FUSES)),-U lfuse:w:0x$(word 1,$(FUSES)):m) \
 | |
| #	$(if $(word 2,$(FUSES)),-U hfuse:w:0x$(word 2,$(FUSES)):m) \
 | |
| #	$(if $(word 3,$(FUSES)),-U efuse:w:0x$(word 3,$(FUSES)):m)
 | |
| 
 | |
| 
 | |
| printfuses: FUSES = $(shell $(OBJDUMP) -s --section=.fuse $(TARGET).elf | tail -1 | awk '{print substr($$2,1,2),substr($$2,3,2),substr($$2,5,2)}')
 | |
| printfuses: $(TARGET).elf
 | |
| 	@echo 'FUSES = $(FUSES)'
 | |
| 
 | |
| 
 | |
| $(OBJDIR)/%.hex: $(OBJDIR)/%.elf
 | |
| 	@$(OBJCOPY) -O ihex -j .text -j .data $< $@
 | |
| 
 | |
| 
 | |
| $(OBJDIR)/%.eep: $(OBJDIR)/%.elf
 | |
| 	@$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 -O ihex $< $@
 | |
| 
 | |
| 
 | |
| $(OBJDIR)/%.lss: $(OBJDIR)/%.elf
 | |
| 	@$(OBJDUMP) -h -S $< > $@
 | |
| 
 | |
| 
 | |
| .SECONDARY: $(TARGET).elf
 | |
| .PRECIOUS: $(OBJ)
 | |
| $(OBJDIR)/%.elf: $(OBJ) | $(OBJDIR)
 | |
| 	@echo link $^
 | |
| 	@$(CXX) $(CPU) $^ -o $@ $(LDFLAGS) #-lstdc++
 | |
| 
 | |
| 
 | |
| $(OBJDIR)/%.o: $(SRCDIR)/%.c | $(OBJDIR)
 | |
| 	@echo compile $<
 | |
| 	@mkdir -p $(dir $@)
 | |
| 	@$(CC) -c $(CPU) $(CFLAGS) $< -o $@
 | |
| 
 | |
| $(OBJDIR)/%.o: $(SRCDIR)/%.cpp | $(OBJDIR)
 | |
| 	@echo compile $<
 | |
| 	@mkdir -p $(dir $@)
 | |
| 	@$(CXX) -c $(CPU) $(CXXFLAGS) $< -o $@
 | |
| 
 | |
| 
 | |
| $(OBJDIR)/%.size: $(OBJDIR)/%.elf
 | |
| 	@$(AVRSIZE) -A $< | tee $@
 | |
| 
 | |
| $(OBJDIR):
 | |
| 	mkdir -p $(OBJDIR)
 | |
| 
 | |
| clean:
 | |
| 	@$(REMOVEDIR) "$(OBJDIR)"
 | |
| 	@echo clean $(OBJDIR)
 | |
| 
 | |
| 
 | |
| backup:
 | |
| 	@$(shell mkdir -p $(BACKUPDIR) 2>/dev/null)
 | |
| 	@for memory in $(MEMORYTYPES); do \
 | |
| 	    $(AVRDUDE) $(AVRDUDE_FLAGS) -U $$memory:r:$(BACKUPDIR)/$(MCU).$$memory.hex:i; \
 | |
| 	done
 | |
| 
 | |
| 
 | |
| .PHONY: all build elf hex eep lss clean program flash eeprom readfuses writefuses printfuses backup help
 |