Enable mcumgr features on NRF5340 DK board while Bluetooth HCI_USB program is running

Hello community,

I am trying for multiple firmware updates for my NRF5340 DK board. 

What I am doing is I have build and flashed the SMP server sample program found /zephyr/samples/subsys/mgmt/mcumgr/smp_svr

After flashing this application, I can see my board recognised as a ttyACM0 device while I perform ls /dev.

Using the mcumgr tool I am also able to flash the Bluetooth HCI_USB sample program and after confirming the image and resetting the board, the board now acts as a bluetooth controller. I can verify this using the bluetoothctl command.

Now If I want to do a firmware upgrade, I dont have any way in the HCI_USB application to go back to smp server application. How can I perform multiple firmware updates using mcumgr?

Can virtual com port concept be useful here? If yes then I would like to have a detailed tutorial for this .

Parents
  • Hello Utsav,

    In a different DevZone case, I was able to emulate two UART COM on the same USB peripheral simply by setting one more cdc_acm_uart node under the usbd node. 

    		usbd: zephyr_udc0: usbd@40027000 {
    			compatible = "nordic,nrf-usbd";
    			reg = < 0x40027000 0x1000 >;
    			interrupts = < 0x27 0x1 >;
    			num-bidir-endpoints = < 0x1 >;
    			num-in-endpoints = < 0x7 >;
    			num-out-endpoints = < 0x7 >;
    			num-isoin-endpoints = < 0x1 >;
    			num-isoout-endpoints = < 0x1 >;
    			status = "okay";
    			cdc_acm_uart: cdc_acm_uart {
    				compatible = "zephyr,cdc-acm-uart";
    			};
    			cdc_acm_uart0: cdc_acm_uart0 {
    				compatible = "zephyr,cdc-acm-uart";
    				label = "CDC_ACM_0";
    			};

    Once that second virtual COM port is setup, you can select it for MCUmgr by overlaying the chosen property as such:

    /{
    	chosen {
    		zephyr,uart-mcumgr = &new_usb_uart_com;
    	};
    }

    Please note that it is the Christmas - New Year holiday season here. We are thus severely understaffed, and there would be delays in responses. Our apologies for the inconveniences. 

    Hieu

  • Hello   thanks for your response. I understand Christmas season is here and most of  the people would be on vacations. I really appreciate your response. 

    In the Bluetooth HCI_USB project I have done the following changes : 

    I have tried modifying the overlay file and here are the results : 

    The contents of my overlay file are as follows: 

    / {
    chosen {
    zephyr,code-partition = &slot0_partition;
    zephyr,out-usb = &cdc_acm1;
    zephyr,uart-mcumgr = &cdc_acm0;
    };
    };

    &zephyr_udc0 {
    cdc_acm0: cdc_acm0 {
    compatible = "zephyr,cdc-acm-uart";
    };
    cdc_acm1: cdc_acm1 {
    compatible = "zephyr,cdc-acm-uart";
    };
    };

    &uart0 {
    status = "okay";
    };

    The contents of my prj.conf file are as follows:

    CONFIG_STDOUT_CONSOLE=y
    CONFIG_GPIO=y
    CONFIG_SERIAL=y
    CONFIG_UART_INTERRUPT_DRIVEN=y
    CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n

    CONFIG_BT=y
    CONFIG_BT_HCI_RAW=y

    CONFIG_USB_DEVICE_STACK=y
    CONFIG_USB_DEVICE_PID=0x000B
    CONFIG_USB_DEVICE_BLUETOOTH=y
    CONFIG_USB_DEVICE_BLUETOOTH_VS_H4=n

    # Workaround: Unable to allocate command buffer when using K_NO_WAIT since
    # Host number of completed commands does not follow normal flow control.
    CONFIG_BT_BUF_CMD_TX_COUNT=10

    #This flag is enabled to make the mcuboot features for DFU available
    CONFIG_BOOTLOADER_MCUBOOT=y


    #Commands to add composite USB feature to HCI_USB program
    #Composite USB configuration ----------------
    CONFIG_USB_COMPOSITE_DEVICE=y
    #CONFIG_USB_CDC_ACM=y

    # Enable MCUmgr and dependencies.
    CONFIG_NET_BUF=y
    CONFIG_ZCBOR=y
    CONFIG_CRC=y
    CONFIG_MCUMGR=y
    CONFIG_STREAM_FLASH=y
    CONFIG_FLASH_MAP=y

    # Some command handlers require a large stack.
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2304
    CONFIG_MAIN_STACK_SIZE=2048

    # Enable flash operations.
    CONFIG_FLASH=y

    # Required by the `taskstat` command.
    CONFIG_THREAD_MONITOR=y

    # Support for taskstat command
    CONFIG_MCUMGR_GRP_OS_TASKSTAT=y

    # Enable statistics and statistic names.
    CONFIG_STATS=y
    CONFIG_STATS_NAMES=y

    # Enable most core commands.
    CONFIG_FLASH=y
    CONFIG_IMG_MANAGER=y
    CONFIG_MCUMGR_GRP_IMG=y
    CONFIG_MCUMGR_GRP_OS=y
    CONFIG_MCUMGR_GRP_STAT=y

    # Enable logging
    CONFIG_LOG=y
    CONFIG_MCUBOOT_UTIL_LOG_LEVEL_WRN=y

    # Disable debug logging
    CONFIG_LOG_MAX_LEVEL=3

    # Enable USB subsystem
    CONFIG_USB_DEVICE_STACK=y
    CONFIG_SERIAL=y
    CONFIG_UART_LINE_CTRL=y
    CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n
    CONFIG_CONSOLE=y
    # USB backend is serial device
    CONFIG_MCUMGR_TRANSPORT_UART=y
    CONFIG_BASE64=y

    Then I have build the project using the following command : 

    west build -b nrf5340dk_nrf5340_cpuapp --pristine -- -DOVERLAY_CONFIG=overlay-cdc.conf -DDTC_OVERLAY_FILE=nrf5340_cpuapp.overlay -DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"/home/mutsl04176/ncs/v2.4.2/bootloader/mcuboot/root-rsa-2048.pem\"

    After successful build, I flashed the program into the NRF5340 DK board and plugged in the other USB.

    You can see from the screenshot below that I get two virtual ports as ACM0 and ACM1 :

    But at the same time, the board is not visible as a Bluetooth controller under bluetoothctl . Only the default Bluetooth controller (of the laptop) is visible.

    How do I solve this? 

    Any other modifications that needs to be made? If yes then please let me know in which file and what needs to be done. 

    Thanks!

  • I have given the contents of the dts file in the reply above, you can check that

  • I suggest that you loom through that file yourself and look for cdc.
    I hope not only to help you with this specific, but also to help you learn how to debug this kind of issue yourself.

  •   Thank you so much for taking the time to understand my problem. That is really appreciable.

    Looking at the zephyr.dts file present in build/zephyr directory, I could find this code snippet that I have attached. I think this may be how cdc_acm is defined 

    usbd: zephyr_udc0: usbd@36000 {
    				compatible = "nordic,nrf-usbd";
    				reg = < 0x36000 0x1000 >;
    				interrupts = < 0x36 0x1 >;
    				num-bidir-endpoints = < 0x1 >;
    				num-in-endpoints = < 0x7 >;
    				num-out-endpoints = < 0x7 >;
    				num-isoin-endpoints = < 0x1 >;
    				num-isoout-endpoints = < 0x1 >;
    				status = "okay";
    				cdc_acm0: cdc_acm0 {
    					compatible = "zephyr,cdc-acm-uart";
    				};
    				cdc_acm1: cdc_acm1 {
    					compatible = "zephyr,cdc-acm-uart";
    				};
    			};

  • And then we can have a look at where the sample I mentioned sets up cdc_acm:

    zephyr_udc0: &usbd {
    	compatible = "nordic,nrf-usbd";
    	status = "okay";
    
    	cdc_acm_uart: cdc_acm_uart {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    };

    You see how they defined cdc_acm_uart?
    cdc_acm_uart is just the name set in the example. Which name did you give the same type of node in your dts?

  • I'm actually confused now on how to do this. Since I am completely new to this, I actually need some direct hand holding for this. Any chance I can connect with someone directly from the community or with you?

Reply Children
  • I will try to continue to explain a bit further. In your code you got:

    	cdc_acm0: cdc_acm0 {
    		compatible = "zephyr,cdc-acm-uart";
        };

    And the example got:

    	cdc_acm_uart: cdc_acm_uart {
    		compatible = "zephyr,cdc-acm-uart";
    	};

    Your node is named cdc_acm0, and the sample node is named cdc_acm_uart.
    It is the name of the node which you point to in the "chosen" part of the DTS.

    The error message is because you use cdc_acm_uart for your chosen node. But cdc_acm_uart does not exist for your code. Instead the CDC node in your code is named cdc_acm0

    Does that make sense?

  • Yes I now kind of understand what you are saying and I have modified my overlay file accordingly. Please have a look : 

    / {
    	chosen {
    	   zephyr,code-partition = &slot0_partition;
    	   zephyr,out-usb = &cdc_acm1;
    	   zephyr,uart-mcumgr = &cdc_acm0;
    	   zephyr,bt-mon-uart = &cdc_acm1;
    	   zephyr,bt-c2h-uart = &cdc_acm2;
    	   
    	};
     };
    
    &zephyr_udc0 {
    	cdc_acm0: cdc_acm0 {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    	cdc_acm1: cdc_acm1 {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    	cdc_acm2: cdc_acm2 {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    };
    
    &uart0 {
    	status = "okay";
    };

    Now the code compiles successfully and I was able to flash it. But the problem still remains the same. I am not able to see the device as a bluetooth controller. But when I check the device list, I can see the 3 ACM ports that are created. Only the default bluetooth controller of my laptop is visible.

  • Now you got the configuration I was talking about yes.
    Seems like we got another error at our hands since it does not work here.

    I am currently stuck out of office due to a snowstorm, meaning I can not use my linux computer at work. So I will try to find a colleague with Linux who can try to reproduce the issue you have now.

  • I was able to use both HCI and mcumgr work at the same time on the nRF52840DK by configuring the hci_uart sample.

    Here is the result:

    hci_uart_feat_cdc_feat_mcumgr_over_uart.zip

    diff --git a/samples/bluetooth/hci_rpmsg/prj.conf b/samples/bluetooth/hci_rpmsg/prj.conf
    index 755a1f4ac1e..f20005b69bc 100644
    --- a/samples/bluetooth/hci_rpmsg/prj.conf
    +++ b/samples/bluetooth/hci_rpmsg/prj.conf
    @@ -22,3 +22,5 @@ CONFIG_BT_BUF_CMD_TX_COUNT=10
     # CONFIG_BT_BUF_ACL_RX_SIZE=255
     # CONFIG_BT_BUF_ACL_TX_SIZE=251
     # CONFIG_BT_BUF_CMD_TX_SIZE=255
    +#
    +CONFIG_SECURE_BOOT=y
    diff --git a/samples/bluetooth/hci_uart/boards/nrf52840dk_nrf52840.overlay b/samples/bluetooth/hci_uart/boards/nrf52840dk_nrf52840.overlay
    index b3c844493c0..d91fa9bab8a 100644
    --- a/samples/bluetooth/hci_uart/boards/nrf52840dk_nrf52840.overlay
    +++ b/samples/bluetooth/hci_uart/boards/nrf52840dk_nrf52840.overlay
    @@ -1,8 +1,18 @@
     /* SPDX-License-Identifier: Apache-2.0 */
     
    -&uart0 {
    -	compatible = "nordic,nrf-uart";
    -	current-speed = <1000000>;
    -	status = "okay";
    -	hw-flow-control;
    +/ {
    +	chosen {
    +		zephyr,uart-mcumgr = &cdc_acm_uart1;
    +		zephyr,bt-mon-uart = &cdc_acm_uart0;
    +		zephyr,bt-c2h-uart = &cdc_acm_uart0;
    +	};
    +};
    +
    +&zephyr_udc0 {
    +	cdc_acm_uart0: cdc_acm_uart0 {
    +		compatible = "zephyr,cdc-acm-uart";
    +	};
    +	cdc_acm_uart1: cdc_acm_uart1 {
    +		compatible = "zephyr,cdc-acm-uart";
    +	};
     };
    diff --git a/samples/bluetooth/hci_uart/prj.conf b/samples/bluetooth/hci_uart/prj.conf
    index bdc73dd68e2..0cdf9e036b4 100644
    --- a/samples/bluetooth/hci_uart/prj.conf
    +++ b/samples/bluetooth/hci_uart/prj.conf
    @@ -1,6 +1,4 @@
    -CONFIG_CONSOLE=n
    -CONFIG_STDOUT_CONSOLE=n
    -CONFIG_UART_CONSOLE=n
    +CONFIG_LOG=y
     CONFIG_GPIO=y
     CONFIG_SERIAL=y
     CONFIG_UART_INTERRUPT_DRIVEN=y
    @@ -21,3 +19,25 @@ CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512
     # Workaround: Unable to allocate command buffer when using K_NO_WAIT since
     # Host number of completed commands does not follow normal flow control.
     CONFIG_BT_BUF_CMD_TX_COUNT=10
    +
    +CONFIG_BOOTLOADER_MCUBOOT=y
    +CONFIG_MCUMGR=y
    +CONFIG_MCUMGR_TRANSPORT_UART=y
    +CONFIG_MCUMGR_GRP_IMG=y
    +
    +# CONFIG_MCUMGR_TRANSPORT_UART dependencies
    +CONFIG_BASE64=y
    +
    +# CONFIG_MCUMGR_GRP_IMG dependencies
    +CONFIG_FLASH=y
    +CONFIG_IMG_MANAGER=y
    +
    +# CONFIG_IMG_MANAGER dependencies
    +CONFIG_STREAM_FLASH=y
    +
    +# CONFIG_MCUMGR dependencies
    +CONFIG_NET_BUF=y
    +CONFIG_ZCBOR=y
    +
    +# Required for CONFIG_IMG_MANAGER
    +CONFIG_FLASH_MAP=y
    diff --git a/samples/hello_world/CMakeLists.txt b/samples/hello_world/CMakeLists.txt
    index ecb7d24bb8f..c296e090cb7 100644
    --- a/samples/hello_world/CMakeLists.txt
    +++ b/samples/hello_world/CMakeLists.txt
    @@ -2,7 +2,15 @@
     
     cmake_minimum_required(VERSION 3.20.0)
     
    +set(CONFIG_SERIAL n)
    +set(mcuboot_CONFIG_SERIAL n)
    +set(hci_rpmsg_CONFIG_SERIAL n)
    +set(hci_rpmsg_b0n_CONFIG_SERIAL n)
    +
     find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
     project(hello_world)
     
     target_sources(app PRIVATE src/main.c)
    +
    +
    +test_runner_generate(src/example_test.c)
    diff --git a/samples/hello_world/prj.conf b/samples/hello_world/prj.conf
    index b2a4ba59104..0608e7a866c 100644
    --- a/samples/hello_world/prj.conf
    +++ b/samples/hello_world/prj.conf
    @@ -1 +1 @@
    -# nothing here
    +CONFIG_BOOTLOADER_MCUBOOT=y
    

    Changes should be similar for the nRF5340.

  • I tried the HCI_UART sample program with the following changes but the issue still remains. 

    Here are the contents of my prj.conf file : 

    CONFIG_CONSOLE=n
    CONFIG_STDOUT_CONSOLE=n
    CONFIG_UART_CONSOLE=n
    CONFIG_GPIO=y
    CONFIG_SERIAL=y
    CONFIG_UART_INTERRUPT_DRIVEN=y
    CONFIG_BT=y
    CONFIG_BT_HCI_RAW=y
    CONFIG_BT_HCI_RAW_H4=y
    CONFIG_BT_HCI_RAW_H4_ENABLE=y
    CONFIG_BT_BUF_ACL_RX_SIZE=255
    CONFIG_BT_BUF_CMD_TX_SIZE=255
    CONFIG_BT_BUF_EVT_DISCARDABLE_SIZE=255
    CONFIG_BT_CTLR_ASSERT_HANDLER=y
    CONFIG_BT_MAX_CONN=16
    CONFIG_BT_TINYCRYPT_ECC=n
    CONFIG_BT_CTLR_DTM_HCI=y
    
    CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=512
    
    # Workaround: Unable to allocate command buffer when using K_NO_WAIT since
    # Host number of completed commands does not follow normal flow control.
    CONFIG_BT_BUF_CMD_TX_COUNT=10
    
    ###################################################################################################
    
    CONFIG_USB_DEVICE_STACK=y
    CONFIG_USB_DEVICE_PRODUCT="Zephyr HCI UART sample"
    CONFIG_USB_CDC_ACM=y
    CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n
    
    CONFIG_BOOTLOADER_MCUBOOT=y
    CONFIG_MCUMGR=y
    CONFIG_MCUMGR_TRANSPORT_UART=y
    CONFIG_MCUMGR_GRP_IMG=y
    
    # CONFIG_MCUMGR_TRANSPORT_UART dependencies
    CONFIG_BASE64=y
    
    # CONFIG_MCUMGR_GRP_IMG dependencies
    CONFIG_FLASH=y
    CONFIG_IMG_MANAGER=y
    
    # CONFIG_IMG_MANAGER dependencies
    CONFIG_STREAM_FLASH=y
    
    # CONFIG_MCUMGR dependencies
    CONFIG_NET_BUF=y
    CONFIG_ZCBOR=y
    
    # Required for CONFIG_IMG_MANAGER
    CONFIG_FLASH_MAP=y

    And here is the content of my overlay file : 

    / {
    	chosen {
    		zephyr,uart-mcumgr = &cdc_acm_uart1;
    		zephyr,bt-mon-uart = &cdc_acm_uart0;
    		zephyr,bt-c2h-uart = &cdc_acm_uart0;
    	};
    };
    
    &zephyr_udc0 {
    	cdc_acm_uart0: cdc_acm_uart0 {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    	cdc_acm_uart1: cdc_acm_uart1 {
    		compatible = "zephyr,cdc-acm-uart";
    	};
    };

    I build my program with this overlay file added by using the following command : 

    west build -b nrf5340dk_nrf5340_cpuapp --pristine -- -DDTC_OVERLAY_FILE=nrf5340dk_nrf5340_cpuapp.overlay -DCONFIG_MCUBOOT_SIGNATURE_KEY_FILE=\"/home/mutsl04176/ncs/v2.4.2/bootloader/mcuboot/root-rsa-2048.pem\"

    After this I flashed the merged.hex file. But the issue still remains the same.

    I get two ACM ports while checking the ls /dev. But only the default bluetooth controller of the laptop comes up. I should be able to see 2 bluetooth controllers instead but that's still not happening :

Related