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.

  • 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.

  • I suppose that this tread needs to be changed:

    void ble_write_thread(void)
    {
    	/* Don't go any further until BLE is initailized */
    	k_sem_take(&ble_init_ok, K_FOREVER);
    
    	for (;;) {
    		/* Wait indefinitely for data to be sent over bluetooth */
    		struct uart_data_t *buf = k_fifo_get(&fifo_uart_rx_data,
    						     K_FOREVER);
    
    		if (bt_gatt_nus_send(NULL, buf->data, buf->len)) {
    			printk("Failed to send data over BLE connection\n");
    		}
    
    		k_free(buf);
    
    		if (rx_disabled) {
    			rx_disabled = false;
    			uart_irq_rx_enable(uart);
    		}
    	}
    }

  • What I have tested is that if I remove waiting for '\r' or '\n' or full buffer and send character but character, the mcumgr tool cannot process that (this is not in the code above, but it is in the main.c of peripheral_uart). From what I see in the connectivity_bridge project they are using hardware flow control for understanding when UART write from nrf91 is done, and then send that data over BLE NUS or to the USB. 
    So my question is do you think we can do this in software or is it necessary to do in with CTS and DTS pins like on Thingy91?

    Best regards,
    Vojislav.

  • I am sorry for the delay. I will look into your issue on the next working day (which is Tuesday due to Norwegian holiday on Monday).

    Best regards,

    Simon

Related