This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

OTA Thread DFU: Merge SDK example with custom application

Hi all!

I'm able to fully test the SDK example https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_tz_v3.2.0%2Fthread_example_dfu.html and it works pretty well.

Now, the next step is the integration of this OTA DFU over Thread example in my custom application (that already exploits Thread and MQTT-SN protocol).

I haven't found a tutorial that explains step-by-step this kind of operation. 

Basically I need some help to integrate the DFU client with the user application. I think the key point is the IoT SDK CoAP library that implement a DFU algorithm that should run concurrently to the user application, but I'm a bit confused about merging process.

Thanks in advance,

Alessio

Parents
  • I think I need some clarifications about flashing different FW components.

    In order to have the OTA DFU example working, I have to flash:

    • mbr_nrf52_2.4.1_mbr.hex (MBR)
    • nrf52840_xxaa_mbr.hex (BOOTLOADER)
    • dfu_client.hex (EXAMPLE HEX)

    In order to have my application working, I have to flash:

    • s140_nrf52_7.0.1_softdevice.hex (SOFTDEVICE)
    • my_app.hex (APPLICATION HEX)

    At the moment, I have merged the two application codes and, let's say, I have the  

    my_app_DFU.hex

    I have tried to flash all the components:

    1. mbr_nrf52_2.4.1_mbr.hex (MBR)
    2. nrf52840_xxaa_mbr (BOOTLOADER)
    3. s140_nrf52_7.0.1_softdevice.hex (SOFTDEVICE)
    4. my_app_DFU.hex (APPLICATION+DFU HEX)

    I received back this when I flash the SD

    and this when I flash the application

    Moreover, the dongle is stucked with the green led lit up.

    Maybe I am supposed to do some mergehex operations?

    Thanks,

    Alessio 

     

  • Hi,

    You do not need to flash both the MBR and Softdevice HEX-files. The MBR is merged into the softdevice, and you will find that if you do a compare, the first page (0x0 - 0x1000) will be identical.

    The Bootloader needs information about the application in order to verify that it is a valid application. This means that you either needs to generate the settings using nrfutil, or create a DFU packet of the application and "flash" it using the DFU process. 

    I recommend that you follow the instructions in the Testing section of the Thread Secure OTA DFU Example, especially steps 3.c-d.

    Best regards,
    Jørgen 

  • Hi all!

    I'm trying to develop the dual bank approach exploiting external QSPI flash memory (GD25Q16, the one that is in the Adafruit nrf52840 board).

    I merged the QSPI drivers with the DFU application but it is not working as usual.

    First, I modified the nrf_dfu_cache_prepare() function setting the bank1 address as 0x00 (I want to start store the FW image at the beginning of the QSPI flash memory)

    Then, I modified the nrf_dfu_flash_init(), nrf_dfu_flash_store() and nrf_dfu_flash_erase() functions to exploit QSPI drivers instead of fstorage ones.

    If I start a DFU process, there are several problems:

    • even if the cache address is 0x00, the write address still remains 0xC5000 (the end of the current FW)
    • during erase/write procedures the "queue usage" parameter increases. That's because I don't know how to use this callback function (QSPI drivers don't request a callback function, fstorage ones do)

    I highlighted the issues explained above in the debug log I can see from my application.

    The process stucks with the error 

    Validate trigger: DFU already in progress (s:DFU_DOWNLOAD_FIRMWARE)

    after the first write operation.

    Can anyone help me please?

    May I have to edit also the bootloader? I thought that only application works in this first DFU part (FW download) and that the BL comes in only after the postvalidation (at the end of the FW downloading part).

    Can I have a clarification about that?

    Thanks,
    Alessio

  • ##### UPDATE ##### 

    Hi all,

    finally I completed the merge of the DFU client in my custom application.

    I added the feature of data storage (new FW package) in the external flash memory that is present in the Adafruit nrf52840 board (gd25q16).

    Now, I have to deal with the bootloader part.

    As I got so far, once the FW download ends and the board is rebooted, the bootloader is in charge to copy the new FW data from bank1 to bank0 and start the new FW (Am I right?).

    Any suggestions on this? Where do I start to complete this task?

    Thanks,

    Alessio

  • Hi all,

    I'm facing the bootloader modifications.

    I can't get if I have to update bootloader to let him use SD or not.

    In the application side, I updated the code to work with the SD (because my native application had already SD feature) but with the bootloader I have a lot of problems.

    I'm using:

    examples\thread\dfu\bootloader\pca10056\blank\ses

    Does the bootloader have to exploit SD to read/write flash (fstorage)?

    I want to read settings from my main flash and DFU chunks from my external QSPI flash memory

    Thanks,

    AS

  • I have some problems debugging the bootloader.

    I know that I have to use "target" -> "attach debugger" to debug the bootloader when the new application has to be validated and activated.

    After flashing components (BL + SD + APP), the app is running and if I attach the debugger from bootloader project I have this behaviour:

    Obviusly, the app stops running and I can't debug the bootloader project.

    How am I supposed to use "attach debugger" feature?

    Thanks,

    Alessio

  • Hi all,

    I managed all the error in the bootloader.

    Now, I can load from QSPI the fw in the flash and I can pass all hash&crc checks.

    The bootloader can run smootlhy until the last step ( app_start(vector_table_addr); ).

    I attach a screenshot from debugger: 

    • the bank0 information are correct 
    • the FW at 0x27000 (just after SD) is correct
    • the bootloader can run until last step

    Now, I'd like to know why the hell the board DOESN'T START THE APP.

    The board just stucks in the BL!!

    Can someone support me please?

    Thanks

Reply
  • Hi all,

    I managed all the error in the bootloader.

    Now, I can load from QSPI the fw in the flash and I can pass all hash&crc checks.

    The bootloader can run smootlhy until the last step ( app_start(vector_table_addr); ).

    I attach a screenshot from debugger: 

    • the bank0 information are correct 
    • the FW at 0x27000 (just after SD) is correct
    • the bootloader can run until last step

    Now, I'd like to know why the hell the board DOESN'T START THE APP.

    The board just stucks in the BL!!

    Can someone support me please?

    Thanks

Children
Related