<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/simtrace2/+/26026">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved; Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware: add bootloader update "app"<br><br>This bl updater can be flashed as app and will update the bootloader and<br>then<br>delete itself before resetting the sam3, so the device will end up in<br>the newly<br>updated dfu bootloader afterwards, without having to press the<br>bootloader button<br>or requring any other manual interaction, ready to receive a new<br>application image.<br><br>Building the blupdater requires a previously built dfu-flash bootloader<br>bin file that<br>will then be embedded into the app during building.<br><br>Related: OS#1704<br>Related: SYS5061<br>Change-Id: I53dea57bba790a2ab3245d9483e0ff1c8d19d5e3<br>---<br>M Makefile<br>M firmware/Makefile<br>A firmware/apps/blupdate/Makefile<br>A firmware/apps/blupdate/main.c<br>M firmware/libboard/common/resources/sam3s4/dfu.ld<br>5 files changed, 192 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/Makefile b/Makefile</span><br><span>index b15f38d..9951e54 100644</span><br><span>--- a/Makefile</span><br><span>+++ b/Makefile</span><br><span>@@ -8,16 +8,23 @@</span><br><span> endef</span><br><span> </span><br><span> $(eval $(call RULES,simtrace,dfu))</span><br><span style="color: hsl(120, 100%, 40%);">+$(eval $(call RULES,simtrace,blupdate))</span><br><span> $(eval $(call RULES,simtrace,trace))</span><br><span> $(eval $(call RULES,simtrace,cardem))</span><br><span> $(eval $(call RULES,qmod,dfu))</span><br><span style="color: hsl(120, 100%, 40%);">+$(eval $(call RULES,qmod,blupdate))</span><br><span> $(eval $(call RULES,qmod,cardem))</span><br><span> $(eval $(call RULES,ngff_cardem,dfu))</span><br><span style="color: hsl(120, 100%, 40%);">+$(eval $(call RULES,ngff_cardem,blupdate))</span><br><span> $(eval $(call RULES,ngff_cardem,trace))</span><br><span> $(eval $(call RULES,ngff_cardem,cardem))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-fw-clean: fw-simtrace-dfu-clean fw-simtrace-trace-clean fw-simtrace-cardem-clean fw-qmod-dfu-clean fw-qmod-cardem-clean</span><br><span style="color: hsl(0, 100%, 40%);">-fw: fw-simtrace-dfu fw-simtrace-trace fw-simtrace-cardem fw-qmod-dfu fw-qmod-cardem fw-ngff_cardem-dfu fw-ngff_cardem-trace fw-ngff_cardem-cardem</span><br><span style="color: hsl(120, 100%, 40%);">+fw-clean: fw-simtrace-dfu-clean fw-simtrace-blupdate-clean fw-simtrace-trace-clean fw-simtrace-cardem-clean \</span><br><span style="color: hsl(120, 100%, 40%);">+   fw-qmod-dfu-clean fw-qmod-blupdate-clean fw-qmod-cardem-clean \</span><br><span style="color: hsl(120, 100%, 40%);">+       fw-ngff_cardem-dfu-clean fw-ngff_cardem-blupdate-clean fw-ngff_cardem-trace-clean fw-ngff_cardem-cardem-clean</span><br><span style="color: hsl(120, 100%, 40%);">+fw: fw-simtrace-dfu fw-simtrace-blupdate fw-simtrace-trace fw-simtrace-cardem \</span><br><span style="color: hsl(120, 100%, 40%);">+        fw-qmod-dfu fw-qmod-blupdate fw-qmod-cardem \</span><br><span style="color: hsl(120, 100%, 40%);">+ fw-ngff_cardem-dfu fw-ngff_cardem-blupdate fw-ngff_cardem-trace fw-ngff_cardem-cardem</span><br><span> </span><br><span> utils:</span><br><span>  (cd host && \</span><br><span>diff --git a/firmware/Makefile b/firmware/Makefile</span><br><span>index bfe2c9d..810c7f3 100644</span><br><span>--- a/firmware/Makefile</span><br><span>+++ b/firmware/Makefile</span><br><span>@@ -245,12 +245,13 @@</span><br><span> define RULES</span><br><span> C_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(C_OBJECTS))</span><br><span> ASM_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(ASM_OBJECTS))</span><br><span style="color: hsl(120, 100%, 40%);">+EXTRA_OBJECTS_$(1) = $(addprefix $(OBJ)/$(1)_, $(EXTRA_OBJECTS))</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1))</span><br><span style="color: hsl(0, 100%, 40%);">-   $(SILENT)$(CC) $(CFLAGS) $(LDFLAGS) $(LD_OPTIONAL) -T"libboard/common/resources/$(CHIP)/$$@.ld" -Wl,-Map,$(OUTPUT)-$$@.map -o $(OUTPUT)-$$@.elf $$^ $(LIBS)</span><br><span style="color: hsl(0, 100%, 40%);">-   $(SILENT)$(NM) $(OUTPUT)-$$@.elf >$(OUTPUT)-$$@.elf.txt</span><br><span style="color: hsl(0, 100%, 40%);">-      $(SILENT)$(OBJCOPY) -O binary $(OUTPUT)-$$@.elf $(OUTPUT)-$$@.bin</span><br><span style="color: hsl(0, 100%, 40%);">-       $(SILENT)$(SIZE) $$^ $(OUTPUT)-$$@.elf</span><br><span style="color: hsl(120, 100%, 40%);">+build_$(1): $$(ASM_OBJECTS_$(1)) $$(C_OBJECTS_$(1)) $$(EXTRA_OBJECTS_$(1))</span><br><span style="color: hsl(120, 100%, 40%);">+    $(SILENT)$(CC) $(CFLAGS) $(LDFLAGS) $(LD_OPTIONAL) -T"libboard/common/resources/$(CHIP)/$(1).ld" -Wl,-Map,$(OUTPUT)-$(1).map -o $(OUTPUT)-$(1).elf $$^ $(LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+      $(SILENT)$(NM) $(OUTPUT)-$(1).elf >$(OUTPUT)-$(1).elf.txt</span><br><span style="color: hsl(120, 100%, 40%);">+  $(SILENT)$(OBJCOPY) -O binary $(OUTPUT)-$(1).elf $(OUTPUT)-$(1).bin</span><br><span style="color: hsl(120, 100%, 40%);">+   $(SILENT)$(SIZE) $$^ $(OUTPUT)-$(1).elf</span><br><span> </span><br><span> $$(C_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.c Makefile $(OBJ) $(BIN)</span><br><span>       @echo [COMPILING $$<]</span><br><span>@@ -258,13 +259,34 @@</span><br><span> </span><br><span> $$(ASM_OBJECTS_$(1)): $(OBJ)/$(1)_%.o: %.S Makefile $(OBJ) $(BIN)</span><br><span>    @echo [ASSEMBLING $$@]</span><br><span style="color: hsl(0, 100%, 40%);">-  $(SILENT)@$(CC) $(ASFLAGS) -DENVIRONMENT_$(1) -DENVIRONMENT=\"$(1)\" -c -o $$@ $$<</span><br><span style="color: hsl(120, 100%, 40%);">+       $(SILENT)$(CC) $(ASFLAGS) -DENVIRONMENT_$(1) -DENVIRONMENT=\"$(1)\" -c -o $$@ $$<</span><br><span> </span><br><span> debug_$(1): $(1)</span><br><span>       $(GDB) -x "$(BOARD_LIB)/resources/gcc/$(BOARD)_$(1).gdb" -ex "reset" -readnow -se $(OUTPUT)-$(1).elf</span><br><span> endef</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-$(foreach MEMORY, $(MEMORIES), $(eval $(call RULES,$(MEMORY))))</span><br><span style="color: hsl(120, 100%, 40%);">+ALL_MEMORIES = dfu flash ram</span><br><span style="color: hsl(120, 100%, 40%);">+$(foreach MEMORY, $(ALL_MEMORIES), $(eval $(call RULES,$(MEMORY))))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# files with those names do exist..</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: ram</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: dfu</span><br><span style="color: hsl(120, 100%, 40%);">+.PHONY: flash</span><br><span style="color: hsl(120, 100%, 40%);">+ram: build_ram</span><br><span style="color: hsl(120, 100%, 40%);">+dfu: build_dfu</span><br><span style="color: hsl(120, 100%, 40%);">+ifeq ($(APP), blupdate)</span><br><span style="color: hsl(120, 100%, 40%);">+      $(info updating updater section with padded bootloader file..)</span><br><span style="color: hsl(120, 100%, 40%);">+        $(SILENT)dd if=/dev/zero bs=16384 count=1 of=$(BIN)/$(BOARD)-dfu-flash-padded.bin</span><br><span style="color: hsl(120, 100%, 40%);">+     $(SILENT)dd if=$(BIN)/$(BOARD)-dfu-flash.bin conv=notrunc of=$(BIN)/$(BOARD)-dfu-flash-padded.bin</span><br><span style="color: hsl(120, 100%, 40%);">+     $(SILENT)$(OBJCOPY) --update-section .blupdate=bin/$(BOARD)-dfu-flash-padded.bin bin/$(BOARD)-blupdate-dfu.elf</span><br><span style="color: hsl(120, 100%, 40%);">+        $(SILENT)$(OBJCOPY) -O binary bin/$(BOARD)-blupdate-dfu.elf bin/$(BOARD)-blupdate-dfu.bin</span><br><span style="color: hsl(120, 100%, 40%);">+endif</span><br><span style="color: hsl(120, 100%, 40%);">+flash: build_flash</span><br><span style="color: hsl(120, 100%, 40%);">+#alternate way of embedding: obj file</span><br><span style="color: hsl(120, 100%, 40%);">+#ifeq ($(APP), dfu)</span><br><span style="color: hsl(120, 100%, 40%);">+#     $(info bootloader bin file to obj..)</span><br><span style="color: hsl(120, 100%, 40%);">+# $(SILENT)$(OBJCOPY) --rename-section .data=.fwupdate -I binary -O elf32-littlearm bin/$(BOARD)-dfu-flash.bin $(OBJ)/flash_fwupdate.o</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> program:</span><br><span>         openocd -f openocd/openocd.cfg -c "init" -c "halt" -c "flash write_bank 0 ./bin/project-flash.bin 0" -c "reset" -c "shutdown"</span><br><span>diff --git a/firmware/apps/blupdate/Makefile b/firmware/apps/blupdate/Makefile</span><br><span>new file mode 100644</span><br><span>index 0000000..4f1d377</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/blupdate/Makefile</span><br><span>@@ -0,0 +1,12 @@</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+C_FILES += $(C_LIBUSB_DFU)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Trace level used for compilation</span><br><span style="color: hsl(120, 100%, 40%);">+# (can be overridden by adding TRACE_LEVEL=#number to the command-line)</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_DEBUG      5</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_INFO       4</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_WARNING    3</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_ERROR      2</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_FATAL      1</span><br><span style="color: hsl(120, 100%, 40%);">+# TRACE_LEVEL_NO_TRACE   0</span><br><span style="color: hsl(120, 100%, 40%);">+TRACE_LEVEL ?= 3</span><br><span>diff --git a/firmware/apps/blupdate/main.c b/firmware/apps/blupdate/main.c</span><br><span>new file mode 100644</span><br><span>index 0000000..330d040</span><br><span>--- /dev/null</span><br><span>+++ b/firmware/apps/blupdate/main.c</span><br><span>@@ -0,0 +1,134 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* SIMtrace 2 firmware USB DFU bootloader</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2015-2017 by Harald Welte <hwelte@hmw-consulting.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2018-2019 by sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or</span><br><span style="color: hsl(120, 100%, 40%);">+ * modify it under the terms of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * as published by the Free Software Foundation; either version 2</span><br><span style="color: hsl(120, 100%, 40%);">+ * of the License, or (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program; if not, write to the Free Software</span><br><span style="color: hsl(120, 100%, 40%);">+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+#include "board.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "core_cm3.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "flashd.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "utils.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "usb/device/dfu/dfu.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "usb/common/dfu/usb_dfu.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "manifest.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "USBD_HAL.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/timer.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* actual section content must be replaced with the padded bootloader by running objcopy! */</span><br><span style="color: hsl(120, 100%, 40%);">+const uint32_t bl_update_data[BOARD_DFU_BOOT_SIZE / sizeof(uint32_t)] __attribute__((section(".fwupdate"))) = { 0xFF };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+unsigned int g_unique_id[4];</span><br><span style="color: hsl(120, 100%, 40%);">+/* remember if the watchdog has been configured in the main loop so we can kick it in the ISR */</span><br><span style="color: hsl(120, 100%, 40%);">+static bool watchdog_configured = false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern uint32_t _end;</span><br><span style="color: hsl(120, 100%, 40%);">+extern uint32_t _srelocate;</span><br><span style="color: hsl(120, 100%, 40%);">+extern uint32_t _etext;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void DFURT_SwitchToDFU(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+void USBDFU_Runtime_RequestHandler(const USBGenericRequest *request)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+int USBDFU_handle_dnload(uint8_t altif, unsigned int offset, uint8_t *data, unsigned int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+int USBDFU_handle_upload(uint8_t altif, unsigned int offset, uint8_t *data, unsigned int req_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+int USBDFU_OverrideEnterDFU(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+__attribute__((section(".ramfunc"), noinline)) static uint32_t flash_wait_ready()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        Efc *efc = EFC;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t dwStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  do {</span><br><span style="color: hsl(120, 100%, 40%);">+          dwStatus = efc->EEFC_FSR;</span><br><span style="color: hsl(120, 100%, 40%);">+  } while ((dwStatus & EEFC_FSR_FRDY) != EEFC_FSR_FRDY);</span><br><span style="color: hsl(120, 100%, 40%);">+    return (dwStatus & (EEFC_FSR_FLOCKE | EEFC_FSR_FCMDE));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+__attribute__((section(".ramfunc"), noinline)) static void flash_cmd(uint32_t dwCommand, uint32_t dwArgument)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  Efc *efc = EFC;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint32_t dwStatus;</span><br><span style="color: hsl(120, 100%, 40%);">+    efc->EEFC_FCR = EEFC_FCR_FKEY(0x5A) | EEFC_FCR_FARG(dwArgument) | EEFC_FCR_FCMD(dwCommand);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+__attribute__((section(".ramfunc"), noinline, noreturn)) static void erase_first_app_sector()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       /* page 64 */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t first_app_page = (BOARD_DFU_BOOT_SIZE / IFLASH_PAGE_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t *first_app_address = (uint32_t *)(IFLASH_ADDR + first_app_page * IFLASH_PAGE_SIZE + 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if 1</span><br><span style="color: hsl(120, 100%, 40%);">+     /* overwrite first app sector so we don't keep booting this */</span><br><span style="color: hsl(120, 100%, 40%);">+    for (int i = 0; i < IFLASH_PAGE_SIZE / 4; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+             first_app_address[i] = 0xffffffff;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  flash_cmd(EFC_FCMD_EWP, first_app_page);</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+       /* why does erasing the whole flash with a protected bootloader not work at all? */</span><br><span style="color: hsl(120, 100%, 40%);">+   flash_cmd(EFC_FCMD_EA, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+    flash_wait_ready();</span><br><span style="color: hsl(120, 100%, 40%);">+   for (;;)</span><br><span style="color: hsl(120, 100%, 40%);">+              NVIC_SystemReset();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_USB_ITER BOARD_MCK / 72 // This should be around a second</span><br><span style="color: hsl(120, 100%, 40%);">+extern int main(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t isUsbConnected = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint32_t reset_cause = (RSTC->RSTC_SR & RSTC_SR_RSTTYP_Msk) >> RSTC_SR_RSTTYP_Pos;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Enable watchdog for 2000ms, with no window */</span><br><span style="color: hsl(120, 100%, 40%);">+      WDT_Enable(WDT, WDT_MR_WDRSTEN | WDT_MR_WDDBGHLT | WDT_MR_WDIDLEHLT | (WDT_GetPeriod(2000) << 16) |</span><br><span style="color: hsl(120, 100%, 40%);">+                             WDT_GetPeriod(2000));</span><br><span style="color: hsl(120, 100%, 40%);">+ watchdog_configured = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ EEFC_ReadUniqueID(g_unique_id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("\n\r\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("bootloader updater %s for board %s\n\r"</span><br><span style="color: hsl(120, 100%, 40%);">+            "(C) 2010-2017 by Harald Welte, 2018-2019 by Kevin Redon\n\r",</span><br><span style="color: hsl(120, 100%, 40%);">+              manifest_revision, manifest_board);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* clear g_dfu on power-up reset */</span><br><span style="color: hsl(120, 100%, 40%);">+   memset(g_dfu, 0, sizeof(*g_dfu));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   TRACE_INFO("USB init...\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Signal USB reset by disabling the pull-up on USB D+ for at least 10 ms */</span><br><span style="color: hsl(120, 100%, 40%);">+  USBD_Disconnect();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Initialize the flash to be able to write it, using the IAP ROM code */</span><br><span style="color: hsl(120, 100%, 40%);">+     FLASHD_Initialize(BOARD_MCK, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    __disable_irq();</span><br><span style="color: hsl(120, 100%, 40%);">+      FLASHD_Unlock(IFLASH_ADDR, IFLASH_ADDR + IFLASH_SIZE - 1, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+      FLASHD_Write(IFLASH_ADDR, bl_update_data, BOARD_DFU_BOOT_SIZE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     erase_first_app_sector();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/firmware/libboard/common/resources/sam3s4/dfu.ld b/firmware/libboard/common/resources/sam3s4/dfu.ld</span><br><span>index db747fa..7d896c6 100644</span><br><span>--- a/firmware/libboard/common/resources/sam3s4/dfu.ld</span><br><span>+++ b/firmware/libboard/common/resources/sam3s4/dfu.ld</span><br><span>@@ -101,6 +101,14 @@</span><br><span>         *(.ARM.exidx)</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    .blupdate :</span><br><span style="color: hsl(120, 100%, 40%);">+    {</span><br><span style="color: hsl(120, 100%, 40%);">+        . = ALIGN(4);</span><br><span style="color: hsl(120, 100%, 40%);">+        _blupdate_start = .;</span><br><span style="color: hsl(120, 100%, 40%);">+        KEEP(*(.fwupdate .fwupdate.*));</span><br><span style="color: hsl(120, 100%, 40%);">+        _blupdate_end = .;</span><br><span style="color: hsl(120, 100%, 40%);">+    } > rom</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     . = ALIGN(4); </span><br><span>     _etext = .;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/simtrace2/+/26026">change 26026</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/simtrace2/+/26026"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I53dea57bba790a2ab3245d9483e0ff1c8d19d5e3 </div>
<div style="display:none"> Gerrit-Change-Number: 26026 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>