hi
i am working with custom board nrf52833 every thing is working good until i introduced bonding in my code.
i am using sdk 1.9.1 form my development
i released 1.01 with out bonding to customer but they asked form bonding so i implemented bonding with security level 2 and calling setting_load () function and this sofware versiion is 1.02.
if i try to do DFU with this 1.02 in nrfconnect app dfu is flashing and telling application update successfully but if i reset the power its revert back to 1.01 which has no bonding.
but if i update to 1.02 to 1.03 with updated version dfu is working and dfu updating.
my configration: in prj.confi
Memory region Used Size Region Size % age Used
FLASH: 214680 B 232960 B 92. 15%
SRAM: 74311 B 128 KB 56.69%
IDT_LIST: 0 GB 2 KB 0.00%
#ifdef CONFIG_BOOTLOADER_MCUBOOT
#include "os_mgmt/os_mgmt.h"
#include "img_mgmt/img_mgmt.h"
#endif
/*****************************************************************************
* Section: Included Files
*****************************************************************************/
#define QLENGTH 120
#define MAXDATAFRMSIZE 45
K_TIMER_DEFINE(msec_timer,msectimerCB,NULL);
K_TIMER_DEFINE(onesec,onesecCB,NULL);
tm_u8_t debugstr[DEBUGSTRLEN];
tm_u8_t sver[8] = "1.12";
rx_mcu_buff tm_rx_buff;
bt_addr_le_t mac_address[1];
tm_u8_t macadd[50];
size_t MACcount = 1;
tm_u8_t macid[18];
tm_u8_t rxbuf[2000];
uint8_t mac_id[26] = {0};
uint8_t time_cnt=0;
uint16_t rxbuflen;
char send_data[10] = {"{SHOW IMEI}"};
char rx_Buff_len[10]={"BUFF_LEN: "};
const struct device *uartDev;
struct bt_conn *conn;
static struct bt_conn *default_conn;
tm_instance_t AppInstance;
//struct uart_data uartData;
/* extern Variables */
extern tm_btctrl_t *pBtCtrl;
extern volatile int tm_flag;
extern volatile int FOTA_Flag;
struct sensor_data_type_t
{
uint8_t frame_data[45];
uint8_t frame_len;
};
static tm_u16_t g_queue_rx, g_queue_tx,RxDatandex,g_time_out;
struct sensor_data_type_t g_sensor_data[QLENGTH];
enum tm_datarxstate
{
LOOKFOR_BEGIN=0
,GET_DATA
,LOOKFOR_VEHICALID
};
typedef enum tm_datarxstate tm_datarxstate_t;
tm_datarxstate_t RxDataState;
/*******************************************************************************************************
Function:
void main(void)
Summary:
calling all the events.
Description:
This function initilize all the peripirals and ble advertise the ble device.
*********************************************************************************************************/
static void connected(struct bt_conn *conn, uint8_t err)
{
char addr[BT_ADDR_LE_STR_LEN];
int secure_level=0;
int secure_status=0;
bt_addr_le_to_str(bt_conn_get_dst(conn), addr, sizeof(addr));
if (err) {
printk("Failed to connect to %s (%u)\n\r", addr, err);
//DPRINTF(debugstr);
return;
}
else
{
printk("{Connected: %s}\n\r", addr);
//DPRINTF(debugstr);
default_conn = bt_conn_ref(conn);
secure_status=bt_conn_set_security(conn, BT_SECURITY_L2);
if(secure_status)
{
printk("Failed to set security\n\r");
}
else
{
printk("Security Enabled\n\r");
}
secure_level=bt_conn_get_security(conn);
if(secure_level != 0)
{
printk("security_level:%d\n\r",secure_level);
//DPRINTF(debugstr);
} //bharath
else
{
printk("security :ZERO(0)\n\r");
}
request_conn_param_update(conn);
}
}
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));
printk("{Disconnected: %s}\n\r", addr);
//DPRINTF(debugstr);
if (default_conn) {
bt_conn_unref(default_conn);
default_conn = NULL;}
}
BT_CONN_CB_DEFINE(conn_callbacks) = {
.connected = connected,
.disconnected = disconnected,
};
#endif
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));
printk("Passkey for %s: %06u\n\r", addr, passkey);
//DPRINTF(debugstr);
}
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));
printk("Pairing cancelled: %s\n\r", addr);
//DPRINTF(debugstr);
}
static void passkey_cb(struct bt_conn *conn, unsigned int num)
{
printk("Passkey callback: %u\n\r", num);
//DPRINTF(debugstr);
if (num == 0) {
bt_conn_auth_passkey_entry(conn, FIXED_PASSKEY); // Enter the fixed passkey
}
}
static void pairing_complete(struct bt_conn *conn, bool bonded)
{
int err;
printk("Pairing Complete\n\r");
err=settings_save();
if(err)
{
printk("failed to save settings\n\r");
}
else
{
printk("settings saved\n\r");
}
}
static void pairing_failed(struct bt_conn *conn, enum bt_security_err reason)
{
printk("Pairing Failed (%d). Disconnecting.\n\r", reason);
//DPRINTF(debugstr);
bt_conn_disconnect(conn, BT_HCI_ERR_AUTH_FAIL);
}
static void pairing_confirm(struct bt_conn *conn)
{
bt_conn_auth_pairing_confirm(conn);
printk("Pairing Confirm\n\r");
}
static void passkey_confirm (struct bt_conn *conn, unsigned int passkey)
{
bt_conn_auth_passkey_confirm(conn);
}
static void pair_delete(uint8_t id, const bt_addr_le_t *peer)
{
clear_bonds();
}
static struct bt_conn_auth_cb auth_cb_display = {
.passkey_display = auth_passkey_display,
//.passkey_entry = passkey_cb,
.passkey_confirm = passkey_confirm,
.pairing_confirm=pairing_confirm,
.cancel = auth_cancel,
.pairing_complete = pairing_complete,
.pairing_failed = pairing_failed,
.bond_deleted = pair_delete,
};
void main(void)
{
bool adv_status;
bool boot_status;
int index=0;
int err;
int settig_init_err;
int setting_load_err;
int settings_saved;
int bood_image_conform;
pBtCtrl = &AppInstance.BtCtrl;
memset(&AppInstance, 0, sizeof(AppInstance));
AppInstance.BtCtrl.bConfigUpdate = false;
/* upgrade FOTA */
#ifdef CONFIG_BOOTLOADER_MCUBOOT
os_mgmt_register_group();
img_mgmt_register_group();
#endif
#ifdef CONFIG_MCUMGR_SMP_BT
smp_bt_register();
#endif
bood_image_conform=boot_write_img_confirmed();
if(bood_image_conform)
{
printk("new image failed to boot error%d\n\r",bood_image_conform);
}
else
{
printk("-----new image confirm------\n\r");
}
boot_status=boot_is_img_confirmed();
if(!boot_status)
{
printk("boot image failed\n\r");
}
/*else
(
printk("boot image confirm\n\r");
)*/
k_timer_start(&onesec,K_SECONDS(1),K_SECONDS(1));
k_timer_start(&msec_timer,K_MSEC(20),K_MSEC(20));
uartDev = device_get_binding("UART_0"); /* uart changed to 1 to test bootloader sequence */
AppInstance.UartQTx.pUartData = &AppInstance.UartData;
InitUart(&AppInstance.UartQTx,uartDev,uart_cb);
//clear_bonds();
settig_init_err = settings_subsys_init();
if (settig_init_err)
{
printk("Failed to initialize settings subsystem (err %d)\n", settig_init_err);
}
RxDataState=LOOKFOR_BEGIN;
err=bt_enable(NULL);
if(err)
{
printk("{Bluetooth init failed (err %d)}\n\r", err);
//DPRINTF(debugstr);
return;
}
else
{
printk("{Bluetooth initialized}\n\r");
//DPRINTF(debugstr);
}
setting_load_err=settings_load();
if(setting_load_err)
{
printk("settinges loded failed:%d\n\r",setting_load_err);
}
else
{ //bharath
printk("settinges loded\n\r");
}
bt_set_bondable(true);
bt_conn_auth_cb_register(&auth_cb_display);
settings_saved=settings_save();
if(settings_saved)
{
printk("failed to save settings(error%d)\n\r",settings_saved);
}
else
{
printk("settings saved\n\r"); //bharath
}
bt_id_get(&mac_address,&MACcount);
if(MACcount>0)
{
bt_addr_le_to_str(mac_address, macid, sizeof(macid));
for (int i = 3; i >= 0; i--)
{
index += sprintf(&mac_id[index],"%02x", mac_address[0].a.val[i]);
}
strcat(macadd,"{MAC:");
strcat(macadd,macid);
strcat(macadd,"}");
printk(macadd);
}
strcpy(AppInstance.BtCtrl.btName, "TM_");
strcat(AppInstance.BtCtrl.btName,mac_id);
strcat(AppInstance.BtCtrl.btName,"_v");
strcat(AppInstance.BtCtrl.btName,sver);
AppInstance.BtCtrl.btNameLen = strlen(AppInstance.BtCtrl.btName);
adv_status = bt_start_adv(&AppInstance.BtCtrl);
if (adv_status)
{
printk("BLE STARTED ADVERTISING\n\r");
}
else
{
printk("BLE STOPPED ADVERTISING\n\r");
}
printk("NAME:%s",AppInstance.BtCtrl.btName);
while (1)
{
for(uint8_t i =NUMBEROFEVENTS-1; i>=0; i--)
{
if(AppInstance.Events[i]==TM_TRUE)
{
HandleEvents(i);
AppInstance.Events[i] = TM_FALSE;
k_sleep(K_MSEC(100));
}
}
}
}