Hi all,
I am trying to perform a FOTA upgrade over BLE with an nRF52832.
I started with the zephyr sample "peripheral_dis" at zephyr/samples/bluetooth, and then followed all the steps here:
https://developer.nordicsemi.com/nRF_Connect_SDK/doc/2.1.2/nrf/ug_nrf52.html#fota-over-bluetooth-le
I'm using the app nRF Connect on my tablet, when connecting to my device I see the DFU option and then I select the app_update.bin file.
it gets stacked in "Connecting".
My code:
main.c
#include <zephyr/types.h> #include <stddef.h> #include <string.h> #include <errno.h> #include <zephyr/sys/printk.h> #include <zephyr/sys/byteorder.h> #include <zephyr/zephyr.h> #include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/hci.h> #include <zephyr/bluetooth/conn.h> #include <zephyr/bluetooth/uuid.h> #include <zephyr/bluetooth/gatt.h> #include <zephyr/settings/settings.h> 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_16_ENCODE(BT_UUID_DIS_VAL)), }; static void connected(struct bt_conn *conn, uint8_t err) { if (err) { printk("Connection failed (err 0x%02x)\n", err); } else { printk("Connected\n"); } } static void disconnected(struct bt_conn *conn, uint8_t reason) { printk("Disconnected (reason 0x%02x)\n", reason); } BT_CONN_CB_DEFINE(conn_callbacks) = { .connected = connected, .disconnected = disconnected, }; static int settings_runtime_load(void) { #if defined(CONFIG_BT_DIS_SETTINGS) settings_runtime_set("bt/dis/model", "Zephyr Model 2", sizeof("Zephyr Model 3")); settings_runtime_set("bt/dis/manuf", "Zephyr Manufacturer", sizeof("Zephyr Manufacturer")); #if defined(CONFIG_BT_DIS_SERIAL_NUMBER) settings_runtime_set("bt/dis/serial", CONFIG_BT_DIS_SERIAL_NUMBER_STR, sizeof(CONFIG_BT_DIS_SERIAL_NUMBER_STR)); #endif #if defined(CONFIG_BT_DIS_SW_REV) settings_runtime_set("bt/dis/sw", CONFIG_BT_DIS_SW_REV_STR, sizeof(CONFIG_BT_DIS_SW_REV_STR)); #endif #if defined(CONFIG_BT_DIS_FW_REV) settings_runtime_set("bt/dis/fw", CONFIG_BT_DIS_FW_REV_STR, sizeof(CONFIG_BT_DIS_FW_REV_STR)); #endif #if defined(CONFIG_BT_DIS_HW_REV) settings_runtime_set("bt/dis/hw", CONFIG_BT_DIS_HW_REV_STR, sizeof(CONFIG_BT_DIS_HW_REV_STR)); #endif #endif return 0; } void main(void) { int err; os_mgmt_register_group(); img_mgmt_register_group(); smp_bt_register(); err = bt_enable(NULL); if (err) { printk("Bluetooth init failed (err %d)\n", err); return; } if (IS_ENABLED(CONFIG_BT_SETTINGS)) { settings_load(); } settings_runtime_load(); printk("Bluetooth initialized\n"); err = bt_le_adv_start(BT_LE_ADV_CONN_NAME, ad, ARRAY_SIZE(ad), NULL, 0); if (err) { printk("Advertising failed to start (err %d)\n", err); return; } printk("Advertising successfully started\n"); }
prj.conf
CONFIG_BT=y CONFIG_BT_PERIPHERAL=y CONFIG_BT_DIS=y CONFIG_BT_DIS_PNP=n CONFIG_BT_DIS_MODEL="Zephyr Model 3" CONFIG_BT_DIS_MANUF="Zephyr" CONFIG_BT_DIS_SERIAL_NUMBER=y CONFIG_BT_DIS_FW_REV=y CONFIG_BT_DIS_HW_REV=y CONFIG_BT_DIS_SW_REV=y CONFIG_BT_DIS_SERIAL_NUMBER_STR="Zephyr Serial" CONFIG_BT_DIS_FW_REV_STR="Zephyr Firmware" CONFIG_BT_DIS_HW_REV_STR="Zephyr Hardware" CONFIG_BT_DIS_SW_REV_STR="Zephyr Software" CONFIG_BT_DEVICE_NAME="DIS peripheral" # Below is setup to let DIS information be read from settings CONFIG_BT_SETTINGS=y CONFIG_SETTINGS_RUNTIME=y CONFIG_SETTINGS=y CONFIG_SETTINGS_NONE=y CONFIG_BT_DIS_SETTINGS=y CONFIG_BOOTLOADER_MCUBOOT=y CONFIG_MCUBOOT_GENERATE_CONFIRMED_IMAGE=y CONFIG_MCUMGR=y CONFIG_MCUMGR_CMD_IMG_MGMT=y CONFIG_MCUMGR_CMD_OS_MGMT=y CONFIG_MCUMGR_SMP_BT=y
It's the first time I try this so I'm not sure how to continue.
Regards,
Pablo.