BLE DFU nRF5280,nRF5340

mcumgr disconnecting when i trying to ble dfu ....

" Log from nrf connect mobile app"

nRF Connect, 2026-06-16
FYZKS52_E23993 (E2:39:93:7B:81:AA)
V 17:16:59.495 Connecting to E2:39:93:7B:81:AA...
D 17:16:59.495 gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, preferred PHY = LE 1M)
D 17:16:59.941 [Callback] Connection state changed with status: 0 and new state: CONNECTED (2)
I 17:16:59.941 Connected to E2:39:93:7B:81:AA
V 17:16:59.942 Discovering services...
D 17:16:59.942 gatt.discoverServices()
D 17:16:59.959 [Broadcast] Action received: android.bluetooth.device.action.ACL_CONNECTED
I 17:17:00.417 Connection parameters updated (interval: 7.5ms, latency: 0, timeout: 5000ms)
I 17:17:00.496 PHY updated (TX: LE 2M, RX: LE 2M)
D 17:17:00.594 [Callback] Services discovered with status: 0
I 17:17:00.594 Services discovered
V 17:17:00.600 Generic Attribute (0x1801)
- Service Changed [I] (0x2A05)
   Client Characteristic Configuration (0x2902)
Generic Access (0x1800)
- Device Name [R] (0x2A00)
- Appearance [R] (0x2A01)
- Peripheral Preferred Connection Parameters [R] (0x2A04)
SMP Service (8d53dc1d-1db7-4cd3-868b-8a527460aa84)
- SMP Characteristic [N WNR] (da2e7828-fbce-4e01-ae9e-261174997c48)
   Client Characteristic Configuration (0x2902)
D 17:17:00.600 gatt.setCharacteristicNotification(00002a05-0000-1000-8000-00805f9b34fb, true)
I 17:17:00.711 Connection parameters updated (interval: 48.75ms, latency: 0, timeout: 5000ms)
I 17:17:05.195 Connection parameters updated (interval: 48.75ms, latency: 0, timeout: 420ms)
V 17:17:07.208 [McuMgr] Connecting...
D 17:17:07.213 [McuMgr] gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, LE 1M)
D 17:17:07.252 [McuMgr] [Callback] Connection state changed with status: 0 and new state: 2 (CONNECTED)
I 17:17:07.257 [McuMgr] Connected to E2:39:93:7B:81:AA
D 17:17:07.259 [McuMgr] wait(300)
V 17:17:07.755 [McuMgr] Discovering services...
D 17:17:07.758 [McuMgr] gatt.discoverServices()
I 17:17:07.767 [McuMgr] Services discovered
V 17:17:07.769 [McuMgr] Primary service found
V 17:17:07.771 [McuMgr] Requesting new MTU...
D 17:17:07.773 [McuMgr] gatt.requestMtu(498)
I 17:17:08.001 [McuMgr] MTU changed to: 498
D 17:17:08.005 [McuMgr] gatt.setCharacteristicNotification(da2e7828-fbce-4e01-ae9e-261174997c48, true)
V 17:17:08.007 [McuMgr] Enabling notifications for da2e7828-fbce-4e01-ae9e-261174997c48
D 17:17:08.009 [McuMgr] gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x01-00)
I 17:17:08.235 [McuMgr] Data written to descr. 00002902-0000-1000-8000-00805f9b34fb
V 17:17:08.238 [McuMgr] Waiting for value change...
V 17:17:08.240 [McuMgr] Writing characteristic da2e7828-fbce-4e01-ae9e-261174997c48 (WRITE COMMAND)
D 17:17:08.242 [McuMgr] gatt.writeCharacteristic(da2e7828-fbce-4e01-ae9e-261174997c48, value=0x000000010000FF06A0, WRITE COMMAND)
I 17:17:08.245 [McuMgr] Data written to da2e7828-fbce-4e01-ae9e-261174997c48
I 17:17:08.808 Connection parameters updated (interval: 11.25ms, latency: 0, timeout: 420ms)
I 17:17:08.816 [McuMgr] Connection parameters updated (interval: 11.25ms, latency: 0, timeout: 420ms)
W 17:17:09.290 [McuMgr] Request timed out
V 17:17:09.322 [McuMgr] Requesting connection priority: HIGH (11.25–15ms, 0, 5s)...
D 17:17:09.563 [McuMgr] gatt.requestConnectionPriority(HIGH)
I 17:17:09.697 Connection parameters updated (interval: 15.0ms, latency: 0, timeout: 5000ms)
A 17:17:09.800 [McuMgr] Sending (9 bytes) Header (Version: 1, Op: 0, Flags: 0, Len: 1, Group: 0, Seq: 0, Command: 8) CBOR {}
V 17:17:09.805 [McuMgr] Writing characteristic da2e7828-fbce-4e01-ae9e-261174997c48 (WRITE COMMAND)
D 17:17:09.806 [McuMgr] gatt.writeCharacteristic(da2e7828-fbce-4e01-ae9e-261174997c48, value=0x0800000100000008A0, WRITE COMMAND)
I 17:17:09.809 [McuMgr] Connection parameters updated (interval: 15.0ms, latency: 0, timeout: 5000ms)
I 17:17:09.811 [McuMgr] Data written to da2e7828-fbce-4e01-ae9e-261174997c48
A 17:17:12.075 [McuMgr] Sending (9 bytes) Header (Version: 1, Op: 0, Flags: 0, Len: 1, Group: 1, Seq: 1, Command: 0) CBOR {}
V 17:17:12.098 [McuMgr] Writing characteristic da2e7828-fbce-4e01-ae9e-261174997c48 (WRITE COMMAND)
D 17:17:12.101 [McuMgr] gatt.writeCharacteristic(da2e7828-fbce-4e01-ae9e-261174997c48, value=0x0800000100010100A0, WRITE COMMAND)
I 17:17:12.105 [McuMgr] Data written to da2e7828-fbce-4e01-ae9e-261174997c48
V 17:17:17.076 [McuMgr] Disconnecting...
D 17:17:17.082 [McuMgr] gatt.disconnect()
D 17:17:17.325 [McuMgr] [Callback] Connection state changed with status: 0 and new state: 0 (DISCONNECTED)
I 17:17:17.331 Connection parameters updated (interval: 48.75ms, latency: 0, timeout: 420ms)
I 17:17:17.346 [McuMgr] Disconnected
D 17:17:17.348 [McuMgr] gatt.close()

// #include <zephyr/kernel.h>
// #include <zephyr/device.h>
// #include <zephyr/sys/ring_buffer.h>
// #include "pd_application.h"


// int main(void)
// {
//     init_modules();
//     printf("ble dfu ota\n");
//     while (1)
//     {
//         application_handler();
//     }
//     return 0; /* Unreachable */
// }



#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <stdio.h>
 #include <zephyr/drivers/uart.h>
#include <zephyr/bluetooth/gatt.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/services/nus.h>



/* Advertising parameters */
static const struct bt_le_adv_param *adv_param =
    BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONN | BT_LE_ADV_OPT_USE_IDENTITY,
                    800, 801, NULL);

                    
/* Advertising data */
static const struct bt_data ad[] = {
    BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
    BT_DATA_BYTES(BT_DATA_UUID16_ALL,
                  (BT_UUID_BAS_VAL >> 8) & 0xff, // Gets 0x18
                  BT_UUID_BAS_VAL & 0xff),       // Gets 0x0f
    BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_NUS_SRV_VAL),
};

uint8_t g_u8_device_name[20];    

static void bt_ready(int err)
{
    if (err)
    {
        printf("Bluetooth init failed (err %d)\n", err);
        return;
    }
}

void set_device_name_with_mac()
{
    bt_addr_le_t addr;
    size_t count = 1;
    bt_id_get(&addr, &count);

    sprintf(g_u8_device_name, "FYZKS52_%02X%02X%02X",
            addr.a.val[5], addr.a.val[4], addr.a.val[3]); // last three bytes of data adress
    printf("Advertising as: %s\n", g_u8_device_name);
}

int ble_start_advertising(void)
{
    int err;

    set_device_name_with_mac();
    static const struct bt_data sd[] =
        {
            BT_DATA(BT_DATA_NAME_COMPLETE, g_u8_device_name, sizeof(g_u8_device_name) - 1)};
    err = bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), sd, ARRAY_SIZE(sd));
    if (err)
    {
        printf("Failed to start advertising (err %d)\n", err);
        return err;
    }

    printf("Advertising started\n");
    return err;
}


int main(void)
{
    int ret;

    ret = usb_enable(NULL);
    if (ret != 0)
	{
        printf("Failed to enable USB");
        return 0 ;
    }

     ret = bt_enable(bt_ready);
    if (ret)
    {
        printf("Bluetooth initialization failed (err %d)\n", ret);
        return ret;
    }
    ble_start_advertising();
    printf(" hai ble dfu .........\n");
    while (1)
    {
        ;
    }
    return 0; /* Unreachable */
}


==================================================================================

Overlay
-------------


/ {
    chosen {
         zephyr,console = &cdc_acm_uart0;
        zephyr,shell-uart = &cdc_acm_uart0;
    };
};

/* DATA UART — UART0 */
&uart0 {
    status = "okay";
    current-speed = <38400>;
    pinctrl-0 = <&uart0_default>;
    pinctrl-1 = <&uart0_sleep>;
    pinctrl-names = "default", "sleep";
};

/* CONSOLE/printf UART — UART1 (keeps debug printfs separate from data) */
&uart1 {
    status = "okay";
    current-speed = <38400>;
    pinctrl-0 = <&uart1_default>;
    pinctrl-1 = <&uart1_sleep>;
    pinctrl-names = "default", "sleep";
};

&pinctrl {
    uart0_default: uart0_default {
        group1 {
            psels = <NRF_PSEL(UART_TX, 1, 11)>,   /* P1.11 TX */
                    <NRF_PSEL(UART_RX, 1, 12)>;   /* P1.12 RX */
        };
    };
    uart0_sleep: uart0_sleep {
        group1 {
            psels = <NRF_PSEL(UART_TX, 1, 11)>,
                    <NRF_PSEL(UART_RX, 1, 12)>;
            low-power-enable;
        };
    };

    uart1_default: uart1_default {
        group1 {
            psels = <NRF_PSEL(UART_TX, 0, 28)>,  
                    <NRF_PSEL(UART_RX, 0, 29)>;  
        };
    };
    uart1_sleep: uart1_sleep {
        group1 {
            psels = <NRF_PSEL(UART_TX, 0, 28)>,
                    <NRF_PSEL(UART_RX, 0, 29)>;
            low-power-enable;
        };
    };
};


/{
	leds {
		compatible = "gpio-leds";
		led0: led_0 {
			gpios = <&gpio0 26 GPIO_ACTIVE_LOW>;
			label = "Red LED";
		};
		led1: led_1 {
			gpios = <&gpio0 30 GPIO_ACTIVE_LOW>;
			label = "Green LED";
		};
		led2: led_2 {
			gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
			label = "Blue LED";
		};
	};

	
	aliases
	{
		led0 = &led0;
		led1 = &led1;
		led2 = &led2;
	};
};


&flash0 {

	partitions {
		compatible = "fixed-partitions";
		#address-cells = <1>;
		#size-cells = <1>;

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0x0000C000>;
		};
		slot0_partition: partition@c000 {
			label = "image-0";
			reg = <0x0000C000 0x00076000>;
		};
		slot1_partition: partition@82000 {
			label = "image-1";
			reg = <0x00082000 0x00076000>;
		};

		/*
		 * The flash starting at 0x000f8000 and ending at
		 * 0x000fffff is reserved for use by the application.
		 */

		/*
		 * Storage partition will be used by FCB/LittleFS/NVS
		 * if enabled.
		 */
		storage_partition: partition@f8000 {
			label = "storage";
			reg = <0x000f8000 0x00008000>;
		};
	};
};

&gpio0 {
    status = "okay";
};

&gpio1 {
    status = "okay";
};

&gpiote {
    status = "okay";
};



&usbd {
    status = "okay";

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

===================================================================================

prj.conf
-----------



# # Enable console
# CONFIG_CONSOLE=y
# CONFIG_UART_CONSOLE=y

# # Enable Zephyr application development support
# CONFIG_STDOUT_CONSOLE=y


# # Enable logging
# # CONFIG_LOG=y
# CONFIG_LOG_DEFAULT_LEVEL=3
# CONFIG_LOG_BACKEND_UART=y

# # Enable kernel options
# CONFIG_MULTITHREADING=y


# # Application specific settings
# CONFIG_MAIN_STACK_SIZE=4096
# CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096
# CONFIG_HEAP_MEM_POOL_SIZE=8192

# # Enable timekeeping
# CONFIG_NEWLIB_LIBC=y
# CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

# CONFIG_BT=y
# CONFIG_BT_PERIPHERAL=y


# # USB Device Configuration
# CONFIG_USB_DEVICE_STACK=y
# CONFIG_USB_DEVICE_PRODUCT="Custom board DFU"
# CONFIG_USB_DEVICE_VID=0x1915
# CONFIG_USB_DEVICE_PID=0x521F
# CONFIG_USB_DEVICE_MANUFACTURER="Nordic Semiconductor ASA"
# CONFIG_USB_DEVICE_SN="12345678"

# # UART Configuration
# CONFIG_SERIAL=y
# CONFIG_UART_INTERRUPT_DRIVEN=y
# CONFIG_UART_LINE_CTRL=y
# # Console Configuration - removed CONSOLE_HAS_DRIVER
# CONFIG_CONSOLE=y
# CONFIG_UART_CONSOLE=y
# CONFIG_STDOUT_CONSOLE=y

# # Enable MCUboot Bootloader dependency
# CONFIG_BOOTLOADER_MCUBOOT=y
# CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y

# ─── Console ────────────────────────────────────────────────
CONFIG_CONSOLE=y
CONFIG_UART_CONSOLE=y
CONFIG_STDOUT_CONSOLE=y

# ─── Logging ────────────────────────────────────────────────
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
CONFIG_LOG_BACKEND_UART=y

# ─── Kernel ─────────────────────────────────────────────────
CONFIG_MULTITHREADING=y
CONFIG_MAIN_STACK_SIZE=4096
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096

# ── Heap: MCUmgr needs headroom for SMP packet reassembly ───
CONFIG_HEAP_MEM_POOL_SIZE=8192  

# ─── C Library ──────────────────────────────────────────────
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

# ─── Bluetooth ──────────────────────────────────────────────
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_DEVICE_NAME="FYZKS52"

# BLE buffer sizing — critical for SMP OTA
CONFIG_BT_L2CAP_TX_MTU=498
CONFIG_BT_BUF_ACL_RX_SIZE=502
CONFIG_BT_BUF_ACL_TX_SIZE=502
CONFIG_BT_CTLR_DATA_LENGTH_MAX=251   

# ─── USB ────────────────────────────────────────────────────
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT="Custom board DFU"
CONFIG_USB_DEVICE_VID=0x1915
CONFIG_USB_DEVICE_PID=0x521F
CONFIG_USB_DEVICE_MANUFACTURER="Nordic Semiconductor ASA"
CONFIG_USB_DEVICE_SN="12345678"

# ─── UART ───────────────────────────────────────────────────
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_LINE_CTRL=y

# ─── MCUboot ────────────────────────────────────────────────
CONFIG_BOOTLOADER_MCUBOOT=y

# ─── MCUmgr core ────────────────────────────────────────────
CONFIG_MCUMGR=y
CONFIG_MCUMGR_TRANSPORT_BT=y           # SMP over BLE
CONFIG_MCUMGR_TRANSPORT_BT_REASSEMBLY=y

# MCUmgr handler groups — THIS is what fixes "UNKNOWN" fields
CONFIG_MCUMGR_GRP_IMG=y               # Image upload/confirm
CONFIG_MCUMGR_GRP_OS=y                # Bootloader name/mode/slot queries
CONFIG_MCUMGR_GRP_IMG_MUTEX=y


# Flash write thread stack — prevents radio starvation
CONFIG_MCUMGR_GRP_IMG_UPLOAD_CHECK_HOOK=n

# ─── Flash ──────────────────────────────────────────────────
CONFIG_FLASH=y
CONFIG_FLASH_MAP=y
CONFIG_STREAM_FLASH=y
CONFIG_IMG_MANAGER=y

# ─── NCS convenience wrapper (keep it) ──────────────────────
CONFIG_NCS_SAMPLE_MCUMGR_BT_OTA_DFU=y


===================================================================================

pm_static.yaml
---------------

# pm_static.yml — nRF52840 1MB flash, swap-with-scratch MCUboot

mcuboot:
  address: 0x000000
  size: 0x00C000        # 48KB — bootloader

mcuboot_primary:
  address: 0x00C000
  size: 0x069000        # 420KB — slot 0 (running app, 420KB > your 262KB image)

mcuboot_secondary:
  address: 0x075000
  size: 0x069000        # 420KB — slot 1 (OTA image lands here)

mcuboot_scratch:
  address: 0x0DE000
  size: 0x008000        # 32KB — swap scratch

settings_storage:
  address: 0x0E6000
  size: 0x01A000        # 104KB — NVS/settings (MCUboot image state goes here)
  
  ==================================================================================
  
  sysbuild.conf
  -----------------
  
  SB_CONFIG_BOOTLOADER_MCUBOOT=y

Related