diff options
Diffstat (limited to 'Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c')
-rw-r--r-- | Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c | 131 |
1 files changed, 119 insertions, 12 deletions
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c index 08a877a01..348803b5d 100644 --- a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c +++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_BloodPressure/STM32_WPAN/App/app_ble.c @@ -206,7 +206,23 @@ static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK; PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext; PLACE_IN_SECTION("BLE_APP_CONTEXT") static uint16_t AdvIntervalMin, AdvIntervalMax; -static const char local_name[] = {AD_TYPE_COMPLETE_LOCAL_NAME ,'B','P','S','T','M'}; +static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME ,'B','P','S','T','M'}; +uint8_t manuf_data[14] = { + sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA, + 0x01/*SKD version */, + 0x00 /* Generic*/, + 0x00 /* GROUP A Feature */, + 0x00 /* GROUP A Feature */, + 0x00 /* GROUP B Feature */, + 0x00 /* GROUP B Feature */, + 0x00, /* BLE MAC start -MSB */ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, /* BLE MAC stop */ + +}; /* USER CODE BEGIN PV */ @@ -227,6 +243,12 @@ static void Adv_Update( void ); /* USER CODE END PFP */ +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + /* Functions Definition ------------------------------------------------------*/ void APP_BLE_Init( void ) { @@ -306,6 +328,10 @@ void APP_BLE_Init( void ) */ BLSAPP_Init(); +/* USER CODE BEGIN APP_BLE_Init_3 */ + +/* USER CODE END APP_BLE_Init_3 */ + /** * Create timer to handle the connection state machine */ @@ -322,6 +348,9 @@ void APP_BLE_Init( void ) AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN; AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX; + /** + * Start to Advertise to be connected by a Client + */ Adv_Request(APP_BLE_FAST_ADV); /* USER CODE BEGIN APP_BLE_Init_2 */ @@ -474,17 +503,23 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt ) case ACI_GAP_LIMITED_DISCOVERABLE_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_LIMITED_DISCOVERABLE_VSEVT_CODE \n"); break; /* ACI_GAP_LIMITED_DISCOVERABLE_VSEVT_CODE */ + case ACI_GAP_PASS_KEY_REQ_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_PASS_KEY_REQ_VSEVT_CODE \n"); + aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,123456); + APP_DBG_MSG("\r\n\r** aci_gap_pass_key_resp \n"); break; /* ACI_GAP_PASS_KEY_REQ_VSEVT_CODE */ + case ACI_GAP_AUTHORIZATION_REQ_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_AUTHORIZATION_REQ_VSEVT_CODE \n"); break; /* ACI_GAP_AUTHORIZATION_REQ_VSEVT_CODE */ + case ACI_GAP_SLAVE_SECURITY_INITIATED_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_SLAVE_SECURITY_INITIATED_VSEVT_CODE \n"); break; /* ACI_GAP_SLAVE_SECURITY_INITIATED_VSEVT_CODE */ + case ACI_GAP_BOND_LOST_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_BOND_LOST_VSEVT_CODE \n"); aci_gap_allow_rebond(BleApplicationContext.BleApplicationContext_legacy.connectionHandle); @@ -494,20 +529,24 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt ) case ACI_GAP_ADDR_NOT_RESOLVED_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_ADDR_NOT_RESOLVED_VSEVT_CODE \n"); break; /* ACI_GAP_ADDR_NOT_RESOLVED_VSEVT_CODE */ + case (ACI_GAP_KEYPRESS_NOTIFICATION_VSEVT_CODE): APP_DBG_MSG("\r\n\r** ACI_GAP_KEYPRESS_NOTIFICATION_VSEVT_CODE\n"); break; /* ACI_GAP_KEYPRESS_NOTIFICATION_VSEVT_CODE */ + case (ACI_GAP_NUMERIC_COMPARISON_VALUE_VSEVT_CODE): APP_DBG_MSG("numeric_value = %ld\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blecore_evt->data))->Numeric_Value); APP_DBG_MSG("Hex_value = %lx\n", ((aci_gap_numeric_comparison_value_event_rp0 *)(blecore_evt->data))->Numeric_Value); - aci_gap_numeric_comparison_value_confirm_yesno(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 1); /* CONFIRM_YES = 1 */ + aci_gap_numeric_comparison_value_confirm_yesno(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, YES); /* CONFIRM_YES = 1 */ APP_DBG_MSG("\r\n\r** aci_gap_numeric_comparison_value_confirm_yesno-->YES \n"); break; + case (ACI_GAP_PAIRING_COMPLETE_VSEVT_CODE): { pairing_complete = (aci_gap_pairing_complete_event_rp0*)blecore_evt->data; + APP_DBG_MSG("BLE_CTRL_App_Notification: ACI_GAP_PAIRING_COMPLETE_VSEVT_CODE, pairing_complete->Status = %d\n",pairing_complete->Status); if (pairing_complete->Status == 0) { @@ -519,6 +558,7 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt ) } } break; + /* USER CODE END ecode */ case ACI_GAP_PROC_COMPLETE_VSEVT_CODE: APP_DBG_MSG("\r\n\r** ACI_GAP_PROC_COMPLETE_VSEVT_CODE \n"); @@ -555,15 +595,18 @@ APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status(void) /* USER CODE BEGIN FD*/ void APP_BLE_Key_Button1_Action(void) { + } void APP_BLE_Key_Button2_Action(void) { + } void APP_BLE_Key_Button3_Action(void) { } + /* USER CODE END FD*/ /************************************************************* * @@ -586,7 +629,6 @@ static void Ble_Hci_Gap_Gatt_Init(void){ uint8_t role; uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle; const uint8_t *bd_addr; - uint32_t srd_bd_addr[2]; uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE }; /** @@ -604,25 +646,81 @@ static void Ble_Hci_Gap_Gatt_Init(void){ CONFIG_DATA_PUBADDR_LEN, (uint8_t*) bd_addr); +#if (CFG_BLE_ADDRESS_TYPE == PUBLIC_ADDR) + /* BLE MAC in ADV Packet */ + manuf_data[ sizeof(manuf_data)-6] = bd_addr[5]; + manuf_data[ sizeof(manuf_data)-5] = bd_addr[4]; + manuf_data[ sizeof(manuf_data)-4] = bd_addr[3]; + manuf_data[ sizeof(manuf_data)-3] = bd_addr[2]; + manuf_data[ sizeof(manuf_data)-2] = bd_addr[1]; + manuf_data[ sizeof(manuf_data)-1] = bd_addr[0]; +#endif + /** * Static random Address * The two upper bits shall be set to 1 * The lowest 32bits is read from the UDN to differentiate between devices * The RNG may be used to provide a random number on each power on */ - srd_bd_addr[1] = 0x0000ED6E; - srd_bd_addr[0] = LL_FLASH_GetUDN( ); +#if defined(CFG_STATIC_RANDOM_ADDRESS) + srd_bd_addr[0] = CFG_STATIC_RANDOM_ADDRESS & 0xFFFFFFFF; + srd_bd_addr[1] = (uint32_t)((uint64_t)CFG_STATIC_RANDOM_ADDRESS >> 32); + srd_bd_addr[1] |= 0xC000; /* The two upper bits shall be set to 1 */ +#elif (CFG_BLE_ADDRESS_TYPE == RANDOM_ADDR) + /* Get RNG semaphore */ + while( LL_HSEM_1StepLock( HSEM, CFG_HW_RNG_SEMID ) ); + + /* Enable RNG */ + __HAL_RNG_ENABLE(&hrng); + + /* Enable HSI48 oscillator */ + LL_RCC_HSI48_Enable(); + /* Wait until HSI48 is ready */ + while( ! LL_RCC_HSI48_IsReady( ) ); + + if (HAL_RNG_GenerateRandomNumber(&hrng, &srd_bd_addr[1]) != HAL_OK) + { + /* Random number generation error */ + Error_Handler(); + } + if (HAL_RNG_GenerateRandomNumber(&hrng, &srd_bd_addr[0]) != HAL_OK) + { + /* Random number generation error */ + Error_Handler(); + } + srd_bd_addr[1] |= 0xC000; /* The two upper bits shall be set to 1 */ + + /* Disable HSI48 oscillator */ + LL_RCC_HSI48_Disable(); + + /* Disable RNG */ + __HAL_RNG_DISABLE(&hrng); + + /* Release RNG semaphore */ + LL_HSEM_ReleaseLock( HSEM, CFG_HW_RNG_SEMID, 0 ); +#endif + +#if (CFG_BLE_ADDRESS_TYPE == STATIC_RANDOM_ADDR) + /* BLE MAC in ADV Packet */ + manuf_data[ sizeof(manuf_data)-6] = srd_bd_addr[1] >> 8 ; + manuf_data[ sizeof(manuf_data)-5] = srd_bd_addr[1]; + manuf_data[ sizeof(manuf_data)-4] = srd_bd_addr[0] >> 24; + manuf_data[ sizeof(manuf_data)-3] = srd_bd_addr[0] >> 16; + manuf_data[ sizeof(manuf_data)-2] = srd_bd_addr[0] >> 8; + manuf_data[ sizeof(manuf_data)-1] = srd_bd_addr[0]; + aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr ); +#endif /** * Write Identity root key used to derive LTK and CSRK */ - aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE ); + aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE ); - /** + /** * Write Encryption root key used to derive LTK and CSRK */ - aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE ); + aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE ); /** * Set TX Power to 0dBm. @@ -650,9 +748,16 @@ static void Ble_Hci_Gap_Gatt_Init(void){ if (role > 0) { const char *name = "BPSTM"; - aci_gap_init(role, 0, + aci_gap_init(role, +#if ((CFG_BLE_ADDRESS_TYPE == RESOLVABLE_PRIVATE_ADDR) || (CFG_BLE_ADDRESS_TYPE == NON_RESOLVABLE_PRIVATE_ADDR)) + 2, +#else + 0, +#endif APPBLE_GAP_DEVICE_NAME_LENGTH, - &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle); + &gap_service_handle, + &gap_dev_name_char_handle, + &gap_appearance_char_handle); if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name)) { @@ -692,7 +797,7 @@ static void Ble_Hci_Gap_Gatt_Init(void){ BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax, BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin, BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin, - PUBLIC_ADDR + CFG_BLE_ADDRESS_TYPE ); /** @@ -750,7 +855,7 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status) ADV_IND, Min_Inter, Max_Inter, - PUBLIC_ADDR, + CFG_BLE_ADDRESS_TYPE, NO_WHITE_LIST_USE, /* use white list */ sizeof(local_name), (uint8_t*) &local_name, @@ -759,6 +864,8 @@ static void Adv_Request(APP_BLE_ConnStatus_t New_Status) 0, 0); + /* Update Advertising data */ + ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data); if (ret == BLE_STATUS_SUCCESS) { if (New_Status == APP_BLE_FAST_ADV) |