-
Notifications
You must be signed in to change notification settings - Fork 6
/
Makefile
192 lines (159 loc) · 5.69 KB
/
Makefile
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
# Makefile to compile bootloader-attiny
#
# Copyright 2017 Matthijs Kooijman <[email protected]>
#
# Permission is hereby granted, free of charge, to anyone obtaining a
# copy of this document to do whatever they want with them without any
# restriction, including, but not limited to, copying, modification and
# redistribution.
#
# NO WARRANTY OF ANY KIND IS PROVIDED.
#
# To compile, just make sure that avr-gcc and friends are in your path
# and type "make".
PROTOCOL_VERSION = 0x0202
CPPSRC = $(wildcard *.cpp)
CPPSRC += $(ARCH)/SelfProgram.cpp $(ARCH)/uart.cpp $(ARCH)/Reset.cpp $(ARCH)/Clock.cpp
CPPSRC += $(ARCH)/$(BUS).cpp
OBJ = $(CPPSRC:.cpp=.o)
ifeq ($(ARCH),attiny)
MCU = attiny841
FLASH_WRITE_SIZE = SPM_PAGESIZE # Defined by avr-libc
FLASH_ERASE_SIZE = 64
FLASH_SIZE = 8192
# Size of the bootloader area. Must be a multiple of the erase size
BL_SIZE = 2048
FLASH_APP_OFFSET = 0
BL_OFFSET = $(shell expr $(FLASH_SIZE) - $(BL_SIZE))
else ifeq ($(ARCH),stm32)
OPENCM3_DIR = libopencm3
DEVICE = stm32g030c8t6
FLASH_WRITE_SIZE = 256
FLASH_ERASE_SIZE = 2048
FLASH_SIZE = 65536
# Size of the bootloader area. Must be a multiple of the erase size
BL_SIZE = 4096
# Bootloader is at the start of flash, so write app after it
FLASH_APP_OFFSET = $(BL_SIZE)
BL_OFFSET = 0
endif
BL_VERSION = 4
BOARD_INFO_SIZE = 64
CXXFLAGS =
CXXFLAGS += -g3 -std=gnu++11
CXXFLAGS += -Wall -Wextra
CXXFLAGS += -Os -fpack-struct -fshort-enums -fno-inline-small-functions
CXXFLAGS += -flto -fno-fat-lto-objects
# I would think these are not required with -flto, but adding these
# removes a lot of unused functions that lto apparently leaves...
CXXFLAGS += -ffunction-sections -fdata-sections -Wl,--gc-sections
CXXFLAGS += -fno-exceptions
CXXFLAGS += -I$(ARCH)
CXXFLAGS += -DBOARD_INFO_SIZE=$(BOARD_INFO_SIZE)
CXXFLAGS += -DFLASH_ERASE_SIZE=$(FLASH_ERASE_SIZE)
CXXFLAGS += -DFLASH_WRITE_SIZE=$(FLASH_WRITE_SIZE)
CXXFLAGS += -DFLASH_APP_OFFSET=$(FLASH_APP_OFFSET)
CXXFLAGS += -DPROTOCOL_VERSION=$(PROTOCOL_VERSION) -DBOARD_TYPE_$(BOARD_TYPE)
CXXFLAGS += -DBL_VERSION=$(BL_VERSION)
ifeq ($(BUS),TwoWire)
CXXFLAGS += -DUSE_I2C
else ifeq ($(BUS),Rs485)
CXXFLAGS += -DUSE_RS485
endif
ifdef OPENCM3_DIR
include $(OPENCM3_DIR)/mk/genlink-config.mk
ifeq ($(LIBNAME),)
$(error libopencm3 library not found, compile it first with "make -C libopencm3 lib/stm32/g0 CFLAGS='-flto -fno-fat-lto-objects'")
endif
# These are generated by genlink-config
CXXFLAGS += $(CPPFLAGS)
CXXFLAGS += $(ARCH_FLAGS)
DEFAULT_LDSCRIPT = $(LDSCRIPT)
endif
CUSTOM_LDSCRIPT = $(ARCH)/linker-script.x
ifdef DEFAULT_LDSCRIPT
LDFLAGS += -Wl,-dT $(DEFAULT_LDSCRIPT)
endif
LDFLAGS += -T $(ARCH)/linker-script.x
ifeq ($(ARCH),attiny)
PREFIX = avr-
SIZE_FORMAT = avr
LDFLAGS += -mmcu=$(MCU)
CXXFLAGS += -mmcu=$(MCU) -DF_CPU=8000000UL
# Pass sizes to the script for positioning
LDFLAGS += -Wl,--defsym=BL_SIZE=$(BL_SIZE)
LDFLAGS += -Wl,--defsym=BOARD_INFO_SIZE=$(BOARD_INFO_SIZE)
# Pass ERASE_SIZE to the script to verify alignment
LDFLAGS += -Wl,--defsym=FLASH_ERASE_SIZE=$(FLASH_ERASE_SIZE)
else ifeq ($(ARCH),stm32)
PREFIX = arm-none-eabi-
SIZE_FORMAT = berkely
CXXFLAGS += -DSTM32
CXXFLAGS += -DAPPLICATION_SIZE="($(FLASH_SIZE)-$(FLASH_APP_OFFSET))"
LDFLAGS += -nostartfiles
LDFLAGS += -specs=nano.specs
LDFLAGS += -specs=nosys.specs
# Pass sizes to the script for positioning
LDFLAGS += -Wl,--defsym=BOARD_INFO_SIZE=$(BOARD_INFO_SIZE)
LDFLAGS += -Wl,--defsym=FLASH_APP_OFFSET=$(FLASH_APP_OFFSET)
endif
CC = $(PREFIX)gcc
OBJCOPY = $(PREFIX)objcopy
OBJDUMP = $(PREFIX)objdump
SIZE = $(PREFIX)size
ifdef BOARD_TYPE
FILE_NAME=bootloader-v$(BL_VERSION)-$(BOARD_TYPE)
endif
# Make sure that .o files are deleted after building, so we can build for multiple
# hw revisions without needing an explicit clean in between.
.INTERMEDIATE: $(OBJ)
default:
$(MAKE) all ARCH=attiny BUS=TwoWire BOARD_TYPE=interfaceboard
$(MAKE) all ARCH=stm32 BUS=Rs485 BOARD_TYPE=gphopper
all: hex fuses size checksize
hex: $(FILE_NAME).hex
fuses:
ifdef ATTINY
@if $(OBJDUMP) -s -j .fuse 2> /dev/null $(FILE_NAME).elf > /dev/null; then \
$(OBJDUMP) -s -j .fuse $(FILE_NAME).elf; \
echo " ^^ Low"; \
echo " ^^ High"; \
echo " ^^ Extended"; \
fi
endif
size:
$(SIZE) --format=$(SIZE_FORMAT) $(FILE_NAME).elf
clean:
$(MAKE) cleanarch ARCH=attiny BUS=TwoWire
$(MAKE) cleanarch ARCH=stm32 BUS=TwoWire
$(MAKE) cleanarch ARCH=stm32 BUS=Rs485
cleanarch:
rm -rf $(OBJ) $(OBJ:.o=.d) *.elf *.hex *.lst *.map *.bin
ifdef OPENCM3_DIR
rm -f $(LDSCRIPT)
endif
$(FILE_NAME).elf: $(OBJ) $(CUSTOM_LDSCRIPT) $(DEFAULT_LDSCRIPT) $(LIBDEPS)
$(CC) $(CXXFLAGS) $(LDFLAGS) -o $@ $(OBJ) $(LDLIBS)
%.o: %.cpp Makefile
$(CC) $(CXXFLAGS) -MMD -MP -c -o $@ $<
%.lst: %.elf
$(OBJDUMP) -h -S $< > $@
%.hex: %.elf
$(OBJCOPY) -j .text -j '.text.*' -j .data -O ihex $< $@
%.bin: %.elf
$(OBJCOPY) -j .text -j '.text.*' -j .data -O binary $< $@
# When the bootloader has an offset, objcopy pads the pin file at the
# start, so correct for that.
MAX_BIN_SIZE=$(shell expr $(BL_OFFSET) + $(BL_SIZE))
checksize: $(FILE_NAME).bin
@if [ $$(stat -c '%s' $<) -gt $(MAX_BIN_SIZE) ]; then \
echo "Compiled size too big, maybe adjust BL_SIZE in Makefile?"; \
false; \
fi
# Rule to generate linker script
ifdef OPENCM3_DIR
include $(OPENCM3_DIR)/mk/genlink-rules.mk
endif
.PHONY: all lst hex clean fuses size
# pull in dependency info for *existing* .o files
-include $(OBJ:.o=.d)