diff options
Diffstat (limited to 'Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c')
-rw-r--r-- | Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c | 162 |
1 files changed, 107 insertions, 55 deletions
diff --git a/Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c b/Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c index eda16b71a..6f4eca2f1 100644 --- a/Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c +++ b/Projects/STM32WB5MM-DK/Applications/BLE/BLE_HeartRate/STM32_WPAN/App/app_ble.c @@ -1,19 +1,18 @@ /* USER CODE BEGIN Header */ /** - ****************************************************************************** - * File Name : App/app_ble.c - * Description : Application file for BLE Middleware. - * - ***************************************************************************** + ****************************************************************************** + * @file app_ble.c + * @author MCD Application Team + * @brief BLE Application + ****************************************************************************** * @attention * - * <h2><center>© Copyright (c) 2021 STMicroelectronics. - * All rights reserved.</center></h2> + * Copyright (c) 2021 STMicroelectronics. + * All rights reserved. * - * This software component is licensed by ST under Ultimate Liberty license - * SLA0044, the "License"; You may not use this file except in compliance with - * the License. You may obtain a copy of the License at: - * www.st.com/SLA0044 + * This software is licensed under terms that can be found in the LICENSE file + * in the root directory of this software component. + * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ @@ -252,6 +251,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 ) { @@ -268,26 +273,27 @@ void APP_BLE_Init( void ) { {{0,0,0}}, /**< Header unused */ {0, /** pBleBufferAddress not used */ - 0, /** BleBufferSize not used */ - CFG_BLE_NUM_GATT_ATTRIBUTES, - CFG_BLE_NUM_GATT_SERVICES, - CFG_BLE_ATT_VALUE_ARRAY_SIZE, - CFG_BLE_NUM_LINK, - CFG_BLE_DATA_LENGTH_EXTENSION, - CFG_BLE_PREPARE_WRITE_LIST_SIZE, - CFG_BLE_MBLOCK_COUNT, - CFG_BLE_MAX_ATT_MTU, - CFG_BLE_SLAVE_SCA, - CFG_BLE_MASTER_SCA, - CFG_BLE_LSE_SOURCE, - CFG_BLE_MAX_CONN_EVENT_LENGTH, - CFG_BLE_HSE_STARTUP_TIME, - CFG_BLE_VITERBI_MODE, - CFG_BLE_OPTIONS, - 0, - CFG_BLE_MAX_COC_INITIATOR_NBR, - CFG_BLE_MIN_TX_POWER, - CFG_BLE_MAX_TX_POWER} + 0, /** BleBufferSize not used */ + CFG_BLE_NUM_GATT_ATTRIBUTES, + CFG_BLE_NUM_GATT_SERVICES, + CFG_BLE_ATT_VALUE_ARRAY_SIZE, + CFG_BLE_NUM_LINK, + CFG_BLE_DATA_LENGTH_EXTENSION, + CFG_BLE_PREPARE_WRITE_LIST_SIZE, + CFG_BLE_MBLOCK_COUNT, + CFG_BLE_MAX_ATT_MTU, + CFG_BLE_SLAVE_SCA, + CFG_BLE_MASTER_SCA, + CFG_BLE_LSE_SOURCE, + CFG_BLE_MAX_CONN_EVENT_LENGTH, + CFG_BLE_HSE_STARTUP_TIME, + CFG_BLE_VITERBI_MODE, + CFG_BLE_OPTIONS, + 0, + CFG_BLE_MAX_COC_INITIATOR_NBR, + CFG_BLE_MIN_TX_POWER, + CFG_BLE_MAX_TX_POWER, + CFG_BLE_RX_MODEL_CONFIG} }; /** @@ -377,7 +383,7 @@ void APP_BLE_Init( void ) /* USER CODE BEGIN APP_BLE_Init_2 */ LED_Off(); - /* Displays the board informations: MAC Address, Stack version, FUS version*/ + /* Displays the board information: MAC Address, Stack version, FUS version*/ if (SHCI_GetWirelessFwInfo(p_wireless_info) != SHCI_Success) { // Error @@ -708,7 +714,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 }; /** @@ -726,6 +731,7 @@ 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]; @@ -733,6 +739,7 @@ static void Ble_Hci_Gap_Gatt_Init(void){ 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 /** * Write Identity root key used to derive LTK and CSRK @@ -741,21 +748,12 @@ static void Ble_Hci_Gap_Gatt_Init(void){ 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); - - /** - * Write random bd_address - */ - /* random_bd_address = R_bd_address; - aci_hal_write_config_data(CONFIG_DATA_RANDOM_ADDRESS_WR, - CONFIG_DATA_RANDOM_ADDRESS_LEN, - (uint8_t*) random_bd_address); - */ + CONFIG_DATA_ER_LEN, + (uint8_t*) BLE_CFG_ER_VALUE); /** * Static random Address @@ -763,19 +761,65 @@ static void Ble_Hci_Gap_Gatt_Init(void){ * 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. @@ -803,9 +847,16 @@ static void Ble_Hci_Gap_Gatt_Init(void){ if (role > 0) { const char *name = "HRSTM"; - 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)) { @@ -850,7 +901,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 ); /** @@ -908,7 +959,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, @@ -1077,6 +1128,8 @@ static void BLE_UserEvtRx( void * pPayload ) { pParam->status = HCI_TL_UserEventFlow_Disable; } + + return; } static void BLE_StatusNot( HCI_TL_CmdStatus_t status ) @@ -1119,4 +1172,3 @@ void SVCCTL_ResumeUserEventFlow( void ) /* USER CODE BEGIN FD_WRAP_FUNCTIONS */ /* USER CODE END FD_WRAP_FUNCTIONS */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |