1 include makefile_common.mk
6 # Choose permissible app area IDs
7 ifeq ($(bl_updater_match_app_area_id),no)
8 # Match any app area ID
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)
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)
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"
27 # Include HAL driver code, needed to link bootloader updater
29 # This populates SRCS and ASM_SRCS
30 -include $(HAL_API_PATH)makefile
32 #INCLUDES += -iquote$(API_PATH) -I$(UTIL_PATH)
37 # The bootloader library, which includes the Generic Bootloader Updater Tool
38 BOOTLOADER_LIB := $(BUILDPREFIX_BOOTLOADER)bootloader.a
40 # Entry point for the bootloader updater and the second stage loader
41 ENTRYPOINT_ASM := $(MCU_PATH)common/bl_updater_entrypoint.s
43 # Compiled entry point for the bootloader updater
44 ENTRYPOINT_OBJ = $(BUILDPREFIX_BL_UPDATER)bl_updater_entrypoint.o
46 # Compiled entry point for the second stage loader
47 ENTRYPOINT_2ND_OBJ = $(BUILDPREFIX_BL_UPDATER)bl_updater_entrypoint_2nd.o
49 # Compiled and linked bootloader updater
50 BL_UPDATER_ELF := $(BL_UPDATER_HEX:.hex=.elf)
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)
56 # Command list for bootloader updater
57 COMMAND_LIST := $(APP_SRCS_PATH)COMMAND_LIST.conf
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
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_))
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_))
75 # This makefile, needed for re-reading it after generating a makefile fragment
76 THIS_MAKEFILE := $(firstword $(MAKEFILE_LIST))
78 # Source files for bootloader updater
79 SRCS_BL_UPDATER := $(SRCS) $(notdir $(GEN_CONFIG_SRCS) $(GEN_SRCS))
80 ASM_SRCS_BL_UPDATER := $(ASM_SRCS)
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_))
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_))
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
95 # Linker script for the bootloader updater and the second stage loader
97 LDSCRIPT_BL_UPDATER = $(MCU_PATH)$(MCU_FAMILY)/$(MCU)/linker/gcc_bl_updater_$(MCU)$(MCU_SUB)$(MCU_MEM_VAR).ld
99 LDSCRIPT_BL_UPDATER = $(MCU_PATH)$(MCU_FAMILY)/$(MCU)/linker/gcc_bl_updater_$(MCU)$(MCU_SUB)$(MCU_MEM_VAR)_$(MCU_RAM_VAR).ld
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)
112 define GENERATE_CONFIG_INI
113 @echo "$(COLOR_INFO)Generating:$(COLOR_END) $(BL_UPDATER_BUILD_VARIABLES_MK)"
115 @# Generate config file for the old bootloader
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) \
125 -ol APP_AREA_ID:$(app_area_id) \
127 -hv 0x$(HW_VARIANT_ID) \
128 -fb $(FLASH_BASE_ADDR) \
129 -bs $(old_bootloader_size) \
130 -as $(BOOTLOADER_SIZES)
133 define GENERATE_STACK_SCRATCHPADS
134 @echo "$(COLOR_INFO)Generating:$(COLOR_END) stack scratchpads"
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=; \
143 SECOND_STAGE_DEF=$(STACK_CONF):$(old_bl_stack_area_id):$(BL_UPDATER_2ND_HEX); \
147 --configfile=$(BL_UPDATER_OLD_CONFIG_INI) \
148 $(SCRATCHPAD_FOR_OLD_BL) \
150 $(STACK_CONF):$(stack_area_id):$(STACK_HEX); \
153 --configfile=$(BOOTLOADER_CONFIG_INI) \
154 $(SCRATCHPAD_FOR_NEW_BL) \
156 $(STACK_CONF):$(stack_area_id):$(STACK_HEX)
159 define GENERATE_CONFIG_DATA
161 @echo "$(COLOR_INFO)Converting:$(COLOR_END) new bootloader configuration"
164 $(BUILDPREFIX_BL_UPDATER) \
166 --config_file=$(BOOTLOADER_CONFIG_INI) \
167 --old_config_file=$(BL_UPDATER_OLD_CONFIG_INI) \
168 --match_app_area_id=$(MATCH_APP_AREA_ID) \
172 @echo "$(COLOR_INFO)Converting:$(COLOR_END) scratchpad keys"
175 $(BUILDPREFIX_BL_UPDATER) \
176 --old_config_file=$(BL_UPDATER_OLD_CONFIG_INI) \
177 --config_file=$(BOOTLOADER_CONFIG_INI)
180 define GENERATE_BL_SCRATCHPAD_DATA
183 @echo "$(COLOR_INFO)Converting:$(COLOR_END) new bootloader"
186 $(BUILDPREFIX_BL_UPDATER) \
188 --config_file=$(BOOTLOADER_CONFIG_INI)
191 @echo "$(COLOR_INFO)Converting:$(COLOR_END) stack scratchpads"
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)
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)
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)
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) \
222 # Link second stage loader with entrypoint and bootloader updater library
223 $(BL_UPDATER_2ND_ELF): $(ENTRYPOINT_2ND_OBJ) $(OBJS_2ND_STAGE) $(BOOTLOADER_LIB)
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) \
236 $(BUILDPREFIX_BL_UPDATER)%.hex: $(BUILDPREFIX_BL_UPDATER)%.elf
238 @echo "$(COLOR_INFO)Generating:$(COLOR_END) $@"
239 $(D)$(OBJCOPY) $< -O ihex $@
241 $(GEN_CONFIG_SRCS): $(BL_UPDATER_OLD_CONFIG_INI) $(BOOTLOADER_CONFIG_INI)
242 $(call GENERATE_CONFIG_DATA)
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)
247 $(BUILDPREFIX_BL_UPDATER)%.o: %.c
249 @echo "$(COLOR_CC)CC$(COLOR_END) $<"
250 $(D)$(CC) $(INCLUDES) $(CFLAGS) -MMD -MP -c $< -o $@
252 $(BUILDPREFIX_BL_UPDATER)%.o: $(BUILDPREFIX_BL_UPDATER)%.c
254 @echo "$(COLOR_CC)CC$(COLOR_END) $<"
255 $(D)$(CC) $(INCLUDES) $(CFLAGS) -MMD -MP -c $< -o $@
257 $(BUILDPREFIX_BL_UPDATER)%.o: %.s
259 @echo "$(COLOR_CC)CC$(COLOR_END) $<"
260 $(D)$(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@
262 $(ENTRYPOINT_OBJ): $(ENTRYPOINT_ASM)
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 \
270 $(ENTRYPOINT_2ND_OBJ): $(ENTRYPOINT_ASM)
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 \
278 # Prevent initial makefile fragment generation happening in the wrong order
279 .NOTPARALLEL: $(BL_UPDATER_BUILD_VARIABLES_MK) $(THIS_MAKEFILE)
281 # Ensure that this makefile is re-read when
282 # the makefile fragment is generated below
283 $(THIS_MAKEFILE): $(BL_UPDATER_BUILD_VARIABLES_MK)
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)
290 # Include a makefile fragment for build-time
291 # make variables, generated by the rule above
292 -include $(BL_UPDATER_BUILD_VARIABLES_MK)
295 all: $(BL_UPDATER_HEX)
298 $(D)$(RM) -rf $(CLEAN)