]> mj.ucw.cz Git - home-hw.git/blob - mk/bluepill.mk
829c79bd356b60cfb7e137701c5d24be422caee7
[home-hw.git] / mk / bluepill.mk
1 # Generic Makefile fragment for Blue Pill devices and LibOpenCM3
2 #
3 # Parameters:
4 #
5 #       ROOT                    path to root of the repository
6 #       BINARY                  binary to build (without extension)
7 #       OBJS                    list of object files
8 #       LIB_OBJS                list of library object files
9 #       WITH_BOOT_LOADER        define if code origin should be shifted by 8K for boot loader
10 #       WITH_DFU_FLASH          flashing uses dfu-util
11 #       WITH_SERIAL_FLASH       flashing uses the built-in serial boot-loader
12 #       MAX_SIZE                complain if the built firmware exceeds this size
13 #
14
15 vpath %.c $(ROOT)/lib
16 OBJS += $(LIB_OBJS)
17
18 OPENCM3_DIR=/home/mj/stm/libopencm3
19 DEVICE=stm32f103x8
20
21 .PHONY: all
22 all:: $(BINARY).elf
23
24 .PHONY: flash
25 flash: $(BINARY).flash
26
27 ifneq ($(V),1)
28 Q               := @
29 NULL            := 2>/dev/null
30 endif
31
32 include $(OPENCM3_DIR)/mk/genlink-config.mk
33
34 ifdef WITH_BOOT_LOADER
35
36 # We want to generate a linked script for a different ROM start address
37 UCW_LDSCRIPT=bootloader-$(DEVICE).ld
38
39 bootloader-$(DEVICE).ld: generated.$(DEVICE).ld
40         @printf "  GENLNK2 $@\n"
41         $(Q)sed '/^ rom /s/ORIGIN = 0x08000000/ORIGIN = 0x08002000/' <$< >$@
42
43 else
44
45 UCW_LDSCRIPT=$(LDSCRIPT)
46
47 endif
48
49 PREFIX          ?= arm-none-eabi
50
51 CC              := $(PREFIX)-gcc
52 CXX             := $(PREFIX)-g++
53 LD              := $(PREFIX)-gcc
54 AR              := $(PREFIX)-ar
55 AS              := $(PREFIX)-as
56 OBJCOPY         := $(PREFIX)-objcopy
57 OBJDUMP         := $(PREFIX)-objdump
58 GDB             := $(PREFIX)-gdb
59 OPT             := -Os
60 DEBUG           := -ggdb3
61 CSTD            ?= -std=gnu99
62
63 TGT_CFLAGS      += $(OPT) $(CSTD) $(DEBUG)
64 TGT_CFLAGS      += $(ARCH_FLAGS)
65 TGT_CFLAGS      += -Wall -Wextra -Wshadow -Wimplicit-function-declaration
66 TGT_CFLAGS      += -Wredundant-decls -Wmissing-prototypes -Wstrict-prototypes -Wno-parentheses
67 TGT_CFLAGS      += -fno-common -ffunction-sections -fdata-sections
68 TGT_CFLAGS      += -I. -I$(ROOT)/lib
69
70 TGT_CPPFLAGS    += -MD
71
72 TGT_LDFLAGS     += --static -nostartfiles
73 TGT_LDFLAGS     += -T$(UCW_LDSCRIPT)
74 TGT_LDFLAGS     += $(ARCH_FLAGS) $(DEBUG)
75 TGT_LDFLAGS     += -Wl,-Map=$(*).map -Wl,--cref
76 TGT_LDFLAGS     += -Wl,--gc-sections
77 ifeq ($(V),99)
78 TGT_LDFLAGS     += -Wl,--print-gc-sections
79 endif
80
81 LDLIBS          += -Wl,--start-group -lc -lgcc -lnosys -Wl,--end-group
82
83 include $(OPENCM3_DIR)/mk/genlink-rules.mk
84
85 %.bin: %.elf
86         @printf "  OBJCOPY $< -> $@\n"
87         $(Q)$(OBJCOPY) -Obinary $< $@
88 ifdef MAX_SIZE
89         $(Q)if [ $$(stat -c '%s' $@) -gt $(MAX_SIZE) ] ; then echo >&2 "Output too exceeds $(MAX_SIZE) bytes!" ; false ; fi
90 endif
91
92 %.elf: $(OBJS) $(UCW_LDSCRIPT)
93         @printf "  LD      $(*).elf\n"
94         $(Q)$(LD) $(TGT_LDFLAGS) $(LDFLAGS) $(OBJS) $(LDLIBS) -o $*.elf
95
96 %.o: %.c
97         @printf "  CC      $(*).c\n"
98         $(Q)$(CC) $(TGT_CFLAGS) $(CFLAGS) $(TGT_CPPFLAGS) $(CPPFLAGS) -o $@ -c $<
99
100 .PHONY: clean
101 clean:
102         @printf "  CLEAN\n"
103         $(Q)rm -f *.elf *.bin *.dfu *.o *.d *.map $(LDSCRIPT) $(UCW_LDSCRIPT)
104
105 ifdef WITH_DFU_FLASH
106
107 all:: $(BINARY).dfu
108
109 %.flash: %.dfu
110         @printf "  FLASH  $<\n"
111         $(Q)dfu-util -D $<
112
113 %.dfu: %.bin $(ROOT)/tools/dfu-sign
114         @printf "  SIGN    $< -> $@\n"
115         $(Q)$(ROOT)/tools/dfu-sign $< $@
116
117 $(ROOT)/tools/dfu-sign:
118         make -C $(ROOT)/tools
119
120 # For the STM32duino-bootloader, we used:
121 #%.flash: %.bin
122 #       @printf "  FLASH  $<\n"
123 #       $(Q)dfu-util -a2 -D $(*).bin
124
125 else
126
127 ifdef WITH_SERIAL_FLASH
128
129 all:: $(BINARY).bin
130
131 BOOT_SERIAL ?= /dev/ttyUSB0
132
133 %.flash: %.bin
134         @printf "  FLASH  $<\n"
135         $(Q)$(ROOT)/bin/stm32flash $(BOOT_SERIAL) -i 'dtr,-dtr' -w $< -g 0
136
137 .PHONY: reset
138 reset: all
139         $(Q)$(ROOT)/bin/stm32flash $(BOOT_SERIAL) -i 'dtr,-dtr' -g 0
140
141 else
142
143 all:: $(BINARY).bin
144
145 %.flash: %.bin
146         @printf "  FLASH  $<\n"
147         $(Q)$(ROOT)/bin/st-flash write $(*).bin 0x8000000
148
149 .PHONY: reset
150 reset:
151         $(ROOT)/bin/st-flash reset
152
153 endif
154 endif
155
156 .SECONDEXPANSION:
157 .SECONDARY:
158
159 -include $(OBJS:.o=.d)