I've tried to run a program which allows to run mesh provisioner, among with Direction Finding connectionless locator.
I was using mesh provisioner example from Zephyr, and previously tested it on nRF52840 - it seemed to be working fine. However when I'm trying to run it on nRF5340, I have an error "Failed enabling advertiser" when running bt_ready_provisioner.
Code for that function is mostly the same as from example (from separate .c file):
int bt_ready_prov(const struct bt_mesh_prov *prov,
const struct bt_mesh_comp *comp)
{
uint8_t net_key[16], dev_key[16];
int err;
err = bt_mesh_init(prov, comp);
if (err) {
printk("Initializing mesh failed (err %d)\n", err);
return err;
}
err = bt_set_name("nRF 52840");
if (err) {
printk("Setting new name failed (err %d)\n", err);
return err;
}
printk("Mesh initialized\n");
if (IS_ENABLED(CONFIG_BT_SETTINGS)) {
printk("Loading stored settings\n");
err = settings_load();
if (err) {
printk("failed err %d\n", err);
} else {
printk("Loaded successfully\n");
}
}
bt_rand(net_key, 16);
err = bt_mesh_cdb_create(net_key);
if (err == -EALREADY) {
printk("Using stored CDB\n");
} else if (err) {
printk("Failed to create CDB (err %d)\n", err);
return err;
} else {
printk("Created CDB\n");
setup_cdb();
}
bt_rand(dev_key, 16);
err = bt_mesh_provision(net_key, BT_MESH_NET_PRIMARY, 0, 0, self_addr,
dev_key);
if (err == -EALREADY) {
printk("Using stored settings\n");
} else if (err) {
printk("Provisioning failed (err %d)\n", err);
return err;
} else {
printk("Provisioning completed\n");
}
return 0;
}
Main function:
void main(void)
{
static struct k_work button_work;
int err = -1;
printk("Initializing...\n");
LOG_INF(CONFIG_BOARD);
if (IS_ENABLED(CONFIG_HWINFO)) {
err = hwinfo_get_device_id(dev_uuid, sizeof(dev_uuid));
}
if (err < 0) {
dev_uuid[0] = 0xdd;
dev_uuid[1] = 0xdd;
}
err = board_init(&button_work);
if (err) {
printk("Board init failed (err: %d)\n", err);
return;
}
printk("Version: 2.3.3.15\n");
os_mgmt_register_group();
img_mgmt_register_group();
smp_bt_register();
/* Initialize the Bluetooth Subsystem and mesh stack as provisioner */
err = bt_enable(NULL);
if (err) {
printk("Bluetooth init or mesh failed (err %d)\n", err);
}
err = bt_ready_prov(&provisioner, &comp);
if (err) {
LOG_ERR("BT Mesh provisioner failed: %d\n", err);
}
threads_init();
LOG_INF("Launched successfully");
}
threads_init():
static void threads_init(void) {
printk("Initialising uuid_print_thread...\n");
uuid_thread_tid = k_thread_create(&uuid_thread, uuid_stack, K_THREAD_STACK_SIZEOF(uuid_stack), (k_thread_entry_t) uuid_print_thread,
NULL, NULL, NULL, UUID_THREAD_PRIORITY, 0, K_NO_WAIT);
#if defined(CONFIG_BOARD_NRF5340DK_NRF5340_CPUAPP) && defined(CONFIG_BT_DF)
scan_init();
printk("Initialising reading direction thread...\n");
direction_finding_tid = k_thread_create(&direction_thread, direction_finding_stack, K_THREAD_STACK_SIZEOF(direction_finding_stack),
(k_thread_entry_t) reading_direction,
NULL, NULL, NULL, DF_RX_PRIORITY, 0, K_NO_WAIT); //regular thread
k_thread_name_set(prov_wfb_thread, "DF launched");
#endif // defined(CONFIG_BOARD_NRF5340DK_NRF5340_CPUAPP) && defined(CONFIG_BT_DF)
printk("Initialising wfb_thread...\n");
prov_wfb_thread = k_thread_create(&prov_thread, prov_stack, K_THREAD_STACK_SIZEOF(prov_stack), wait_for_beacon_thread,
NULL, NULL, NULL, PROV_PRIORITY, 0, K_NO_WAIT); //regular thread
k_thread_name_set(prov_wfb_thread, "Prov Beacon");
}
Output when running looks like this:
*** Booting Zephyr OS build v2.7.99-ncs1 *** Initializing... [00:00:00.016,784] [0m<inf> mesh_main: nrf5340dk_nrf5340_cpuapp[0m Version: 2.3.3.15 [00:00:00.022,064] [0m<inf> fs_nvs: 2 Sectors of 4096 bytes[0m [00:00:00.022,094] [0m<inf> fs_nvs: alloc wra: 0, ec0[0m [00:00:00.022,094] [0m<inf> fs_nvs: data wra: 0, 200[0m [00:00:00.058,166] [0m<inf> bt_hci_core: HCI: version 5.2 (0x0b) revision 0x2190, manufacturer 0x0059[0m [1;31m--- 8 messages dropped --- [0m[00:00:00.058,197] [0m<inf> bt_hci_core: LMP: version 5.2 (0x0b) subver 0x2190[0m [00:00:00.060,546] [1;33m<wrn> bt_hci_core: opcode 0x2036 status 0x01[0m [00:00:00.060,577] [1;31m<err> bt_mesh_main: Failed enabling advertiser[0m Loaded successfully Using stored CDB [00:00:00.063,568] [0m<inf> bt_mesh_main: Primary Element: 0x0001[0m [00:00:00.063,568] [0m<dbg> bt_mesh_main.bt_mesh_provision: net_idx 0x0000 flags 0x00 iv_index 0x0000[0m Using stored settings Initialising uuid_print_thread... Starting Connectionless Locator success. Initialising reading direction thread... Initialising wfb_thread... [00:00:00.063,812] [0m<inf> mesh_main: Launched successfully[0m [00:00:00.064,666] [0m<inf> mesh_main: UUID Print thread entered[0m [00:00:00.064,697] [0m<inf> mesh_main: UUID: be95250522343f3f0000000000000000[0m [00:00:00.064,758] [0m<inf> direction_rx: Start scanning...[0m [00:00:00.066,314] [0m<inf> provisioner: Waiting for unprovisioned beacon...[0m [00:00:00.067,810] [1;33m<wrn> bt_hci_core: opcode 0x2041 status 0x01[0m [00:00:00.067,810] [0m<inf> direction_rx: failed (err -5) [0m [00:00:00.067,840] [0m<inf> direction_rx: Waiting for periodic advertising...
I don't know what's wrong with it, considering it worked well on nRF52840. Is there anything I'm missing?