<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>nRF52840 Dongle bluetooth init deadlock (EDEADLK), potential HW problem?</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/106675/nrf52840-dongle-bluetooth-init-deadlock-edeadlk-potential-hw-problem</link><description>I have 2 nRF52840 Dongles, both have the version/date on them as &amp;quot;2.1.1 2023.2&amp;quot;. I am using nRF Connect SDK 2.5.0 and I&amp;#39;ve combined code from 2 samples, nrf/samples/bluetooth/central_uart and zephyr/samples/subsys/usb/cdc_acm and enabled CODED PHY advertising</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 18 Dec 2023 12:24:47 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/106675/nrf52840-dongle-bluetooth-init-deadlock-edeadlk-potential-hw-problem" /><item><title>RE: nRF52840 Dongle bluetooth init deadlock (EDEADLK), potential HW problem?</title><link>https://devzone.nordicsemi.com/thread/460804?ContentTypeID=1</link><pubDate>Mon, 18 Dec 2023 12:24:47 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:b90b457f-e2c4-4659-823d-18ccf9a68ab0</guid><dc:creator>Sigurd Hellesvik</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;I will continue helping with this ticket.&lt;/p&gt;
[quote user="tuokri"]Hi, I&amp;#39;ve not tried running other Bluetooth samples yet as they take some effort to adapt for the dongle.[/quote]
&lt;p&gt;I believe that you should be able to build our bluetooth samples for the board nrf52840dongle_nrf52840, and then they should work.&lt;br /&gt;Our &lt;a href="https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/bluetooth/llpm/README.html"&gt;LLPM sample&lt;/a&gt; does even have specific support for the dongle.&lt;/p&gt;
&lt;p&gt;You can use the &lt;a href="https://www.nordicsemi.com/Products/Development-tools/nRF-Programmer"&gt;nRF Programmer&lt;/a&gt; desktop app to program the dongle.&lt;/p&gt;
&lt;p&gt;Can you try any of those samples and see if they work?&lt;/p&gt;
&lt;p&gt;Regards,&lt;br /&gt;Sigurd Hellesvik&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 Dongle bluetooth init deadlock (EDEADLK), potential HW problem?</title><link>https://devzone.nordicsemi.com/thread/460554?ContentTypeID=1</link><pubDate>Fri, 15 Dec 2023 13:11:39 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c6816df3-f176-40eb-9026-f8cfc21637f1</guid><dc:creator>tuokri</dc:creator><description>&lt;p&gt;Hi, I&amp;#39;ve not tried running other Bluetooth samples yet as they take some effort to adapt for the dongle.&lt;br /&gt;&lt;br /&gt;I&amp;#39;ve discovered that disabling settings (&lt;strong&gt;CONFIG_SETTINGS=n&lt;/strong&gt;) on the bad dongle makes it work properly (as long as I don&amp;#39;t use the settings for anything).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For reference, here&amp;#39;s my modified cdc_acm sample main.c with code added from the central_uart sample to use the dongle as Central UART with CODED PHY and USB CDC ACM:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;/*
 * Copyright (c) 2019 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

/**
 * @file
 * @brief Sample echo app for CDC ACM class
 *
 * Sample app for USB CDC ACM class driver. The received data is echoed back
 * to the serial port.
 */

#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;string.h&amp;gt;
#include &amp;lt;zephyr/device.h&amp;gt;
#include &amp;lt;zephyr/drivers/uart.h&amp;gt;
#include &amp;lt;zephyr/kernel.h&amp;gt;
#include &amp;lt;zephyr/sys/ring_buffer.h&amp;gt;

#include &amp;lt;zephyr/bluetooth/bluetooth.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/hci.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/conn.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/uuid.h&amp;gt;
#include &amp;lt;zephyr/bluetooth/gatt.h&amp;gt;

#include &amp;lt;bluetooth/services/nus.h&amp;gt;
#include &amp;lt;bluetooth/services/nus_client.h&amp;gt;
#include &amp;lt;bluetooth/gatt_dm.h&amp;gt;
#include &amp;lt;bluetooth/scan.h&amp;gt;

#include &amp;lt;zephyr/settings/settings.h&amp;gt;

#include &amp;lt;zephyr/usb/usb_device.h&amp;gt;
#include &amp;lt;zephyr/usb/usbd.h&amp;gt;
#include &amp;lt;zephyr/logging/log.h&amp;gt;

#include &amp;lt;dk_buttons_and_leds.h&amp;gt;

#define LED_GREEN   0
#define LED_2_RED   1
#define LED_2_GREEN 2
#define LED_2_BLUE  3

LOG_MODULE_REGISTER(cdc_acm_echo, LOG_LEVEL_INF);

#define RING_BUF_SIZE 1024
uint8_t ring_buffer[RING_BUF_SIZE];

struct ring_buf ringbuf;

// ------------------------------------------------
// Central UART sample stuff:

/* UART payload buffer element size. */
#define UART_BUF_SIZE 64

// #define KEY_PASSKEY_ACCEPT DK_BTN1_MSK
// #define KEY_PASSKEY_REJECT DK_BTN2_MSK

#define NUS_WRITE_TIMEOUT K_MSEC(150)

K_SEM_DEFINE(nus_write_sem, 0, 1);

struct uart_data_t {
	void *fifo_reserved;
	uint8_t  data[UART_BUF_SIZE];
	uint16_t len;
};

static K_FIFO_DEFINE(fifo_uart_rx_data);

static struct bt_conn *default_conn;
static struct bt_nus_client nus_client;

// ------------------------------------------------
// ------------------------------------------------


#if defined(CONFIG_USB_DEVICE_STACK_NEXT)
USBD_CONFIGURATION_DEFINE(config_1,
			  USB_SCD_SELF_POWERED,
			  200);

USBD_DESC_LANG_DEFINE(sample_lang);
USBD_DESC_MANUFACTURER_DEFINE(sample_mfr, &amp;quot;ZEPHYR&amp;quot;);
USBD_DESC_PRODUCT_DEFINE(sample_product, &amp;quot;Zephyr USBD CDC ACM&amp;quot;);
USBD_DESC_SERIAL_NUMBER_DEFINE(sample_sn, &amp;quot;0123456789ABCDEF&amp;quot;);

USBD_DEVICE_DEFINE(sample_usbd,
		   DEVICE_DT_GET(DT_NODELABEL(zephyr_udc0)),
		   0x2fe3, 0x0001);

static int enable_usb_device_next(void)
{
	int err;

	err = usbd_add_descriptor(&amp;amp;sample_usbd, &amp;amp;sample_lang);
	if (err) {
		LOG_ERR(&amp;quot;Failed to initialize language descriptor (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_add_descriptor(&amp;amp;sample_usbd, &amp;amp;sample_mfr);
	if (err) {
		LOG_ERR(&amp;quot;Failed to initialize manufacturer descriptor (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_add_descriptor(&amp;amp;sample_usbd, &amp;amp;sample_product);
	if (err) {
		LOG_ERR(&amp;quot;Failed to initialize product descriptor (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_add_descriptor(&amp;amp;sample_usbd, &amp;amp;sample_sn);
	if (err) {
		LOG_ERR(&amp;quot;Failed to initialize SN descriptor (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_add_configuration(&amp;amp;sample_usbd, &amp;amp;config_1);
	if (err) {
		LOG_ERR(&amp;quot;Failed to add configuration (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_register_class(&amp;amp;sample_usbd, &amp;quot;cdc_acm_0&amp;quot;, 1);
	if (err) {
		LOG_ERR(&amp;quot;Failed to register CDC ACM class (%d)&amp;quot;, err);
		return err;
	}

	err = usbd_init(&amp;amp;sample_usbd);
	if (err) {
		LOG_ERR(&amp;quot;Failed to initialize device support&amp;quot;);
		return err;
	}

	err = usbd_enable(&amp;amp;sample_usbd);
	if (err) {
		LOG_ERR(&amp;quot;Failed to enable device support&amp;quot;);
		return err;
	}

	LOG_DBG(&amp;quot;USB device support enabled&amp;quot;);

	return 0;
}
#endif /* IS_ENABLED(CONFIG_USB_DEVICE_STACK_NEXT) */

static void interrupt_handler(const struct device *dev, void *user_data)
{
	ARG_UNUSED(user_data);

	while (uart_irq_update(dev) &amp;amp;&amp;amp; uart_irq_is_pending(dev)) {

		// Got incoming data from USB. Send with BLE.
		if (uart_irq_rx_ready(dev)) {

			LOG_INF(&amp;quot;uart_irq_rx_ready&amp;quot;);

			int recv_len;
			// int rb_len;
			uint8_t buffer[UART_BUF_SIZE];
			size_t len = MIN(ring_buf_space_get(&amp;amp;ringbuf), sizeof(buffer));

			recv_len = uart_fifo_read(dev, buffer, len);
			if (recv_len &amp;lt; 0) {
				LOG_ERR(&amp;quot;Failed to read UART FIFO&amp;quot;);
				recv_len = 0;
			}

			if (recv_len &amp;gt;= 0)
			{
				struct uart_data_t* buf;
				buf = k_malloc(sizeof(*buf));

				if (!buf)
				{
					LOG_ERR(&amp;quot;Failed to allocate UART RX buffer!&amp;quot;);
				}
				else
				{
					buf-&amp;gt;len = recv_len;
					LOG_INF(&amp;quot;Copying UART RX buffer&amp;quot;);
					memcpy(buf-&amp;gt;data, buffer, buf-&amp;gt;len);

					LOG_INF(&amp;quot;Putting copied UART RX buffer to RX FIFO&amp;quot;);
					k_fifo_put(&amp;amp;fifo_uart_rx_data, buf);
					LOG_INF(&amp;quot;RX FIFO put done!&amp;quot;);
				}
			}
		}

		if (uart_irq_tx_ready(dev)) {
			uint8_t buffer[UART_BUF_SIZE];
			int rb_len, send_len;

			rb_len = ring_buf_get(&amp;amp;ringbuf, buffer, sizeof(buffer));
			if (!rb_len) {
				LOG_DBG(&amp;quot;Ring buffer empty, disable TX IRQ&amp;quot;);
				uart_irq_tx_disable(dev);
				continue;
			}

			send_len = uart_fifo_fill(dev, buffer, rb_len);
			if (send_len &amp;lt; rb_len) {
				LOG_ERR(&amp;quot;Drop %d bytes&amp;quot;, rb_len - send_len);
			}

			LOG_DBG(&amp;quot;ringbuf -&amp;gt; tty fifo %d bytes&amp;quot;, send_len);
		}
	}

	LOG_INF(&amp;quot;interrupt_handler&amp;quot;);
}

// --------------------------
// Central UART sample stuff:

static void ble_data_sent(struct bt_nus_client *nus, uint8_t err,
					const uint8_t *const data, uint16_t len)
{
	ARG_UNUSED(nus);

	LOG_INF(&amp;quot;ble_data_sent&amp;quot;);

	struct uart_data_t *buf;

	/* Retrieve buffer context. */
	buf = CONTAINER_OF(data, struct uart_data_t, data);
	k_free(buf);

	k_sem_give(&amp;amp;nus_write_sem);

	if (err) {
		LOG_WRN(&amp;quot;ATT error code: 0x%02X&amp;quot;, err);
	}
}

static uint8_t ble_data_received(struct bt_nus_client *nus,
						const uint8_t *data, uint16_t len)
{
	ARG_UNUSED(nus);

	uint32_t rb_len;
	const struct device* dev;

	dev = DEVICE_DT_GET_ONE(zephyr_cdc_acm_uart);
	if (!device_is_ready(dev)) {
		LOG_ERR(&amp;quot;CDC ACM device not ready&amp;quot;);
		return BT_GATT_ITER_CONTINUE;
	}

	for (uint16_t pos = 0; pos != len;) {
		struct uart_data_t *tx = k_malloc(sizeof(*tx));

		if (!tx) {
			LOG_WRN(&amp;quot;Not able to allocate UART TX buffer&amp;quot;);
			return BT_GATT_ITER_CONTINUE;
		}

		/* Keep the last byte of TX buffer for potential LF char. */
		size_t tx_data_size = sizeof(tx-&amp;gt;data) - 1;

		if ((len - pos) &amp;gt; tx_data_size) {
			tx-&amp;gt;len = tx_data_size;
		} else {
			tx-&amp;gt;len = (len - pos);
		}

		memcpy(tx-&amp;gt;data, &amp;amp;data[pos], tx-&amp;gt;len);

		pos += tx-&amp;gt;len;

		/* Append the LF character when the CR character triggered
		 * transmission from the peer.
		 */
		if ((pos == len) &amp;amp;&amp;amp; (data[len - 1] == &amp;#39;\r&amp;#39;)) {
			tx-&amp;gt;data[tx-&amp;gt;len] = &amp;#39;\n&amp;#39;;
			tx-&amp;gt;len++;
		}

		rb_len = ring_buf_put(&amp;amp;ringbuf, tx-&amp;gt;data, tx-&amp;gt;len);
		if (rb_len &amp;lt; tx-&amp;gt;len) {
			LOG_ERR(&amp;quot;Drop %u bytes&amp;quot;, tx-&amp;gt;len - rb_len);
		}

		LOG_DBG(&amp;quot;tty fifo -&amp;gt; ringbuf %d bytes&amp;quot;, rb_len);
		if (rb_len) {
			uart_irq_tx_enable(dev);
		}

		k_free(tx);
	}

	return BT_GATT_ITER_CONTINUE;
}

static void discovery_complete(struct bt_gatt_dm *dm,
			       void *context)
{
	struct bt_nus_client *nus = context;
	LOG_INF(&amp;quot;Service discovery completed&amp;quot;);

	bt_gatt_dm_data_print(dm);

	bt_nus_handles_assign(dm, nus);
	bt_nus_subscribe_receive(nus);

	bt_gatt_dm_data_release(dm);
}

static void discovery_service_not_found(struct bt_conn *conn,
					void *context)
{
	LOG_INF(&amp;quot;Service not found&amp;quot;);
}

static void discovery_error(struct bt_conn *conn,
			    int err,
			    void *context)
{
	LOG_WRN(&amp;quot;Error while discovering GATT database: (%d)&amp;quot;, err);
}

struct bt_gatt_dm_cb discovery_cb = {
	.completed         = discovery_complete,
	.service_not_found = discovery_service_not_found,
	.error_found       = discovery_error,
};

static void gatt_discover(struct bt_conn *conn)
{
	int err;

	if (conn != default_conn) {
		return;
	}

	err = bt_gatt_dm_start(conn,
			       BT_UUID_NUS_SERVICE,
			       &amp;amp;discovery_cb,
			       &amp;amp;nus_client);
	if (err) {
		LOG_ERR(&amp;quot;could not start the discovery procedure, error &amp;quot;
			&amp;quot;code: %d&amp;quot;, err);
	}
}

static void exchange_func(struct bt_conn *conn, uint8_t err, struct bt_gatt_exchange_params *params)
{
	if (!err) {
		LOG_INF(&amp;quot;MTU exchange done&amp;quot;);
	} else {
		LOG_WRN(&amp;quot;MTU exchange failed (err %&amp;quot; PRIu8 &amp;quot;)&amp;quot;, err);
	}
}

static void connected(struct bt_conn *conn, uint8_t conn_err)
{
	char addr[BT_ADDR_LE_STR_LEN];
	int err;

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	if (conn_err) {
		LOG_INF(&amp;quot;Failed to connect to %s (%d)&amp;quot;, addr, conn_err);

		if (default_conn == conn) {
			bt_conn_unref(default_conn);
			default_conn = NULL;

			err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
			if (err) {
				LOG_ERR(&amp;quot;Scanning failed to start (err %d)&amp;quot;,
					err);
			}
		}

		return;
	}

	LOG_INF(&amp;quot;Connected: %s&amp;quot;, addr);

	dk_set_led_on(LED_GREEN);

	static struct bt_gatt_exchange_params exchange_params;

	exchange_params.func = exchange_func;
	err = bt_gatt_exchange_mtu(conn, &amp;amp;exchange_params);
	if (err) {
		LOG_WRN(&amp;quot;MTU exchange failed (err %d)&amp;quot;, err);
	}

	err = bt_conn_set_security(conn, BT_SECURITY_L2);
	if (err) {
		LOG_WRN(&amp;quot;Failed to set security: %d&amp;quot;, err);

		gatt_discover(conn);
	}

	err = bt_scan_stop();
	if ((!err) &amp;amp;&amp;amp; (err != -EALREADY)) {
		LOG_ERR(&amp;quot;Stop LE scan failed (err %d)&amp;quot;, err);
	}
}

static void disconnected(struct bt_conn *conn, uint8_t reason)
{
	char addr[BT_ADDR_LE_STR_LEN];
	int err;

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	LOG_INF(&amp;quot;Disconnected: %s (reason %u)&amp;quot;, addr, reason);

	if (default_conn != conn) {
		return;
	}

	bt_conn_unref(default_conn);
	default_conn = NULL;

	dk_set_led_off(LED_GREEN);

	err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
	if (err) {
		LOG_ERR(&amp;quot;Scanning failed to start (err %d)&amp;quot;,
			err);
	}
}

static void security_changed(struct bt_conn *conn, bt_security_t level,
			     enum bt_security_err err)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	if (!err) {
		LOG_INF(&amp;quot;Security changed: %s level %u&amp;quot;, addr, level);
	} else {
		LOG_WRN(&amp;quot;Security failed: %s level %u err %d&amp;quot;, addr,
			level, err);
	}

	gatt_discover(conn);
}

BT_CONN_CB_DEFINE(conn_callbacks) = {
	.connected = connected,
	.disconnected = disconnected,
	.security_changed = security_changed
};

static void scan_filter_match(struct bt_scan_device_info *device_info,
			      struct bt_scan_filter_match *filter_match,
			      bool connectable)
{
	int err;
	char addr[BT_ADDR_LE_STR_LEN];
	struct bt_conn_le_create_param *conn_params;

	bt_addr_le_to_str(device_info-&amp;gt;recv_info-&amp;gt;addr, addr, sizeof(addr));

	LOG_INF(&amp;quot;Filters matched. Address: %s connectable: %d&amp;quot;,
		addr, connectable);


	err = bt_scan_stop();
	if (err) {
		printk(&amp;quot;Stop LE scan failed (err %d)\n&amp;quot;, err);
	}

	conn_params = BT_CONN_LE_CREATE_PARAM(
		BT_CONN_LE_OPT_CODED | BT_CONN_LE_OPT_NO_1M,
		BT_GAP_SCAN_FAST_INTERVAL,
		BT_GAP_SCAN_FAST_INTERVAL);

	err = bt_conn_le_create(device_info-&amp;gt;recv_info-&amp;gt;addr, conn_params,
				BT_LE_CONN_PARAM_DEFAULT,
				&amp;amp;default_conn);
	if (err) {
		printk(&amp;quot;Create conn failed (err %d)\n&amp;quot;, err);

		err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
		if (err) {
			printk(&amp;quot;Scanning failed to start (err %d)\n&amp;quot;, err);
			return;
		}
	}

	printk(&amp;quot;Connection pending\n&amp;quot;);
}

/*
static void scan_connecting_error(struct bt_scan_device_info *device_info)
{
	LOG_WRN(&amp;quot;Connecting failed&amp;quot;);
}

static void scan_connecting(struct bt_scan_device_info *device_info,
			    struct bt_conn *conn)
{
	default_conn = bt_conn_ref(conn);
}
*/

static int nus_client_init(void)
{
	int err;
	struct bt_nus_client_init_param init = {
		.cb = {
			.received = ble_data_received,
			.sent = ble_data_sent,
		}
	};

	err = bt_nus_client_init(&amp;amp;nus_client, &amp;amp;init);
	if (err) {
		LOG_ERR(&amp;quot;NUS Client initialization failed (err %d)&amp;quot;, err);
		return err;
	}

	LOG_INF(&amp;quot;NUS Client module initialized&amp;quot;);
	return err;
}

BT_SCAN_CB_INIT(scan_cb, scan_filter_match, NULL, NULL, NULL);

static int scan_init(void)
{
	int err;

	/* Use active scanning and disable duplicate filtering to handle any
	 * devices that might update their advertising data at runtime. */
	struct bt_le_scan_param scan_param = {
		.type     = BT_LE_SCAN_TYPE_ACTIVE,
		.interval = BT_GAP_SCAN_FAST_INTERVAL,
		.window   = BT_GAP_SCAN_FAST_WINDOW,
		.options  = BT_LE_SCAN_OPT_CODED | BT_LE_SCAN_OPT_NO_1M
	};

	struct bt_scan_init_param scan_init = {
		.connect_if_match = 0,
		.scan_param = &amp;amp;scan_param,
		.conn_param = NULL,
	};

	bt_scan_init(&amp;amp;scan_init);
	bt_scan_cb_register(&amp;amp;scan_cb);

	err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_UUID, BT_UUID_NUS_SERVICE);
	if (err) {
		LOG_ERR(&amp;quot;Scanning filters cannot be set (err %d)&amp;quot;, err);
		return err;
	}

	err = bt_scan_filter_enable(BT_SCAN_UUID_FILTER, false);
	if (err) {
		LOG_ERR(&amp;quot;Filters cannot be turned on (err %d)&amp;quot;, err);
		return err;
	}

	LOG_INF(&amp;quot;Scan module initialized&amp;quot;);
	return err;
}

static void auth_cancel(struct bt_conn *conn)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	LOG_INF(&amp;quot;Pairing cancelled: %s&amp;quot;, addr);
}

static void pairing_complete(struct bt_conn *conn, bool bonded)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	LOG_INF(&amp;quot;Pairing completed: %s, bonded: %d&amp;quot;, addr, bonded);
}

static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
{
	char addr[BT_ADDR_LE_STR_LEN];

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));

	LOG_WRN(&amp;quot;Pairing failed conn: %s, reason %d&amp;quot;, addr, reason);
}

static struct bt_conn_auth_cb conn_auth_callbacks = {
	.cancel = auth_cancel,
};

static struct bt_conn_auth_info_cb conn_auth_info_callbacks = {
	.pairing_complete = pairing_complete,
	.pairing_failed = pairing_failed
};

static void configure_gpio(void)
{
	int err;

	err = dk_leds_init();
	if (err) {
		LOG_ERR(&amp;quot;Cannot init LEDs (err: %d)&amp;quot;, err);
	}
}

int main(void)
{
	const struct device *dev;
	uint32_t baudrate = 0U;
	uint32_t dtr = 0U;
	int err;

	configure_gpio();

	dk_set_led_on(LED_GREEN);

	// ---------------------
	// CDC ACM Sample stuff:

	dk_set_led_on(LED_2_RED);
	dev = DEVICE_DT_GET_ONE(zephyr_cdc_acm_uart);
	if (!device_is_ready(dev)) {
		k_sleep(K_SECONDS(2));
		dk_set_led_off(LED_2_RED);
		LOG_ERR(&amp;quot;CDC ACM device not ready&amp;quot;);
		return 0;
	}

	dk_set_led_on(LED_2_BLUE);
#if defined(CONFIG_USB_DEVICE_STACK_NEXT)
		ret = enable_usb_device_next();
#else
		err = usb_enable(NULL);
#endif
	if (err != 0) {
		k_sleep(K_SECONDS(2));
		dk_set_led_off(LED_2_BLUE);
		LOG_ERR(&amp;quot;Failed to enable USB&amp;quot;);
		return 0;
	}

	ring_buf_init(&amp;amp;ringbuf, sizeof(ring_buffer), ring_buffer);

	LOG_INF(&amp;quot;Wait for DTR&amp;quot;);

	while (true) {
		uart_line_ctrl_get(dev, UART_LINE_CTRL_DTR, &amp;amp;dtr);
		if (dtr) {
			break;
		} else {
			/* Give CPU resources to low priority threads. */
			k_sleep(K_MSEC(100));
		}
	}

	LOG_INF(&amp;quot;DTR set&amp;quot;);

	/* They are optional, we use them to test the interrupt endpoint */
	err = uart_line_ctrl_set(dev, UART_LINE_CTRL_DCD, 1);
	if (err) {
		LOG_WRN(&amp;quot;Failed to set DCD, ret code %d&amp;quot;, err);
	}

	err = uart_line_ctrl_set(dev, UART_LINE_CTRL_DSR, 1);
	if (err) {
		LOG_WRN(&amp;quot;Failed to set DSR, ret code %d&amp;quot;, err);
	}

	/* Wait 100ms for the host to do all settings */
	k_msleep(100);

	err = uart_line_ctrl_get(dev, UART_LINE_CTRL_BAUD_RATE, &amp;amp;baudrate);
	if (err) {
		LOG_WRN(&amp;quot;Failed to get baudrate, ret code %d&amp;quot;, err);
	} else {
		LOG_INF(&amp;quot;Baudrate detected: %d&amp;quot;, baudrate);
	}

	// --------------------------

	dk_set_led_on(LED_2_GREEN);
	err = uart_irq_callback_set(dev, interrupt_handler);
	if (err != 0)
	{
		LOG_ERR(&amp;quot;Failed to set IRQ callback: %d&amp;quot;, err);
		k_sleep(K_SECONDS(2));
		dk_set_led_off(LED_2_GREEN);
	}

	LOG_INF(&amp;quot;Enabling RX interrupts&amp;quot;);
	/* Enable rx interrupts */
	uart_irq_rx_enable(dev);

	dk_set_led_off(LED_GREEN);
	dk_set_led_off(LED_2_RED);
	dk_set_led_off(LED_2_GREEN);
	dk_set_led_off(LED_2_BLUE);

	// --------------------------
	// Central UART Sample stuff:
	// --------------------------

	// TODO: does this help with anything?
	k_sleep(K_MSEC(500));

	err = bt_conn_auth_cb_register(&amp;amp;conn_auth_callbacks);
	if (err) {
		LOG_ERR(&amp;quot;Failed to register authorization callbacks.&amp;quot;);
		return 0;
	}

	err = bt_conn_auth_info_cb_register(&amp;amp;conn_auth_info_callbacks);
	if (err) {
		printk(&amp;quot;Failed to register authorization info callbacks.\n&amp;quot;);
		return 0;
	}

	if (IS_ENABLED(CONFIG_SETTINGS))
	{
		LOG_INF(&amp;quot;CONFIG_SETTINGS enabled&amp;quot;);
	}

	if (IS_ENABLED(CONFIG_BT_SETTINGS))
	{
		LOG_INF(&amp;quot;CONFIG_BT_SETTINGS enabled&amp;quot;);
	}

	err = bt_enable(NULL);
	if (err) {
		LOG_ERR(&amp;quot;Bluetooth init failed (err %d)&amp;quot;, err);
		return 0;
	}
	LOG_INF(&amp;quot;Bluetooth initialized&amp;quot;);

	if (IS_ENABLED(CONFIG_SETTINGS)) {
		settings_load();
	}

	err = scan_init();
	if (err != 0) {
		LOG_ERR(&amp;quot;scan_init failed (err %d)&amp;quot;, err);
		return 0;
	}

	err = nus_client_init();
	if (err != 0) {
		LOG_ERR(&amp;quot;nus_client_init failed (err %d)&amp;quot;, err);
		return 0;
	}

	printk(&amp;quot;Starting Bluetooth Central UART example\n&amp;quot;);

	err = bt_scan_start(BT_SCAN_TYPE_SCAN_ACTIVE);
	if (err) {
		LOG_ERR(&amp;quot;Scanning failed to start (err %d)&amp;quot;, err);
		return 0;
	}

	LOG_INF(&amp;quot;Scanning successfully started&amp;quot;);

	int blink_status = 0;
	int64_t time_stamp;
	for (;;)
	{
		dk_set_led(LED_2_BLUE, (++blink_status) % 2);

		// Wait 5 seconds for data. If no data, send &amp;quot;heartbeat&amp;quot; message.
		struct uart_data_t *buf = k_fifo_get(&amp;amp;fifo_uart_rx_data, K_SECONDS(5));

		if (!default_conn &amp;amp;&amp;amp; !buf)
		{
			// No connection and k_fifo_get timed out. Try again later.
			continue;
		}

		// k_fifo_get timed out, but we are connected, send heartbeat.
		if (default_conn &amp;amp;&amp;amp; !buf)
		{
			buf = k_malloc(sizeof(*buf));
			time_stamp = k_uptime_get();
			sprintf((char*)(&amp;amp;buf-&amp;gt;data), &amp;quot;Hello from Dongle: %&amp;quot; PRId64 &amp;quot;\n\r&amp;quot;, time_stamp);
			buf-&amp;gt;len = (uint16_t)strlen(buf-&amp;gt;data);
		}

		err = bt_nus_client_send(&amp;amp;nus_client, buf-&amp;gt;data, buf-&amp;gt;len);
		if (err) {
			LOG_WRN(&amp;quot;Failed to send data over BLE connection&amp;quot;
				&amp;quot;(err %d)&amp;quot;, err);
		}

		err = k_sem_take(&amp;amp;nus_write_sem, NUS_WRITE_TIMEOUT);
		if (err) {
			LOG_WRN(&amp;quot;NUS send timeout&amp;quot;);
		}
	}

	return 0;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;prj.conf&lt;/strong&gt; (only works on the good dongle)&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_CONSOLE=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT=&amp;quot;Zephyr CDC ACM + BLE NUS Client&amp;quot;
CONFIG_USB_DEVICE_PID=0x0001
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_LINE_CTRL=y
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n


CONFIG_DK_LIBRARY=y


# From Central UART Sample:
# Enable the BLE stack with GATT Client configuration
CONFIG_BT=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_SMP=y
CONFIG_BT_GATT_CLIENT=y

# Enable the BLE modules from NCS
CONFIG_BT_NUS_CLIENT=y
CONFIG_BT_SCAN=y
CONFIG_BT_SCAN_FILTER_ENABLE=y
CONFIG_BT_SCAN_UUID_CNT=1
CONFIG_BT_GATT_DM=y
CONFIG_HEAP_MEM_POOL_SIZE=2048

# This example requires more workqueue stack
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

# Enable bonding
CONFIG_BT_SETTINGS=y
CONFIG_FLASH=y
CONFIG_FLASH_PAGE_LAYOUT=y
CONFIG_FLASH_MAP=y
CONFIG_NVS=y
CONFIG_SETTINGS=y

# Config logger
CONFIG_LOG=y
# CONFIG_LOG_BACKEND_UART=n
CONFIG_LOG_PRINTK=y

CONFIG_ASSERT=y

# Coded PHY
# CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_USER_PHY_UPDATE=y
CONFIG_BT_CTLR_PHY_CODED=y
CONFIG_BT_CTLR_ADV_EXT=y
CONFIG_BT_PHY_UPDATE=y
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;prj_no_settings.conf &lt;/strong&gt;(this one works on the bad dongle)&lt;br /&gt;&lt;pre class="ui-code" data-mode="text"&gt;CONFIG_CONSOLE=y
CONFIG_STDOUT_CONSOLE=y
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT=&amp;quot;Zephyr CDC ACM + BLE NUS Client (no settings)&amp;quot;
CONFIG_USB_DEVICE_PID=0x0001
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_LINE_CTRL=y
CONFIG_USB_DEVICE_INITIALIZE_AT_BOOT=n


CONFIG_DK_LIBRARY=y


# From Central UART Sample:
# Enable the BLE stack with GATT Client configuration
CONFIG_BT=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_SMP=y
CONFIG_BT_GATT_CLIENT=y

# Enable the BLE modules from NCS
CONFIG_BT_NUS_CLIENT=y
CONFIG_BT_SCAN=y
CONFIG_BT_SCAN_FILTER_ENABLE=y
CONFIG_BT_SCAN_UUID_CNT=1
CONFIG_BT_GATT_DM=y
CONFIG_HEAP_MEM_POOL_SIZE=2048

# This example requires more workqueue stack
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048

# Enable bonding
CONFIG_SETTINGS=n
CONFIG_BT_SETTINGS=n
CONFIG_FLASH=n
CONFIG_FLASH_PAGE_LAYOUT=n
CONFIG_FLASH_MAP=n
CONFIG_NVS=n

# Config logger
CONFIG_LOG=y
# CONFIG_LOG_BACKEND_UART=n
CONFIG_LOG_PRINTK=y

CONFIG_ASSERT=y

# Coded PHY
# CONFIG_BT_DEBUG_LOG=y
CONFIG_BT_EXT_ADV=y
CONFIG_BT_USER_PHY_UPDATE=y
CONFIG_BT_CTLR_PHY_CODED=y
CONFIG_BT_CTLR_ADV_EXT=y
CONFIG_BT_PHY_UPDATE=y
&lt;/pre&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item><item><title>RE: nRF52840 Dongle bluetooth init deadlock (EDEADLK), potential HW problem?</title><link>https://devzone.nordicsemi.com/thread/460529?ContentTypeID=1</link><pubDate>Fri, 15 Dec 2023 11:59:24 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:c393d212-224e-4340-9347-e01208645b4e</guid><dc:creator>Marte Myrvold</dc:creator><description>&lt;p&gt;Hi,&lt;/p&gt;
&lt;p&gt;Are you able to run other Bluetooth samples on the failing dongle, other than the sniffer?&lt;/p&gt;
&lt;p&gt;Best regards,&lt;br /&gt;Marte&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>