Wirepas SDK
makefile_bl_updater.mk
Go to the documentation of this file.
1 include makefile_common.mk
2 
3 .DEFAULT_GOAL := all
4 
5 
6 # Choose permissible app area IDs
7 ifeq ($(bl_updater_match_app_area_id),no)
8 # Match any app area ID
9 MATCH_APP_AREA_ID :=
10 else
11 ifeq ($(bl_updater_match_app_area_id),yes)
12 # Match only the app area ID of the application being built
13 MATCH_APP_AREA_ID := $(app_area_id)
14 else
15 # Match multiple app area IDs, including the application being built
16 MATCH_APP_AREA_ID := $(app_area_id),$(bl_updater_match_app_area_id)
17 endif
18 endif
19 
20 # Reset areas to those in the new INI file, or keep areas
21 ifeq ($(bl_updater_reset_areas),yes)
22 RESET_AREAS := "--reset_areas"
23 else
24 RESET_AREAS :=
25 endif
26 
27 # Include HAL driver code, needed to link bootloader updater
28 #
29 # This populates SRCS and ASM_SRCS
30 -include $(HAL_API_PATH)makefile
31 
32 #INCLUDES += -iquote$(API_PATH) -I$(UTIL_PATH)
33 
34 stack_mode ?= normal
35 modemfw_name ?=
36 
37 # The bootloader library, which includes the Generic Bootloader Updater Tool
38 BOOTLOADER_LIB := $(BUILDPREFIX_BOOTLOADER)bootloader.a
39 
40 # Entry point for the bootloader updater and the second stage loader
41 ENTRYPOINT_ASM := $(MCU_PATH)common/bl_updater_entrypoint.s
42 
43 # Compiled entry point for the bootloader updater
44 ENTRYPOINT_OBJ = $(BUILDPREFIX_BL_UPDATER)bl_updater_entrypoint.o
45 
46 # Compiled entry point for the second stage loader
47 ENTRYPOINT_2ND_OBJ = $(BUILDPREFIX_BL_UPDATER)bl_updater_entrypoint_2nd.o
48 
49 # Compiled and linked bootloader updater
50 BL_UPDATER_ELF := $(BL_UPDATER_HEX:.hex=.elf)
51 
52 # Compiled and linked second stage loader
53 BL_UPDATER_2ND_HEX := $(BUILDPREFIX_BL_UPDATER)bl_updater_2nd.hex
54 BL_UPDATER_2ND_ELF := $(BL_UPDATER_2ND_HEX:.hex=.elf)
55 
56 # Command list for bootloader updater
57 COMMAND_LIST := $(APP_SRCS_PATH)COMMAND_LIST.conf
58 
59 # Scratchpads with stack for new and old bootloaders
60 SCRATCHPAD_FOR_OLD_BL := $(BUILDPREFIX_BL_UPDATER)wpc_stack_for_old_bl.otap
61 SCRATCHPAD_FOR_NEW_BL := $(BUILDPREFIX_BL_UPDATER)wpc_stack_for_new_bl.otap
62 
63 # Bootloader configuration data, generated by bl_updater_config.py
64 GEN_CONFIG_SRCS_ := bl_updater_config_blupd2.c
65 GEN_CONFIG_SRCS_ += encrypt_key_for_old_bl.c encrypt_key_for_new_bl.c
66 GEN_CONFIG_SRCS := $(addprefix $(BUILDPREFIX_BL_UPDATER), $(GEN_CONFIG_SRCS_))
67 
68 # Other files generated by bl_updater_config.py
69 GEN_SRCS_ := new_bootloader_data.c
70 GEN_SRCS_ += scratchpad_prefix_for_old_bl.c scratchpad_prefix_for_new_bl.c
71 GEN_SRCS_ += ctr_advance_for_old_bl.c ctr_advance_for_new_bl.c
72 GEN_SRCS_ += scratchpad_file_headers.c scratchpad_file_data.c
73 GEN_SRCS := $(addprefix $(BUILDPREFIX_BL_UPDATER), $(GEN_SRCS_))
74 
75 # This makefile, needed for re-reading it after generating a makefile fragment
76 THIS_MAKEFILE := $(firstword $(MAKEFILE_LIST))
77 
78 # Source files for bootloader updater
79 SRCS_BL_UPDATER := $(SRCS) $(notdir $(GEN_CONFIG_SRCS) $(GEN_SRCS))
80 ASM_SRCS_BL_UPDATER := $(ASM_SRCS)
81 
82 # Objects files for bootloader updater
83 OBJS_BL_UPDATER_ := $(SRCS_BL_UPDATER:.c=.o) $(ASM_SRCS_BL_UPDATER:.s=.o)
84 OBJS_BL_UPDATER := $(addprefix $(BUILDPREFIX_BL_UPDATER), $(OBJS_BL_UPDATER_))
85 
86 # Object files for second stage loader
87 OBJS_2ND_STAGE_ := $(SRCS:.c=.o) $(ASM_SRCS:.s=.o)
88 OBJS_2ND_STAGE_ += bl_updater_config_blupd2.o encrypt_key_for_old_bl.o
89 OBJS_2ND_STAGE := $(addprefix $(BUILDPREFIX_BL_UPDATER), $(OBJS_2ND_STAGE_))
90 
91 # Do not print a warning when linking code to RAM ("bl_updater.elf
92 # has a LOAD segment with RWX permissions")
93 LDFLAGS += -Wl,--no-warn-rwx-segments
94 
95 # Linker script for the bootloader updater and the second stage loader
96 ifndef MCU_RAM_VAR
97 LDSCRIPT_BL_UPDATER = $(MCU_PATH)$(MCU_FAMILY)/$(MCU)/linker/gcc_bl_updater_$(MCU)$(MCU_SUB)$(MCU_MEM_VAR).ld
98 else
99 LDSCRIPT_BL_UPDATER = $(MCU_PATH)$(MCU_FAMILY)/$(MCU)/linker/gcc_bl_updater_$(MCU)$(MCU_SUB)$(MCU_MEM_VAR)_$(MCU_RAM_VAR).ld
100 endif
101 
102 # Files to be cleaned
103 CLEAN := $(OBJS_BL_UPDATER) $(OBJS_2ND_STAGE) $(GEN_CONFIG_SRCS) $(GEN_SRCS)
104 CLEAN += $(BL_UPDATER_HEX) $(BL_UPDATER_ELF) $(ENTRYPOINT_OBJ)
105 CLEAN += $(BL_UPDATER_2ND_HEX) $(BL_UPDATER_2ND_ELF) $(ENTRYPOINT_2ND_OBJ)
106 CLEAN += $(BL_UPDATER_OLD_CONFIG_INI) $(BL_UPDATER_BUILD_VARIABLES_MK)
107 CLEAN += $(SCRATCHPAD_FOR_OLD_BL) $(SCRATCHPAD_FOR_NEW_BL)
108 
109 
110 # Functions
111 
112 define GENERATE_CONFIG_INI
113  @echo "$(COLOR_INFO)Generating:$(COLOR_END) $(BL_UPDATER_BUILD_VARIABLES_MK)"
114 
115  @# Generate config file for the old bootloader
116  $(DD)$(MKDIR) $(@D)
117  $(D)$(BOOT_CONF) \
118  -i $(ini_file_wp) \
119  -i $(ini_file_app) \
120  -i $(platform_config_ini) \
121  -i $(bl_updater_old_key_file) \
122  -o $(BL_UPDATER_OLD_CONFIG_INI) \
123  -om $(BL_UPDATER_BUILD_VARIABLES_MK) \
124  -vp "old_bl_" \
125  -ol APP_AREA_ID:$(app_area_id) \
126  -hm 0x$(HW_MAGIC) \
127  -hv 0x$(HW_VARIANT_ID) \
128  -fb $(FLASH_BASE_ADDR) \
129  -bs $(old_bootloader_size) \
130  -as $(BOOTLOADER_SIZES)
131 endef
132 
133 define GENERATE_STACK_SCRATCHPADS
134  @echo "$(COLOR_INFO)Generating:$(COLOR_END) stack scratchpads"
135 
136  $(DD)$(MKDIR) $(@D)
137 
138  @# Only add second stage loader to the scratchpad if area IDs differ
139  $(DD)if test $(old_bl_stack_area_id) = $(stack_area_id); then \
140  export SECOND_STAGE_DEF=; \
141  else \
142  export \
143  SECOND_STAGE_DEF=$(STACK_CONF):$(old_bl_stack_area_id):$(BL_UPDATER_2ND_HEX); \
144  fi; \
145  \
146  $(SCRAT_GEN) \
147  --configfile=$(BL_UPDATER_OLD_CONFIG_INI) \
148  $(SCRATCHPAD_FOR_OLD_BL) \
149  $$SECOND_STAGE_DEF \
150  $(STACK_CONF):$(stack_area_id):$(STACK_HEX); \
151  \
152  $(SCRAT_GEN) \
153  --configfile=$(BOOTLOADER_CONFIG_INI) \
154  $(SCRATCHPAD_FOR_NEW_BL) \
155  $$SECOND_STAGE_DEF \
156  $(STACK_CONF):$(stack_area_id):$(STACK_HEX)
157 endef
158 
159 define GENERATE_CONFIG_DATA
160  $(DD)$(MKDIR) $(@D)
161  @echo "$(COLOR_INFO)Converting:$(COLOR_END) new bootloader configuration"
162  $(D)$(BL_UPD_CONF) \
163  config_to_data \
164  $(BUILDPREFIX_BL_UPDATER) \
165  $(COMMAND_LIST) \
166  --config_file=$(BOOTLOADER_CONFIG_INI) \
167  --old_config_file=$(BL_UPDATER_OLD_CONFIG_INI) \
168  --match_app_area_id=$(MATCH_APP_AREA_ID) \
169  $(RESET_AREAS)
170 
171  $(DD)$(MKDIR) $(@D)
172  @echo "$(COLOR_INFO)Converting:$(COLOR_END) scratchpad keys"
173  $(D)$(BL_UPD_CONF) \
174  keys_to_data \
175  $(BUILDPREFIX_BL_UPDATER) \
176  --old_config_file=$(BL_UPDATER_OLD_CONFIG_INI) \
177  --config_file=$(BOOTLOADER_CONFIG_INI)
178 endef
179 
180 define GENERATE_BL_SCRATCHPAD_DATA
181  $(DD)$(MKDIR) $(@D)
182 
183  @echo "$(COLOR_INFO)Converting:$(COLOR_END) new bootloader"
184  $(D)$(BL_UPD_CONF) \
185  bl_to_data \
186  $(BUILDPREFIX_BL_UPDATER) \
187  $(BOOTLOADER_HEX) \
188  --config_file=$(BOOTLOADER_CONFIG_INI)
189 
190  $(DD)$(MKDIR) $(@D)
191  @echo "$(COLOR_INFO)Converting:$(COLOR_END) stack scratchpads"
192  $(D)$(BL_UPD_CONF) \
193  scratchpads_to_data \
194  $(BUILDPREFIX_BL_UPDATER) \
195  $(SCRATCHPAD_FOR_OLD_BL) $(SCRATCHPAD_FOR_NEW_BL) \
196  --old_config_file=$(BL_UPDATER_OLD_CONFIG_INI) \
197  --config_file=$(BOOTLOADER_CONFIG_INI)
198 endef
199 
200 
201 # Target rules
202 
203 # Generate a scratchpads for embedding in the bootloader updater
204 $(SCRATCHPAD_FOR_NEW_BL) $(SCRATCHPAD_FOR_OLD_BL): $(BOOTLOADER_CONFIG_INI) $(BL_UPDATER_OLD_CONFIG_INI) $(BL_UPDATER_2ND_HEX) $(STACK_HEX)
205  $(call GENERATE_STACK_SCRATCHPADS)
206 
207 # Link entrypoint, bootloader updater library, embedded stack-only
208 # scratchpad, new bootloader, and bootloader updater config
209 $(BL_UPDATER_ELF): $(ENTRYPOINT_OBJ) $(OBJS_BL_UPDATER) $(BOOTLOADER_LIB)
210  $(DD)$(MKDIR) $(@D)
211  @echo "$(COLOR_LINK)Linking$(COLOR_END) $@"
212  $(D)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ \
213  -Wl,--defsym,__bootloader_area_addr__=$(old_bl_bootloader_area_addr) \
214  -Wl,--defsym,__bootloader_area_length__=$(old_bl_bootloader_area_length) \
215  -Wl,--defsym,__stack_area_addr__=$(old_bl_stack_area_addr) \
216  -Wl,--defsym,__stack_area_length__=$(old_bl_stack_area_length) \
217  -Wl,--defsym,__keepout_length__=16384 \
218  -Wl,-Map=$(BUILDPREFIX_BL_UPDATER)bl_updater.map \
219  -Wl,-T,$(LDSCRIPT_BL_UPDATER) \
220  $(LIBS)
221 
222 # Link second stage loader with entrypoint and bootloader updater library
223 $(BL_UPDATER_2ND_ELF): $(ENTRYPOINT_2ND_OBJ) $(OBJS_2ND_STAGE) $(BOOTLOADER_LIB)
224  $(DD)$(MKDIR) $(@D)
225  @echo "$(COLOR_LINK)Linking$(COLOR_END) $@"
226  $(D)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ \
227  -Wl,--defsym,__bootloader_area_addr__=$(old_bl_bootloader_area_addr) \
228  -Wl,--defsym,__bootloader_area_length__=$(old_bl_bootloader_area_length) \
229  -Wl,--defsym,__stack_area_addr__=$(old_bl_stack_area_addr) \
230  -Wl,--defsym,__stack_area_length__=$(old_bl_stack_area_length) \
231  -Wl,--defsym,__keepout_length__=0 \
232  -Wl,-Map=$(BUILDPREFIX_BL_UPDATER)bl_updater_2nd.map \
233  -Wl,-T,$(LDSCRIPT_BL_UPDATER) \
234  $(LIBS)
235 
236 $(BUILDPREFIX_BL_UPDATER)%.hex: $(BUILDPREFIX_BL_UPDATER)%.elf
237  $(DD)$(MKDIR) $(@D)
238  @echo "$(COLOR_INFO)Generating:$(COLOR_END) $@"
239  $(D)$(OBJCOPY) $< -O ihex $@
240 
241 $(GEN_CONFIG_SRCS): $(BL_UPDATER_OLD_CONFIG_INI) $(BOOTLOADER_CONFIG_INI)
242  $(call GENERATE_CONFIG_DATA)
243 
244 $(GEN_SRCS): $(BOOTLOADER_HEX) $(SCRATCHPAD_FOR_OLD_BL) $(SCRATCHPAD_FOR_NEW_BL) $(BL_UPDATER_OLD_CONFIG_INI) $(BOOTLOADER_CONFIG_INI)
245  $(call GENERATE_BL_SCRATCHPAD_DATA)
246 
247 $(BUILDPREFIX_BL_UPDATER)%.o: %.c
248  $(DD)$(MKDIR) $(@D)
249  @echo "$(COLOR_CC)CC$(COLOR_END) $<"
250  $(D)$(CC) $(INCLUDES) $(CFLAGS) -MMD -MP -c $< -o $@
251 
252 $(BUILDPREFIX_BL_UPDATER)%.o: $(BUILDPREFIX_BL_UPDATER)%.c
253  $(DD)$(MKDIR) $(@D)
254  @echo "$(COLOR_CC)CC$(COLOR_END) $<"
255  $(D)$(CC) $(INCLUDES) $(CFLAGS) -MMD -MP -c $< -o $@
256 
257 $(BUILDPREFIX_BL_UPDATER)%.o: %.s
258  $(DD)$(MKDIR) $(@D)
259  @echo "$(COLOR_CC)CC$(COLOR_END) $<"
260  $(D)$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@
261 
262 $(ENTRYPOINT_OBJ): $(ENTRYPOINT_ASM)
263  $(DD)$(MKDIR) $(@D)
264  @echo "$(COLOR_CC)CC$(COLOR_END) $<"
265  $(D)$(CC) $(INCLUDES) $(CFLAGS) \
266  -Wa,-defsym,BOOTLOADER_UPDATER=1 \
267  -Wa,-defsym,SECOND_STAGE_LOADER=0 \
268  -c $< -o $@
269 
270 $(ENTRYPOINT_2ND_OBJ): $(ENTRYPOINT_ASM)
271  $(DD)$(MKDIR) $(@D)
272  @echo "$(COLOR_CC)CC$(COLOR_END) $<"
273  $(D)$(CC) $(INCLUDES) $(CFLAGS) \
274  -Wa,-defsym,BOOTLOADER_UPDATER=0 \
275  -Wa,-defsym,SECOND_STAGE_LOADER=1 \
276  -c $< -o $@
277 
278 # Prevent initial makefile fragment generation happening in the wrong order
279 .NOTPARALLEL: $(BL_UPDATER_BUILD_VARIABLES_MK) $(THIS_MAKEFILE)
280 
281 # Ensure that this makefile is re-read when
282 # the makefile fragment is generated below
283 $(THIS_MAKEFILE): $(BL_UPDATER_BUILD_VARIABLES_MK)
284 
285 # Generate full bootloader configuration and a makefile fragment that match the
286 # old bootloader configuration as well as the embedded stack configuration
287 $(BL_UPDATER_OLD_CONFIG_INI) $(BL_UPDATER_BUILD_VARIABLES_MK): $(ini_file_wp) $(ini_file_app) $(bl_updater_old_key_file)
288  $(call GENERATE_CONFIG_INI)
289 
290 # Include a makefile fragment for build-time
291 # make variables, generated by the rule above
292 -include $(BL_UPDATER_BUILD_VARIABLES_MK)
293 
294 .PHONY: all
295 all: $(BL_UPDATER_HEX)
296 
297 clean:
298  $(D)$(RM) -rf $(CLEAN)