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

  • Did you mean: "examples/thread/dfu/bootloader/pca10056/blank/armgcc"?

    Or have you created your own Thread DFU bootloader project with support for the nRF52840 Dongle? Have you connected a J-Link debugger to the dongle and erased the bootloader that comes with it?

  • Yes, I adapted the bootloader for the dongle editing the makefile

    PROJECT_NAME     := thread_secure_dfu_bootloader_secure_dfu_blank_pca10059
    CFLAGS += -DBOARD_PCA10059
    ASMFLAGS += -DBOARD_PCA10059

    and I usually do an erase operation before flashing SD, BL and APP (I have a dongle with the jlink connector soldered)

    nrfjprog -f nrf52 --eraseall

    I can't get if the problem

    • If I generate the DFU package with --sd-req 0x00 the DFU image is downloaded and restarted correctly.
    • If I generate the DFU package with --sd-req 0xCA the DFU image is downloaded correctly by application but then it is not restarted (by bootloader I guess).

    comes from the bootloader that is not compatible with SD or from my DFU image that is a dummy blinky example (that does not include/use SD)

  • 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

Related