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