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

nRF91 firmware upgrade over BLE

Hi,

I am trying to do firmware upgrade of nRF91 over BLE using nRF52 on the nRF91-DK or Thingy91 board. They both have nRF91 and nRF52840 chips on them which are connected. 

As I understand from the documentation, at the moment, on Thingy91 board I can connect to the USB (which is connected to the nRF52) and upgrade the firmware on nRF91. This is also providing two UART ports, and the BLE UART service can be additionally enabled. Like in example: https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/applications/connectivity_bridge/README.html

On the nRF91 side, nRF91 application would have to implement the UART management transport so it can be upgraded over UART and the nRF5x act as a bridge from BLE to UART
https://docs.zephyrproject.org/1.13.0/subsystems/mgmt.html

Is this a good way to go and do you have some experience doing this?

At the moment I have a bit different approach. I started with nRF52 app_ble_uart example and created the "UART bridge" between BLE device and nRF91. Next is to have nRF91 able to receive upgrade and probably write some application for PC/mobile deice to push the upgrade over UART. 

Let me know your thoughts and if you already have done something like this. 

Best regards,
Vojislav.

Parents
  • If I understand you correctly, you want to transfer a firmware image in the following manner: [ BLE Device ] →BLE→ [ Thingy/91 DK (nRF52→UART→nRF91) ].

    Regarding the transfer from the nRF52840 to the nRF9160, it can be achieved by following the steps in my last comment (at the moment) in this thread. In that thread, the roles are switched (Serial DFU from nRF9160 to nRF52), but the process should be the same.

    I need some more time to answer your question fully but I will try to get back to you within this week.

    Best regards,

    Simon

  • Hi Simon,

    You understood well what I want to do. 
    In the meantime, I will investigate more what you wrote in the thread you mentioned. 

    Ad this moment do you think it is better to go with nRF5 SDK or NCS/Zephyr on the nRF52 chip?
    An additional request from my side is if you are trying something on hardware please do it on nRF91-DK as I only have that board with me at the moment due to current the situation in the world.

    Thank you and looking forward to your response.  

    Best regards,
    Vojislav

  • Ok, Simon, I am also looking into it. I forgot to write that nrf9160_pca10090.conf file for MCUBoot looks like this:

    # Disable Zephyr console
    CONFIG_CONSOLE=n
    CONFIG_CONSOLE_HANDLER=n
    CONFIG_UART_CONSOLE=n
    
    # MCUBoot settings
    CONFIG_BOOT_MAX_IMG_SECTORS=256
    
    # MCUboot serial recovery
    CONFIG_MCUBOOT_SERIAL=y
    CONFIG_BOOT_SERIAL_DETECT_PORT="GPIO_0"
    CONFIG_BOOT_SERIAL_DETECT_PIN=6
    CONFIG_BOOT_SERIAL_DETECT_PIN_VAL=0


    To configure Button 1 on the nRF91-DK as the trigger for serial recovery mode.

  • Hi Simon,

    I have managed to upload the new app image over UART to the nRF91-DK using mcumgr and configuration I explained in the previous post.
    The command for upload is:

    $ mcumgr --conntype=serial --connstring=/dev/ttyACM0 image upload app_update.bin 
     223.01 KiB / 223.01 KiB [==================================================] 100.00% 3.34 KiB/s 1m6s
    Done
    


    My question still stands, 
    Where is defined which UART pins MCUboot will use for SMP?
    Does it take from nrf91 board device tree file? and will overlay file in the application folder affect the change of pins/port?

    Best regards,
    Vojislav.

  • Vojislav said:
    Where is defined which UART pins MCUboot will use for SMP?
    Does it take from nrf91 board device tree file? and will overlay file in the application folder affect the change of pins/port?

    If you look at the line uart_dev = device_get_binding(CONFIG_RECOVERY_UART_DEV_NAME) in serial_adapter.c, you can see that it will use the UART instance CONFIG_RECOVERY_UART_DEV_NAME.

    CONFIG_RECOVERY_UART_DEV_NAME is by default equal to "UART_0".

    If you build the sample in ncs\bootloader\mcuboot\boot\zephyr using e.g. nrf9160_pca10090, and you haven't added an nrf9160_pca10090.overlay file inside ncs\bootloader\mcuboot\boot\zephyr, then the default pin configurations in zephyr/boards/arm/nrf9160_pca10090/nrf9160_pca10090_common.dts will be used in MCUboot for the transmission of the mcumgr SMP data.

    Since UART_0 is routed to the USB port through the interface MCU, you can use the computer to perform a DFU

    However, you can change the UART instance as well as the UART configurations, by setting CONFIG_RECOVERY_UART_DEV_NAME to something else in prj.conf and creating an overlay file in ncs\bootloader\mcuboot\boot\zephyr.

    Best regards,

    Simon

  • Hi Simon, 

    Thanks for the answer, this is good information and I will look more into this. On the other hand, I took a different approach. I saw that in the zephyr/boards/arm/nrf9160_pca10090/nrf9160_pca10090_common.dts file there is configuration for the  zephyr,uart-mcumgr = &uart0; so I just changed uart pins for UART0 in that file. Now I want to add an overlay file to my application and that way set new pins for uart0 and mcumgr. 

    Do you think this is a good approach? This seems better because everything I change stays in the application folder. 

    Also at some point, I will add my own board...

    Best regards,
    Vojislav.

  • Hi Simon, 

    Currently, I am stuck at the last step. I have done everything on the BLE side, and I have mcumgr communication up to nrf91. Currently, the problem is that I am using peripheral_uart example because I will have nRF52832 instead of nRF52840, so no USB, and it is not sending messages from nRF91 to the NUS because I suppose it is waiting for the end character "\n". Do you have any idea how to resolve this? 

    Best regards,
    Vojislav.

Reply
  • Hi Simon, 

    Currently, I am stuck at the last step. I have done everything on the BLE side, and I have mcumgr communication up to nrf91. Currently, the problem is that I am using peripheral_uart example because I will have nRF52832 instead of nRF52840, so no USB, and it is not sending messages from nRF91 to the NUS because I suppose it is waiting for the end character "\n". Do you have any idea how to resolve this? 

    Best regards,
    Vojislav.

Children
No Data
Related