Insufficient resources warning when connecting

Hi Devzone,

On my nrf52840-based custom board, I am implementing the scanning of devices broadcasting the Heart Rate service while advertising a custom service and connecting to another Central device. In order to do this I based myself off of the Central and Peripheral HRS example:

developer.nordicsemi.com/.../README.html

I can advertise my custom service, connect to it, and send commands to start scanning, however, when I connect to my board (my board acting as a peripheral in that case), I get the following warning:

[00:00:16.727,966] <inf> BLE_MANAGER: Connected 44:1C:A8:E2:B6:96 (public)
[00:00:16.729,675] <wrn> bt_hci_core: opcode 0x2039 status 0x0d

Even though it works as expected for now, I would like to get rid of the error message. The status states BT_HCI_ERR_INSUFFICIENT_RESOURCES, and from what I've found, the opcode 0x2039 stands for BT_HCI_OP_LE_SET_EXT_ADV_ENABLE (I do have CONFIG_BT_EXT_ADV enabled in my prj.conf). Do you have an idea where this warning originates from ?

Here is the ble_manager.c file that handles the ble connections:

#include "include/ble_manager.h"

LOG_MODULE_REGISTER(BLE_MANAGER, LOG_LEVEL_DBG);

static const struct bt_data ad[] = {
	BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE,
		(CONFIG_BT_DEVICE_APPEARANCE >> 0) & 0xff,
		(CONFIG_BT_DEVICE_APPEARANCE >> 8) & 0xff),
	BT_DATA_BYTES(BT_DATA_FLAGS, (BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR)),
	BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
	BT_DATA_BYTES(BT_DATA_UUID16_ALL,
		      BT_UUID_16_ENCODE(BT_UUID_HRS_VAL),
		      BT_UUID_16_ENCODE(BT_UUID_BAS_VAL)),
};

static const struct bt_data sd[] = {
	BT_DATA_BYTES(BT_DATA_UUID128_ALL, BT_UUID_EQS_SERVICE_VAL),
};

K_MSGQ_DEFINE(hrs_queue, sizeof(struct bt_hrs_client_measurement), HRS_QUEUE_SIZE, 4);

static K_SEM_DEFINE(ble_init_ok, 0, 1);

static struct bt_hrs_client hrs_c;
static struct bt_conn *current_conn_as_peripheral;
static struct bt_conn *current_hrs_conn_as_central;
static struct bt_conn *auth_conn;
static ble_manager_evt_handler_t m_app_evt_handler;

static bool _scan_in_progress = false;

static const char * const sensor_location_str[] = {
	"Other",
	"Chest",
	"Wrist",
	"Finger",
	"Hand",
	"Ear lobe",
	"Foot"
};

static void hrs_sensor_location_read_cb(struct bt_hrs_client *hrs_c,
					enum bt_hrs_client_sensor_location location,
					int err)
{
	if (err) {
		LOG_ERR("HRS Sensor Body Location read error (err %d)", err);
		return;
	}

	LOG_INF("Heart Rate Sensor body location: %s", sensor_location_str[location]);
}

static void hrs_measurement_notify_cb(struct bt_hrs_client *hrs_c,
				      const struct bt_hrs_client_measurement *meas,
				      int err)
{
	if (err) {
		LOG_ERR("Error during receiving Heart Rate Measurement notification, err: %d",
			err);
		return;
	}

	LOG_DBG("Heart Rate Measurement notification received:");
	LOG_DBG("Heart Rate Measurement Value Format: %s",
		meas->flags.value_format ? "16 - bit" : "8 - bit");
	LOG_DBG("Sensor Contact detected: %d", meas->flags.sensor_contact_detected);
	LOG_DBG("Sensor Contact supported: %d", meas->flags.sensor_contact_supported);
	LOG_DBG("Energy Expended present: %d", meas->flags.energy_expended_present);
	LOG_DBG("RR-Intervals present: %d", meas->flags.rr_intervals_present);

	LOG_DBG("Heart Rate Measurement Value: %d bpm", meas->hr_value);

	if (meas->flags.energy_expended_present) {
		LOG_DBG("Energy Expended: %d J", meas->energy_expended);
	}

	if (meas->flags.rr_intervals_present) {
		LOG_DBG("RR-intervals: ");
		for (size_t i = 0; i < meas->rr_intervals_count; i++) {
			LOG_DBG("%d ", meas->rr_intervals[i]);
		}
	}

	err = k_msgq_put(&hrs_queue, meas, K_NO_WAIT);
	if (err) {
		LOG_ERR("Notification queue is full. Discarding HRS notification (err %d)", err);
	}
}

static void discovery_completed_cb(struct bt_gatt_dm *dm,
				   void *context)
{
	int err;

	LOG_DBG("The discovery procedure succeeded");

	bt_gatt_dm_data_print(dm);

	err = bt_hrs_client_handles_assign(dm, &hrs_c);
	if (err) {
		LOG_ERR("Could not init HRS client object (err %d)", err);
		return;
	}

	err = bt_hrs_client_sensor_location_read(&hrs_c, hrs_sensor_location_read_cb);
	if (err) {
		LOG_ERR("Could not read Heart Rate Sensor location (err %d)", err);
	}

	err = bt_hrs_client_measurement_subscribe(&hrs_c, hrs_measurement_notify_cb);
	if (err) {
		LOG_ERR("Could not subscribe to Heart Rate Measurement characteristic (err %d)",
		       err);
	}

	err = bt_gatt_dm_data_release(dm);
	if (err) {
		LOG_ERR("Could not release the discovery data (err %d)", err);
	}
}

static void discovery_not_found_cb(struct bt_conn *conn,
				   void *context)
{
	LOG_WRN("Heart Rate Service could not be found during the discovery");
}

static void discovery_error_found_cb(struct bt_conn *conn,
				     int err, void *context)
{
	LOG_ERR("The discovery procedure failed with %d", err);
}

static const struct bt_gatt_dm_cb discovery_cb = {
	.completed = discovery_completed_cb,
	.service_not_found = discovery_not_found_cb,
	.error_found = discovery_error_found_cb
};

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

	err = bt_gatt_dm_start(conn, BT_UUID_HRS, &discovery_cb, NULL);
	if (err) {
		LOG_ERR("Could not start the discovery procedure, error "
			   "code: %d", err);
	}
}

static void mtu_exchange_cb(struct bt_conn *conn, uint8_t err,
			    struct bt_gatt_exchange_params *params)
{
	LOG_INF("%s: MTU exchange %s (%u)", __func__,
	       err == 0U ? "successful" : "failed",
	       bt_gatt_get_mtu(conn));
}

static struct bt_gatt_exchange_params mtu_exchange_params = {
	.func = mtu_exchange_cb
};

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

	if (err)
	{
		LOG_ERR("Connection failed (err %u)", err);
		return;
	}

	bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
	LOG_INF("Connected %s", addr);
	app_event_t event;
	event.type = EVENT_BLE_CONNECTION;

	bt_conn_get_info(conn, &info);
	if (info.role == BT_CONN_ROLE_PERIPHERAL) {
		
		event.data = BLE_CONNECTED;
		current_conn_as_peripheral = bt_conn_ref(conn);

		int ret = bt_gatt_exchange_mtu(conn, &mtu_exchange_params);
		if (ret) {
			LOG_ERR("%s: MTU exchange failed (err %d)", __func__, err);
		}
	} else if (info.role == BT_CONN_ROLE_CENTRAL) {
		event.data = BLE_HRS_CONNECTED;
		// Don't ref the connection here, it's already done in scan_connecting.
		gatt_discover(conn);
		_scan_in_progress = false;
	}
	app_post_event(event);
}

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

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

	LOG_INF("Disconnected: %s (reason %u)", addr, reason);
	app_event_t event;
	event.type = EVENT_BLE_CONNECTION;
	if (conn == auth_conn)
	{
		bt_conn_unref(auth_conn);
		auth_conn = NULL;
	}

	if (conn == current_conn_as_peripheral)
	{
		event.data = BLE_DISCONNECTED;
		bt_conn_unref(conn);
		current_conn_as_peripheral = NULL;
	}

	if (conn == current_hrs_conn_as_central){
		event.data = BLE_HRS_DISCONNECTED;
		bt_conn_unref(conn);
		current_hrs_conn_as_central = NULL;
	}
	app_post_event(event);
}

#ifdef CONFIG_EQS_SERVICE_SECURITY_ENABLED
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_DBG("Security changed: %s level %u", addr, level);
	}
	else
	{
		LOG_ERR("Security failed: %s level %u err %d", addr,
				level, err);
	}
}
#endif

BT_CONN_CB_DEFINE(conn_callbacks) = {
	.connected = connected,
	.disconnected = disconnected,
#ifdef CONFIG_EQS_SERVICE_SECURITY_ENABLED
	.security_changed = security_changed,
#endif
};

#if defined(CONFIG_EQS_SERVICE_SECURITY_ENABLED)
static void auth_passkey_display(struct bt_conn *conn, unsigned int passkey)
{
	char addr[BT_ADDR_LE_STR_LEN];

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

	LOG_DBG("Passkey for %s: %06u", addr, passkey);
}

static void auth_passkey_confirm(struct bt_conn *conn, unsigned int passkey)
{
	char addr[BT_ADDR_LE_STR_LEN];

	auth_conn = bt_conn_ref(conn);

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

	LOG_DBG("Passkey for %s: %06u", addr, passkey);
	LOG_DBG("Press Button 1 to confirm, Button 2 to reject.");
}

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_DBG("Pairing cancelled: %s", 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_DBG("Pairing completed: %s, bonded: %d", 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_DBG("Pairing failed conn: %s, reason %d", addr, reason);
}

static struct bt_conn_auth_cb conn_auth_callbacks = {
	.passkey_display = auth_passkey_display,
	.passkey_confirm = auth_passkey_confirm,
	.cancel = auth_cancel,
};

static struct bt_conn_auth_info_cb conn_auth_info_callbacks = {
	.pairing_complete = pairing_complete,
	.pairing_failed = pairing_failed};
#else
static struct bt_conn_auth_cb conn_auth_callbacks;
static struct bt_conn_auth_info_cb conn_auth_info_callbacks;
#endif

struct bt_le_scan_param scan_param = {
	.type       = BT_HCI_LE_SCAN_PASSIVE,
	.options    = BT_LE_SCAN_OPT_NONE,
	.interval   = 0x0010,
	.window     = 0x0010,
	.timeout	= 1000,	// N*10ms => timeout = 10s
};

static int scan_start(void)
{
	LOG_DBG("Starting scanning for HRS devices");
	int err = bt_le_scan_start(&scan_param, NULL);

	if (err) {
		LOG_ERR("Scanning failed to start (err %d)", err);
		return err;
	}

	_scan_in_progress = true;
	return err;
}

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

	bt_addr_le_to_str(device_info->recv_info->addr, addr, sizeof(addr));

	LOG_INF("Filters matched. Address: %s connectable: %d",
		   addr, connectable);
}

static void scan_connecting_error(struct bt_scan_device_info *device_info)
{
	LOG_WRN("Connecting failed");
}

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

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

static void scan_recv(const struct bt_le_scan_recv_info *info, struct net_buf_simple *buf){
	if (info){
		char addr[BT_ADDR_LE_STR_LEN];
		bt_addr_le_to_str(info->addr, addr, sizeof(addr));
		LOG_INF("Received advertising data from %s", addr);
	}
}

static void scan_timeout(void){
	LOG_WRN("Scan timeout");
	_scan_in_progress = false;
}

struct bt_le_scan_cb scan_callback = {
	.recv = scan_recv,
	.timeout = scan_timeout,
};

static void scan_init(void)
{
	int err;

	struct bt_scan_init_param param = {
		.scan_param = NULL,
		.conn_param = BT_LE_CONN_PARAM_DEFAULT,
		.connect_if_match = 1
	};

	bt_scan_init(&param);
	bt_scan_cb_register(&scan_cb);
	bt_le_scan_cb_register(&scan_callback);

	err = bt_scan_filter_add(BT_SCAN_FILTER_TYPE_UUID, BT_UUID_HRS);
	if (err) {
		LOG_ERR("Scanning filters cannot be set (err %d)", err);
	}

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

static void bt_receive_cb(struct bt_conn *conn, const uint8_t *const data,
						  uint16_t len)
{
	char addr[BT_ADDR_LE_STR_LEN] = {0};

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

	ble_eqss_control_process(data, len);
}

static void bt_subscribe_cb(enum eqs_service_send_status status)
{
	return;
}

static void bt_subscribe_cb_processed(enum eqs_service_send_status status)
{
	sync_mgr_char_ind(AREA_PROCESSED, status == EQS_SERVICE_SEND_STATUS_ENABLED ? true : false);
}

static void bt_subscribe_cb_raw_imu(enum eqs_service_send_status status)
{
	sync_mgr_char_ind(AREA_RAW_IMU, status == EQS_SERVICE_SEND_STATUS_ENABLED ? true : false);
}

static void bt_subscribe_cb_raw_ecg(enum eqs_service_send_status status)
{
	sync_mgr_char_ind(AREA_RAW_ECG, status == EQS_SERVICE_SEND_STATUS_ENABLED ? true : false);
}

static void bt_subscribe_cb_storage(enum eqs_service_send_status status)
{
	sync_mgr_char_ind(AREA_STORAGE, status == EQS_SERVICE_SEND_STATUS_ENABLED ? true : false);
}

static struct eqs_service_cb eqs_cb = {
	.control_received = bt_receive_cb,
	.control_send_enabled = bt_subscribe_cb,
	.processed_send_enabled = bt_subscribe_cb_processed,
	.raw_imu_send_enabled = bt_subscribe_cb_raw_imu,
	.raw_ecg_send_enabled = bt_subscribe_cb_raw_ecg,
	.storage_send_enabled = bt_subscribe_cb_storage,
};

#ifdef CONFIG_EQS_SERVICE_SECURITY_ENABLED
static void num_comp_reply(bool accept)
{
	if (accept)
	{
		bt_conn_auth_passkey_confirm(auth_conn);
		LOG_DBG("Numeric Match, conn %p", (void *)auth_conn);
	}
	else
	{
		bt_conn_auth_cancel(auth_conn);
		LOG_DBG("Numeric Reject, conn %p", (void *)auth_conn);
	}

	bt_conn_unref(auth_conn);
	auth_conn = NULL;
}

void button_changed(uint32_t button_state, uint32_t has_changed)
{
	uint32_t buttons = button_state & has_changed;

	if (auth_conn)
	{
		if (buttons & KEY_PASSKEY_ACCEPT)
		{
			num_comp_reply(true);
		}

		if (buttons & KEY_PASSKEY_REJECT)
		{
			num_comp_reply(false);
		}
	}
}
#endif /* CONFIG_EQS_SERVICE_SECURITY_ENABLED */


bool ble_manager_is_connected()
{
	return current_conn_as_peripheral != NULL;
}

bool ble_manager_control_is_subscribed(){
	return bt_gatt_is_subscribed(current_conn_as_peripheral, bt_gatt_find_by_uuid(NULL, 1, BT_UUID_CONTROL), BT_GATT_CCC_INDICATE);
}

uint32_t ble_mgr_eqss_processed_data(app_pkt_data_t* pkt, uint16_t len){
	return processed_send(NULL, pkt->bytes, len);
}

uint32_t ble_mgr_eqss_raw_imu(app_pkt_data_t* pkt, uint16_t len){
	return raw_imu_send(NULL, pkt->bytes, len);
}

uint32_t ble_mgr_eqss_raw_ecg(app_pkt_data_t* pkt, uint16_t len){
	return raw_ecg_send(NULL, pkt->bytes, len);
}

uint32_t ble_mgr_eqss_storage(app_pkt_data_t* pkt, uint16_t len){
	return storage_send(NULL, pkt->bytes, len);
}

uint32_t ble_manager_start_hrs_scan()
{
	int err = 0;

	err = scan_start();
	if (err)
	{
		LOG_ERR("Error launching scan");
		return 0;
	}
	return 1;
}

uint32_t ble_manager_stop_hrs_scan()
{
	int err = 0;

	if (_scan_in_progress) {
		LOG_DBG("Stopping scanning for HRS devices");
		err = bt_le_scan_stop();
		if (err)
		{
			LOG_ERR("Error stopping scan");
			return 0;
		}
	}
	else {
		// No scan in progress
		if (current_hrs_conn_as_central){
			// There is an active connection with a HR device.
			bt_conn_disconnect(current_hrs_conn_as_central, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
		}
	}
	_scan_in_progress = false;
	return 1;
}

uint32_t ble_manager_start_advertising()
{
	int err = 0;
	err = bt_le_adv_start(BT_LE_ADV_CONN, ad, ARRAY_SIZE(ad), sd,
						  ARRAY_SIZE(sd));
	if (err)
	{
		if (err == -EALREADY)
		{
			LOG_DBG("Advertising already started.");
		}
		else
		{
			LOG_ERR("Advertising failed to start (err %d)", err);
			return 0;
		}
	}
	return 1;
}

uint32_t ble_manager_stop_advertising()
{
	int err = 0;
	err = bt_le_adv_stop();
	if (err)
	{
		if (err == -EALREADY)
		{
			LOG_DBG("Advertising already stopped.");
		}
		else
		{
			LOG_ERR("Advertising failed to stop (err %d)", err);
			return 0;
		}
	}
	return 1;
}

uint32_t ble_manager_disconnect()
{
	int err = 0;
	if (current_conn_as_peripheral)
	{
		err = bt_conn_disconnect(current_conn_as_peripheral, BT_HCI_ERR_REMOTE_USER_TERM_CONN);
		if (err)
		{
			LOG_ERR("Failed to disconnect (err %d)", err);
			return 0;
		}
	}
	return 1;
}

uint8_t ble_manager_init()
{
	int err = 0;

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

		err = bt_conn_auth_info_cb_register(&conn_auth_info_callbacks);
		if (err)
		{
			LOG_ERR("Failed to register authorization info callbacks.");
			return 0;
		}
	}

	err = bt_enable(NULL);
	if (err)
	{
		LOG_ERR("Error enabling the Bluetooth stack...");
	}

	LOG_INF("Bluetooth initialized");

	k_sem_give(&ble_init_ok);

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

	err = eqs_service_init(&eqs_cb);
	if (err)
	{
		LOG_ERR("Failed to initialize EQS service (err: %d)", err);
		return 0;
	}

	err = bt_hrs_client_init(&hrs_c);
	if (err) {
		LOG_ERR("Heart Rate Service client failed to init (err %d)", err);
		return 0;
	}
	
	scan_init();

	return 1;
}

static void hrs_notify_thread(void)
{
	struct bt_hrs_client_measurement meas;
	uint16_t heart_rate;

	k_sem_take(&ble_init_ok, K_FOREVER);

	while (1) {
		k_msgq_get(&hrs_queue, &meas, K_FOREVER);

		if (meas.flags.value_format) {
			heart_rate = (uint8_t)(meas.hr_value >> 0x08);
		} else {
			heart_rate = meas.hr_value;
		}

		bt_hrs_notify(heart_rate);
	}
}

void ble_mgr_start(ble_manager_evt_handler_t app_handler)
{

    m_app_evt_handler = app_handler;

}


K_THREAD_DEFINE(hrs_notify_thread_id, 1024, hrs_notify_thread,
		NULL, NULL, NULL, 7, 0, 0);

And the proj.conf file if that's relevant:

# Copyright (c) 2021 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0
#
# This file contains selected Kconfig options for the application.

CONFIG_SENSOR=y

# Config for Immutable Secure Bootloader
CONFIG_SECURE_BOOT=n
CONFIG_B0_MIN_PARTITION_SIZE=n

# Config for Upgradable Bootloader
CONFIG_BOOTLOADER_MCUBOOT=n
CONFIG_BUILD_S1_VARIANT=n

# enable logging
CONFIG_LOG=y
CONFIG_LOG_INFO_COLOR_GREEN=y
CONFIG_LOG_MODE_IMMEDIATE=y

# enable Hardware info
CONFIG_HWINFO=y
CONFIG_HWINFO_NRF=y

# enable ADC
CONFIG_ADC=y
CONFIG_ADC_NRFX_SAADC=y

# enable SPI
CONFIG_SPI=y
CONFIG_SPI_NOR=y

# enabling State Machine Framework and events
CONFIG_SMF=y
CONFIG_EVENTS=y
CONFIG_SMF_ANCESTOR_SUPPORT=y

# enabling Bluetooth: both central an peripheral mode.
CONFIG_BT=y
CONFIG_BT_PERIPHERAL=y
CONFIG_BT_CENTRAL=y
CONFIG_BT_DEVICE_NAME="Zephyr"
CONFIG_BT_DEVICE_APPEARANCE=5184
# 5184 means Generic Outdoor Sports Activity. Complete list of appearance values can be found on the Bluetooth website under "assigned values" : https://www.bluetooth.com/specifications/assigned-numbers/
CONFIG_BT_MAX_CONN=2
CONFIG_BT_MAX_PAIRED=2
CONFIG_BT_GATT_CLIENT=y
CONFIG_BT_L2CAP_TX_MTU=247
CONFIG_BT_BUF_ACL_RX_SIZE=251
CONFIG_BT_EXT_ADV=y

CONFIG_BT_SMP=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=512

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

# enabling BAS service and HRS service
CONFIG_BT_BAS=y
CONFIG_BT_HRS=y
CONFIG_BT_HRS_CLIENT=y

# This example requires more workqueue stack
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=4096

CONFIG_ASSERT=y

# Enable the UART driver (for the BG77 UART?)
CONFIG_UART_ASYNC_API=n
CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_NRFX_UARTE0=y

# Enbale Ring Buffer
CONFIG_RING_BUFFER=y

# Config for enabling newlib C
CONFIG_NEWLIB_LIBC=y
CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y

# Enabling FPU
CONFIG_FPU=y


CONFIG_MAIN_STACK_SIZE=4096
CONFIG_BT_RX_STACK_SIZE=4096
CONFIG_BT_HCI_TX_STACK_SIZE_WITH_PROMPT=y
CONFIG_BT_HCI_TX_STACK_SIZE=4096
#CONFIG_THREAD_ANALYZER=y
#CONFIG_THREAD_ANALYZER_AUTO=y
#CONFIG_THREAD_ANALYZER_USE_LOG=y
#CONFIG_THREAD_NAME=y

#Enable Power Off of the device
CONFIG_POWEROFF=y
CONFIG_PM_DEVICE=y

# USB
CONFIG_STDOUT_CONSOLE=y
CONFIG_USB_DEVICE_STACK=y
CONFIG_USB_DEVICE_PRODUCT="test"
CONFIG_USB_DEVICE_PID=0x0001
CONFIG_USB_DRIVER_LOG_LEVEL_ERR=y
CONFIG_USB_DEVICE_LOG_LEVEL_ERR=y
CONFIG_UART_LINE_CTRL=y

# Enable MBED TFM PSA for hash and crypto
CONFIG_MBEDTLS=y
CONFIG_MBEDTLS_BUILTIN=y
CONFIG_MBEDTLS_CFG_FILE="config-tls-generic.h"
CONFIG_MBEDTLS_ENTROPY_ENABLED=y
CONFIG_MBEDTLS_PSA_CRYPTO_C=y
CONFIG_MBEDTLS_ZEPHYR_ENTROPY=y

Related