-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathcommon.mk
More file actions
142 lines (106 loc) · 4.15 KB
/
Copy pathcommon.mk
File metadata and controls
142 lines (106 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
MCU=atmega328p
F_CPU=16000000UL
CC=avr-gcc
CXX=avr-g++
OBJCOPY=avr-objcopy
OBJDUMP=avr-objdump
AVRSIZE=avr-size
AVRDUDE=avrdude
FUSE_PROGRAMMER_TYPE=usbasp
PROGRAMMER_TYPE=arduino
BAUD=57600
PBAUD=115200
PROGRAMMER_PORT=$(compgen -W "/dev/ttyUSB*" )
PROGRAMMER_ARGS=-P$(PROGRAMMER_PORT) -b$(PBAUD)
FUSE_PROGRAMMER_ARGS=
BOOTLOADER=../../tools/optiboot_atmega328.hex
LFUSE = 0xFF
HFUSE = 0xDE
EFUSE = 0x05
AVRLIB=../../../AvrLib
INCLUDES=-I$(AVRLIB)/inc -Iinc
SOURCEDIR=src/avr
BUILDDIR=target/$(MCU)
MKEEPROM=target/mkeeprom
EEPROM=example
EEPROM_FILE=$(BUILDDIR)/$(addsuffix .eeprom_hex, $(EEPROM))
#TARGET=$(BUILDDIR)/hello
TARGET=$(BUILDDIR)/$(lastword $(subst /, ,$(CURDIR)))
SOURCES=$(wildcard $(SOURCEDIR)/*.cpp)
OBJECTS=$(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES))
EEPROM_SOURCEDIR=src/eeprom
EEPROMS=$(wildcard $(EEPROM_SOURCEDIR)/*.eeprom)
EEPROM_BINS=$(patsubst $(EEPROM_SOURCEDIR)/%.eeprom,$(BUILDDIR)/%.eeprom_bin,$(EEPROMS))
## Compilation options, type man avr-gcc if you're curious.
CPPFLAGS = -DF_CPU=$(F_CPU) -std=gnu++14 -fno-use-cxa-atexit
CFLAGS = -Os -g -Wall
## Use short (8-bit) data types
CFLAGS += -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums
## Splits up object files per function
CFLAGS += -ffunction-sections -fdata-sections
LDFLAGS = -Wl,-Map,$(TARGET).map
## Optional, but often ends up with smaller code
LDFLAGS += -Wl,--gc-sections
## Relax shrinks code even more, but makes disassembly messy
## LDFLAGS += -Wl,--relax
## LDFLAGS += -Wl,-u,vfprintf -lprintf_flt -lm ## for floating-point printf
## LDFLAGS += -Wl,-u,vfprintf -lprintf_min ## for smaller printf
#LDLIBS=
LDLIBS = -L$(AVRLIB)/target/$(MCU) -lAvrLib
TARGET_ARCH = -mmcu=$(MCU)
FUSE_STRING = -U lfuse:w:$(LFUSE):m -U hfuse:w:$(HFUSE):m -U efuse:w:$(EFUSE):m
all: directories $(TARGET).hex size
## To make .o files from .cpp files
$(OBJECTS): $(BUILDDIR)/%.o: $(SOURCEDIR)/%.cpp Makefile
$(CXX) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) $(INCLUDES) -MMD -c $< -o $@
$(TARGET).elf: $(OBJECTS)
$(MAKE) -C $(AVRLIB)
$(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LDLIBS) -o $@
%.hex: %.elf
$(OBJCOPY) -j .text -j .data -O ihex $< $@
$(MKEEPROM): src/eeprom/mkeeprom.cpp inc/eeprom.hpp Makefile
g++ -std=c++11 -I inc/ src/eeprom/mkeeprom.cpp -o $@
$(EEPROM_BINS): $(BUILDDIR)/%.eeprom_bin: $(EEPROM_SOURCEDIR)/%.eeprom $(MKEEPROM)
$(MKEEPROM) $(shell cat $< ) > $@
%.eeprom_hex: %.eeprom_bin
avr-objcopy -I binary -O ihex $< $@
%.lst: %.elf
$(OBJDUMP) -S $< > $@
## These targets don't have files named after them
.PHONY: all directories disassemble disasm eeprom size flash fuses serial
directories: $(BUILDDIR)
$(BUILDDIR):
mkdir -p $(BUILDDIR)
disassemble: $(TARGET).lst
less $(TARGET).lst
size: $(TARGET).elf
$(AVRSIZE) -C --mcu=$(MCU) $(TARGET).elf
flash: $(TARGET).hex size
$(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U flash:w:$<
eeprom: $(EEPROM_FILE)
$(AVRDUDE) -c $(FUSE_PROGRAMMER_TYPE) -p $(MCU) $(FUSE_PROGRAMMER_ARGS) -U eeprom:w:$<
#need to find the old bootloader that supports eeprom first
#upload: $(TARGET).hex $(EEPROM_FILE) size
# $(AVRDUDE) -c $(PROGRAMMER_TYPE) -p $(MCU) $(PROGRAMMER_ARGS) -U eeprom:w:$(EEPROM_FILE) -U flash:w:$(TARGET).hex
fuses:
$(AVRDUDE) -c $(FUSE_PROGRAMMER_TYPE) -p $(MCU) $(FUSE_PROGRAMMER_ARGS) $(FUSE_STRING)
show_fuses:
$(AVRDUDE) -c $(FUSE_PROGRAMMER_TYPE) -p $(MCU) $(FUSE_PROGRAMMER_ARGS) -nv
serial:
stty -F /dev/ttyUSB0 $(BAUD) raw -clocal -echo
cat /dev/ttyUSB0 | awk '{ print strftime("%c: "), $$0; fflush(); }' | tee target/serial.log
## Set the EESAVE fuse byte to preserve EEPROM across flashes
set_eeprom_save_fuse: HFUSE = 0xD6
set_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m
set_eeprom_save_fuse: fuses
## Clear the EESAVE fuse byte
clear_eeprom_save_fuse: FUSE_STRING = -U hfuse:w:$(HFUSE):m
clear_eeprom_save_fuse: fuses
-include $(BUILDDIR)/*.d
rtags:
$(MAKE) -nk $(OBJECTS) | rc -c -
bootloader:
$(AVRDUDE) -c $(FUSE_PROGRAMMER_TYPE) -p $(MCU) $(FUSE_PROGRAMMER_ARGS) -B 46.88 \
-e -Ulock:w:0x3F:m -Uefuse:w:0xFD:m -Uhfuse:w:0xDE:m -Ulfuse:w:0xFF:m
$(AVRDUDE) -c $(FUSE_PROGRAMMER_TYPE) -p $(MCU) $(FUSE_PROGRAMMER_ARGS) \
-Uflash:w:$(BOOTLOADER):i -Ulock:w:0x0F:m