<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12515">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">use reserved bootloader get application start<br><br>the reserved bootloader size is set in the NVM user configuration<br>and allows to know the application start address (e.g. after the<br>bootloader)<br><br>Change-Id: I9dda27d6401caabb4a6470aa3fe9691f63097136<br>---<br>M usb/class/dfu/device/dfudf.c<br>M usb/class/dfu/device/dfudf.h<br>M usb_start.c<br>3 files changed, 18 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-asf4-dfu refs/changes/15/12515/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/usb/class/dfu/device/dfudf.c b/usb/class/dfu/device/dfudf.c</span><br><span>index 41e235b..8232979 100644</span><br><span>--- a/usb/class/dfu/device/dfudf.c</span><br><span>+++ b/usb/class/dfu/device/dfudf.c</span><br><span>@@ -44,7 +44,7 @@</span><br><span> </span><br><span> uint8_t dfu_download_data[512];</span><br><span> uint16_t dfu_download_length = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-size_t dfu_download_progress = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+size_t dfu_download_offset = 0;</span><br><span> bool dfu_manifestation_complete = false;</span><br><span> </span><br><span> /**</span><br><span>@@ -215,7 +215,7 @@</span><br><span>                to_return = usbdc_xfer(ep, NULL, 0, false); // send ACK</span><br><span>              break;</span><br><span>       case USB_DFU_ABORT: // abort current operation</span><br><span style="color: hsl(0, 100%, 40%);">-          dfu_download_progress = 0; // reset download progress</span><br><span style="color: hsl(120, 100%, 40%);">+         dfu_download_offset = 0; // reset download progress</span><br><span>          dfu_state = USB_DFU_STATE_DFU_IDLE; // put back in idle state (nothing else to do)</span><br><span>           to_return = usbdc_xfer(ep, NULL, 0, false); // send ACK</span><br><span>              break;</span><br><span>@@ -246,7 +246,7 @@</span><br><span>                         if (USB_SETUP_STAGE == stage) { // there will be data to be flash</span><br><span>                            to_return = usbdc_xfer(ep, dfu_download_data, req->wLength, false); // send ack to the setup request to get the data</span><br><span>                      } else { // now there is data to be flashed</span><br><span style="color: hsl(0, 100%, 40%);">-                             dfu_download_progress = req->wValue * sizeof(dfu_download_data); // remember which block to flash</span><br><span style="color: hsl(120, 100%, 40%);">+                          dfu_download_offset = req->wValue * sizeof(dfu_download_data); // remember which block to flash</span><br><span>                           dfu_download_length = req->wLength; // remember the data size to be flash</span><br><span>                                 dfu_state = USB_DFU_STATE_DFU_DNLOAD_SYNC; // go to sync state</span><br><span>                               to_return = usbdc_xfer(ep, NULL, 0, false); // ACK the data</span><br><span>diff --git a/usb/class/dfu/device/dfudf.h b/usb/class/dfu/device/dfudf.h</span><br><span>index a19b569..cee5845 100644</span><br><span>--- a/usb/class/dfu/device/dfudf.h</span><br><span>+++ b/usb/class/dfu/device/dfudf.h</span><br><span>@@ -49,8 +49,8 @@</span><br><span> extern uint8_t dfu_download_data[512];</span><br><span> /** Length of downloaded data in bytes */</span><br><span> extern uint16_t dfu_download_length;</span><br><span style="color: hsl(0, 100%, 40%);">-/** Progress of the already downloaded data in bytes */</span><br><span style="color: hsl(0, 100%, 40%);">-extern size_t dfu_download_progress;</span><br><span style="color: hsl(120, 100%, 40%);">+/** Offset of where the downloaded data should be flashed in bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+extern size_t dfu_download_offset;</span><br><span> /** If manifestation (firmware flash and check) is complete */</span><br><span> extern bool dfu_manifestation_complete;</span><br><span> </span><br><span>diff --git a/usb_start.c b/usb_start.c</span><br><span>index 0ce8aba..7503094 100644</span><br><span>--- a/usb_start.c</span><br><span>+++ b/usb_start.c</span><br><span>@@ -45,14 +45,6 @@</span><br><span> /** Ctrl endpoint buffer */</span><br><span> static uint8_t ctrl_buffer[64];</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/** Application address in the flash</span><br><span style="color: hsl(0, 100%, 40%);">- (</span><br><span style="color: hsl(0, 100%, 40%);">- *  It comes after the bootloader.</span><br><span style="color: hsl(0, 100%, 40%);">- *  The NVMCTRL allows to reserve space at the beginning of the flash for the bootloader, but only in multiples of 8192 bytes.</span><br><span style="color: hsl(0, 100%, 40%);">- *  The binary just with the USB stack already uses 8 kB, we reserve 16 kB for the bootloader (giving use a bit of margin for future fixes).</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-#define APPLICATION_ADDR (8192*2)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /**</span><br><span>  * \brief USB DFU Init</span><br><span>  */</span><br><span>@@ -89,12 +81,24 @@</span><br><span> {</span><br><span>      while (!dfudf_is_enabled()); // wait for DFU to be installed</span><br><span>         gpio_set_pin_level(LED_SYSTEM, false); // switch LED on to indicate USB DFU stack is ready</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t application_start = hri_nvmctrl_read_STATUS_BOOTPROT_bf(FLASH_0.dev.hw); // read BOOTPROT setting to get the bootloader size</span><br><span style="color: hsl(120, 100%, 40%);">+ ASSERT(application_start <= 15);</span><br><span style="color: hsl(120, 100%, 40%);">+   application_start = (15 - application_start) * 8192; // calculate bootloader size to know where we should write the application firmware</span><br><span style="color: hsl(120, 100%, 40%);">+      while (0 == application_start) { // no space has been reserved for the bootloader</span><br><span style="color: hsl(120, 100%, 40%);">+             // blink the LED to tell the user we don't know where the application starts</span><br><span style="color: hsl(120, 100%, 40%);">+              gpio_set_pin_level(LED_SYSTEM, false);</span><br><span style="color: hsl(120, 100%, 40%);">+                delay_ms(500);</span><br><span style="color: hsl(120, 100%, 40%);">+                gpio_set_pin_level(LED_SYSTEM, true);</span><br><span style="color: hsl(120, 100%, 40%);">+         delay_ms(500);</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  while (true) { // main DFU infinite loop</span><br><span>             // run the second part of the USB DFU state machine handling non-USB aspects</span><br><span>                 if (USB_DFU_STATE_DFU_DNLOAD_SYNC == dfu_state || USB_DFU_STATE_DFU_DNBUSY == dfu_state) { // there is some data to be flashed</span><br><span>                       gpio_set_pin_level(LED_SYSTEM, true); // switch LED off to indicate we are flashing</span><br><span>                  if (dfu_download_length > 0) { // there is some data to be flashed</span><br><span style="color: hsl(0, 100%, 40%);">-                           int32_t rc = flash_write(&FLASH_0, APPLICATION_ADDR + dfu_download_progress, dfu_download_data, dfu_download_length); // write downloaded data chunk to flash</span><br><span style="color: hsl(120, 100%, 40%);">+                             int32_t rc = flash_write(&FLASH_0, application_start + dfu_download_offset, dfu_download_data, dfu_download_length); // write downloaded data chunk to flash</span><br><span>                             if (ERR_NONE == rc) {</span><br><span>                                        dfu_state = USB_DFU_STATE_DFU_DNLOAD_IDLE; // indicate flashing this block has been completed</span><br><span>                                } else { // there has been a programming error</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12515">change 12515</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/12515"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-asf4-dfu </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I9dda27d6401caabb4a6470aa3fe9691f63097136 </div>
<div style="display:none"> Gerrit-Change-Number: 12515 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>