app_ble.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806
  1. #include "main.h"
  2. #include "app_entry.h"
  3. #include "app_common.h"
  4. #include "dbg_trace.h"
  5. #include "ble.h"
  6. #include "tl.h"
  7. #include "app_ble.h"
  8. #include "cmsis_os.h"
  9. #include "shci.h"
  10. #include "stm32_lpm.h"
  11. #include "otp.h"
  12. #include "dis_app.h"
  13. #include "hrs_app.h"
  14. #include <api-hal.h>
  15. typedef struct _tSecurityParams {
  16. uint8_t ioCapability;
  17. uint8_t mitm_mode;
  18. uint8_t bonding_mode;
  19. uint8_t Use_Fixed_Pin;
  20. uint8_t encryptionKeySizeMin;
  21. uint8_t encryptionKeySizeMax;
  22. uint32_t Fixed_Pin;
  23. uint8_t initiateSecurity;
  24. } tSecurityParams;
  25. typedef struct _tBLEProfileGlobalContext {
  26. tSecurityParams bleSecurityParam;
  27. uint16_t gapServiceHandle;
  28. uint16_t devNameCharHandle;
  29. uint16_t appearanceCharHandle;
  30. uint16_t connectionHandle;
  31. uint8_t advtServUUIDlen;
  32. uint8_t advtServUUID[100];
  33. } BleGlobalContext_t;
  34. typedef struct {
  35. BleGlobalContext_t BleApplicationContext_legacy;
  36. APP_BLE_ConnStatus_t Device_Connection_Status;
  37. uint8_t Advertising_mgr_timer_Id;
  38. } BleApplicationContext_t;
  39. #define APPBLE_GAP_DEVICE_NAME_LENGTH 7
  40. #define FAST_ADV_TIMEOUT (30*1000*1000/CFG_TS_TICK_VAL) /**< 30s */
  41. #define INITIAL_ADV_TIMEOUT (60*1000*1000/CFG_TS_TICK_VAL) /**< 60s */
  42. #define BD_ADDR_SIZE_LOCAL 6
  43. #define LED_ON_TIMEOUT (0.005*1000*1000/CFG_TS_TICK_VAL) /**< 5ms */
  44. PLACE_IN_SECTION("MB_MEM1") ALIGN(4) static TL_CmdPacket_t BleCmdBuffer;
  45. static const uint8_t M_bd_addr[BD_ADDR_SIZE_LOCAL] =
  46. {
  47. (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000000000FF)),
  48. (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00000000FF00) >> 8),
  49. (uint8_t)((CFG_ADV_BD_ADDRESS & 0x000000FF0000) >> 16),
  50. (uint8_t)((CFG_ADV_BD_ADDRESS & 0x0000FF000000) >> 24),
  51. (uint8_t)((CFG_ADV_BD_ADDRESS & 0x00FF00000000) >> 32),
  52. (uint8_t)((CFG_ADV_BD_ADDRESS & 0xFF0000000000) >> 40)
  53. };
  54. static uint8_t bd_addr_udn[BD_ADDR_SIZE_LOCAL];
  55. static const uint8_t BLE_CFG_IR_VALUE[16] = CFG_BLE_IRK;
  56. static const uint8_t BLE_CFG_ER_VALUE[16] = CFG_BLE_ERK;
  57. PLACE_IN_SECTION("TAG_OTA_END") const uint32_t MagicKeywordValue = 0x94448A29 ;
  58. PLACE_IN_SECTION("TAG_OTA_START") const uint32_t MagicKeywordAddress = (uint32_t)&MagicKeywordValue;
  59. PLACE_IN_SECTION("BLE_APP_CONTEXT") static BleApplicationContext_t BleApplicationContext;
  60. PLACE_IN_SECTION("BLE_APP_CONTEXT") static uint16_t AdvIntervalMin, AdvIntervalMax;
  61. static const char local_name[] = { AD_TYPE_COMPLETE_LOCAL_NAME ,'F','L','I','P','P', 'E', 'R'};
  62. uint8_t manuf_data[14] = {
  63. sizeof(manuf_data)-1, AD_TYPE_MANUFACTURER_SPECIFIC_DATA,
  64. 0x01/*SKD version */,
  65. 0x00 /* Generic*/,
  66. 0x00 /* GROUP A Feature */,
  67. 0x00 /* GROUP A Feature */,
  68. 0x00 /* GROUP B Feature */,
  69. 0x00 /* GROUP B Feature */,
  70. 0x00, /* BLE MAC start -MSB */
  71. 0x00,
  72. 0x00,
  73. 0x00,
  74. 0x00,
  75. 0x00, /* BLE MAC stop */
  76. };
  77. osMutexId_t MtxHciId;
  78. osSemaphoreId_t SemHciId;
  79. osThreadId_t AdvUpdateProcessId;
  80. osThreadId_t HciUserEvtProcessId;
  81. const osThreadAttr_t AdvUpdateProcess_attr = {
  82. .name = CFG_ADV_UPDATE_PROCESS_NAME,
  83. .attr_bits = CFG_ADV_UPDATE_PROCESS_ATTR_BITS,
  84. .cb_mem = CFG_ADV_UPDATE_PROCESS_CB_MEM,
  85. .cb_size = CFG_ADV_UPDATE_PROCESS_CB_SIZE,
  86. .stack_mem = CFG_ADV_UPDATE_PROCESS_STACK_MEM,
  87. .priority = CFG_ADV_UPDATE_PROCESS_PRIORITY,
  88. .stack_size = CFG_ADV_UPDATE_PROCESS_STACK_SIZE
  89. };
  90. const osThreadAttr_t HciUserEvtProcess_attr = {
  91. .name = CFG_HCI_USER_EVT_PROCESS_NAME,
  92. .attr_bits = CFG_HCI_USER_EVT_PROCESS_ATTR_BITS,
  93. .cb_mem = CFG_HCI_USER_EVT_PROCESS_CB_MEM,
  94. .cb_size = CFG_HCI_USER_EVT_PROCESS_CB_SIZE,
  95. .stack_mem = CFG_HCI_USER_EVT_PROCESS_STACK_MEM,
  96. .priority = CFG_HCI_USER_EVT_PROCESS_PRIORITY,
  97. .stack_size = CFG_HCI_USER_EVT_PROCESS_STACK_SIZE
  98. };
  99. /* Private function prototypes -----------------------------------------------*/
  100. static void HciUserEvtProcess(void *argument);
  101. static void BLE_UserEvtRx( void * pPayload );
  102. static void BLE_StatusNot( HCI_TL_CmdStatus_t status );
  103. static void Ble_Tl_Init( void );
  104. static void Ble_Hci_Gap_Gatt_Init();
  105. static const uint8_t* BleGetBdAddress( void );
  106. static void Adv_Request( APP_BLE_ConnStatus_t New_Status );
  107. static void Add_Advertisment_Service_UUID( uint16_t servUUID );
  108. static void Adv_Mgr( void );
  109. static void AdvUpdateProcess(void *argument);
  110. static void Adv_Update( void );
  111. bool APP_BLE_Init() {
  112. SHCI_C2_Ble_Init_Cmd_Packet_t ble_init_cmd_packet = {
  113. {{0,0,0}}, /**< Header unused */
  114. {0, /** pBleBufferAddress not used */
  115. 0, /** BleBufferSize not used */
  116. CFG_BLE_NUM_GATT_ATTRIBUTES,
  117. CFG_BLE_NUM_GATT_SERVICES,
  118. CFG_BLE_ATT_VALUE_ARRAY_SIZE,
  119. CFG_BLE_NUM_LINK,
  120. CFG_BLE_DATA_LENGTH_EXTENSION,
  121. CFG_BLE_PREPARE_WRITE_LIST_SIZE,
  122. CFG_BLE_MBLOCK_COUNT,
  123. CFG_BLE_MAX_ATT_MTU,
  124. CFG_BLE_SLAVE_SCA,
  125. CFG_BLE_MASTER_SCA,
  126. CFG_BLE_LSE_SOURCE,
  127. CFG_BLE_MAX_CONN_EVENT_LENGTH,
  128. CFG_BLE_HSE_STARTUP_TIME,
  129. CFG_BLE_VITERBI_MODE,
  130. CFG_BLE_LL_ONLY,
  131. 0}
  132. };
  133. // Initialize Ble Transport Layer
  134. Ble_Tl_Init( );
  135. // Register the hci transport layer to handle BLE User Asynchronous Events
  136. HciUserEvtProcessId = osThreadNew(HciUserEvtProcess, NULL, &HciUserEvtProcess_attr);
  137. // Starts the BLE Stack on CPU2
  138. return (SHCI_C2_BLE_Init( &ble_init_cmd_packet ) == SHCI_Success);
  139. }
  140. bool APP_BLE_Start() {
  141. if (APPE_Status() != BleGlueStatusStarted) {
  142. return false;
  143. }
  144. // Initialization of HCI & GATT & GAP layer
  145. Ble_Hci_Gap_Gatt_Init();
  146. // Initialization of the BLE Services
  147. SVCCTL_Init();
  148. // Initialization of the BLE App Context
  149. BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
  150. BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0xFFFF;
  151. // From here, all initialization are BLE application specific
  152. AdvUpdateProcessId = osThreadNew(AdvUpdateProcess, NULL, &AdvUpdateProcess_attr);
  153. // Initialization of ADV - Ad Manufacturer Element - Support OTA Bit Masks
  154. #if(BLE_CFG_OTA_REBOOT_CHAR != 0)
  155. manuf_data[sizeof(manuf_data)-8] = CFG_FEATURE_OTA_REBOOT;
  156. #endif
  157. // Initialize DIS Application
  158. DISAPP_Init();
  159. // Initialize HRS Application
  160. HRSAPP_Init();
  161. // Create timer to handle the connection state machine
  162. HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(BleApplicationContext.Advertising_mgr_timer_Id), hw_ts_SingleShot, Adv_Mgr);
  163. // Make device discoverable
  164. BleApplicationContext.BleApplicationContext_legacy.advtServUUID[0] = AD_TYPE_16_BIT_SERV_UUID;
  165. BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen = 1;
  166. Add_Advertisment_Service_UUID(HEART_RATE_SERVICE_UUID);
  167. /* Initialize intervals for reconnexion without intervals update */
  168. AdvIntervalMin = CFG_FAST_CONN_ADV_INTERVAL_MIN;
  169. AdvIntervalMax = CFG_FAST_CONN_ADV_INTERVAL_MAX;
  170. Adv_Request(APP_BLE_FAST_ADV);
  171. return true;
  172. }
  173. SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification( void *pckt )
  174. {
  175. hci_event_pckt *event_pckt;
  176. evt_le_meta_event *meta_evt;
  177. evt_blue_aci *blue_evt;
  178. hci_le_phy_update_complete_event_rp0 *evt_le_phy_update_complete;
  179. uint8_t TX_PHY, RX_PHY;
  180. tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
  181. event_pckt = (hci_event_pckt*) ((hci_uart_pckt *) pckt)->data;
  182. switch (event_pckt->evt) {
  183. case EVT_DISCONN_COMPLETE:
  184. {
  185. hci_disconnection_complete_event_rp0 *disconnection_complete_event;
  186. disconnection_complete_event = (hci_disconnection_complete_event_rp0 *) event_pckt->data;
  187. if (disconnection_complete_event->Connection_Handle == BleApplicationContext.BleApplicationContext_legacy.connectionHandle) {
  188. BleApplicationContext.BleApplicationContext_legacy.connectionHandle = 0;
  189. BleApplicationContext.Device_Connection_Status = APP_BLE_IDLE;
  190. APP_DBG_MSG("\r\n\r** DISCONNECTION EVENT WITH CLIENT \r\n");
  191. }
  192. /* restart advertising */
  193. Adv_Request(APP_BLE_FAST_ADV);
  194. api_hal_power_insomnia_exit();
  195. }
  196. break; /* EVT_DISCONN_COMPLETE */
  197. case EVT_LE_META_EVENT:
  198. {
  199. meta_evt = (evt_le_meta_event*) event_pckt->data;
  200. switch (meta_evt->subevent)
  201. {
  202. case EVT_LE_CONN_UPDATE_COMPLETE:
  203. APP_DBG_MSG("\r\n\r** CONNECTION UPDATE EVENT WITH CLIENT \r\n");
  204. /* USER CODE BEGIN EVT_LE_CONN_UPDATE_COMPLETE */
  205. /* USER CODE END EVT_LE_CONN_UPDATE_COMPLETE */
  206. break;
  207. case EVT_LE_PHY_UPDATE_COMPLETE:
  208. APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE \r\n");
  209. evt_le_phy_update_complete = (hci_le_phy_update_complete_event_rp0*)meta_evt->data;
  210. if (evt_le_phy_update_complete->Status == 0)
  211. {
  212. APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status ok \r\n");
  213. }
  214. else
  215. {
  216. APP_DBG_MSG("EVT_UPDATE_PHY_COMPLETE, status nok \r\n");
  217. }
  218. ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
  219. if (ret == BLE_STATUS_SUCCESS)
  220. {
  221. APP_DBG_MSG("Read_PHY success \r\n");
  222. if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M))
  223. {
  224. APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
  225. }
  226. else
  227. {
  228. APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
  229. }
  230. }
  231. else
  232. {
  233. APP_DBG_MSG("Read conf not succeess \r\n");
  234. }
  235. break;
  236. case EVT_LE_CONN_COMPLETE:
  237. {
  238. api_hal_power_insomnia_enter();
  239. hci_le_connection_complete_event_rp0 *connection_complete_event;
  240. /**
  241. * The connection is done, there is no need anymore to schedule the LP ADV
  242. */
  243. connection_complete_event = (hci_le_connection_complete_event_rp0 *) meta_evt->data;
  244. HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
  245. APP_DBG_MSG("EVT_LE_CONN_COMPLETE for connection handle 0x%x\r\n", connection_complete_event->Connection_Handle);
  246. if (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_CONNECTING)
  247. {
  248. /* Connection as client */
  249. BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_CLIENT;
  250. }
  251. else
  252. {
  253. /* Connection as server */
  254. BleApplicationContext.Device_Connection_Status = APP_BLE_CONNECTED_SERVER;
  255. }
  256. BleApplicationContext.BleApplicationContext_legacy.connectionHandle = connection_complete_event->Connection_Handle;
  257. }
  258. break; /* HCI_EVT_LE_CONN_COMPLETE */
  259. default:
  260. break;
  261. }
  262. }
  263. break; /* HCI_EVT_LE_META_EVENT */
  264. case EVT_VENDOR:
  265. blue_evt = (evt_blue_aci*) event_pckt->data;
  266. switch (blue_evt->ecode) {
  267. aci_gap_pairing_complete_event_rp0 *pairing_complete;
  268. case EVT_BLUE_GAP_LIMITED_DISCOVERABLE:
  269. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_LIMITED_DISCOVERABLE \r\n");
  270. break; /* EVT_BLUE_GAP_LIMITED_DISCOVERABLE */
  271. case EVT_BLUE_GAP_PASS_KEY_REQUEST:
  272. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PASS_KEY_REQUEST \r\n");
  273. aci_gap_pass_key_resp(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,123456);
  274. APP_DBG_MSG("\r\n\r** aci_gap_pass_key_resp \r\n");
  275. break; /* EVT_BLUE_GAP_PASS_KEY_REQUEST */
  276. case EVT_BLUE_GAP_AUTHORIZATION_REQUEST:
  277. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_AUTHORIZATION_REQUEST \r\n");
  278. break; /* EVT_BLUE_GAP_AUTHORIZATION_REQUEST */
  279. case EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED:
  280. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED \r\n");
  281. break; /* EVT_BLUE_GAP_SLAVE_SECURITY_INITIATED */
  282. case EVT_BLUE_GAP_BOND_LOST:
  283. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_BOND_LOST \r\n");
  284. aci_gap_allow_rebond(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
  285. APP_DBG_MSG("\r\n\r** Send allow rebond \r\n");
  286. break; /* EVT_BLUE_GAP_BOND_LOST */
  287. case EVT_BLUE_GAP_DEVICE_FOUND:
  288. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \r\n");
  289. break; /* EVT_BLUE_GAP_DEVICE_FOUND */
  290. case EVT_BLUE_GAP_ADDR_NOT_RESOLVED:
  291. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_DEVICE_FOUND \r\n");
  292. break; /* EVT_BLUE_GAP_DEVICE_FOUND */
  293. case (EVT_BLUE_GAP_KEYPRESS_NOTIFICATION):
  294. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_KEYPRESS_NOTIFICATION \r\n");
  295. break; /* EVT_BLUE_GAP_KEY_PRESS_NOTIFICATION */
  296. case (EVT_BLUE_GAP_NUMERIC_COMPARISON_VALUE):
  297. APP_DBG_MSG("numeric_value = %ld\r\n",
  298. ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
  299. APP_DBG_MSG("Hex_value = %lx\r\n",
  300. ((aci_gap_numeric_comparison_value_event_rp0 *)(blue_evt->data))->Numeric_Value);
  301. aci_gap_numeric_comparison_value_confirm_yesno(BleApplicationContext.BleApplicationContext_legacy.connectionHandle, 1); /* CONFIRM_YES = 1 */
  302. APP_DBG_MSG("\r\n\r** aci_gap_numeric_comparison_value_confirm_yesno-->YES \r\n");
  303. break;
  304. case (EVT_BLUE_GAP_PAIRING_CMPLT):
  305. {
  306. pairing_complete = (aci_gap_pairing_complete_event_rp0*)blue_evt->data;
  307. APP_DBG_MSG("BLE_CTRL_App_Notification: EVT_BLUE_GAP_PAIRING_CMPLT, pairing_complete->Status = %d\r\n",pairing_complete->Status);
  308. if (pairing_complete->Status == 0) {
  309. APP_DBG_MSG("\r\n\r** Pairing OK \r\n");
  310. } else {
  311. APP_DBG_MSG("\r\n\r** Pairing KO \r\n");
  312. }
  313. }
  314. break;
  315. /* USER CODE END ecode */
  316. case EVT_BLUE_GAP_PROCEDURE_COMPLETE:
  317. APP_DBG_MSG("\r\n\r** EVT_BLUE_GAP_PROCEDURE_COMPLETE \r\n");
  318. break;
  319. }
  320. break; /* EVT_VENDOR */
  321. default:
  322. break;
  323. }
  324. return (SVCCTL_UserEvtFlowEnable);
  325. }
  326. APP_BLE_ConnStatus_t APP_BLE_Get_Server_Connection_Status() {
  327. return BleApplicationContext.Device_Connection_Status;
  328. }
  329. /* USER CODE BEGIN FD*/
  330. void APP_BLE_Key_Button1_Action() {
  331. tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
  332. ret = aci_gap_clear_security_db();
  333. if (ret == BLE_STATUS_SUCCESS) {
  334. APP_DBG_MSG("Successfully aci_gap_clear_security_db()\r\n");
  335. } else {
  336. APP_DBG_MSG("aci_gap_clear_security_db() Failed , result: %d \r\n", ret);
  337. }
  338. }
  339. void APP_BLE_Key_Button2_Action() {
  340. tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
  341. ret = aci_gap_slave_security_req(BleApplicationContext.BleApplicationContext_legacy.connectionHandle);
  342. if (ret == BLE_STATUS_SUCCESS) {
  343. APP_DBG_MSG("Successfully aci_gap_slave_security_req()");
  344. } else {
  345. APP_DBG_MSG("aci_gap_slave_security_req() Failed , result: %d \r\n", ret);
  346. }
  347. }
  348. void APP_BLE_Key_Button3_Action() {
  349. uint8_t TX_PHY, RX_PHY;
  350. tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
  351. ret = hci_le_read_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,&TX_PHY,&RX_PHY);
  352. if (ret == BLE_STATUS_SUCCESS) {
  353. APP_DBG_MSG("Read_PHY success \r\n");
  354. APP_DBG_MSG("PHY Param TX= %d, RX= %d \r\n", TX_PHY, RX_PHY);
  355. if ((TX_PHY == TX_2M) && (RX_PHY == RX_2M)) {
  356. APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \r\n", TX_1M, RX_1M);
  357. ret = hci_le_set_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,ALL_PHYS_PREFERENCE,TX_1M,RX_1M,0);
  358. } else {
  359. APP_DBG_MSG("hci_le_set_phy PHY Param TX= %d, RX= %d \r\n", TX_2M_PREFERRED, RX_2M_PREFERRED);
  360. ret = hci_le_set_phy(BleApplicationContext.BleApplicationContext_legacy.connectionHandle,ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED,0);
  361. }
  362. } else {
  363. APP_DBG_MSG("Read conf not succeess \r\n");
  364. }
  365. if (ret == BLE_STATUS_SUCCESS) {
  366. APP_DBG_MSG("set PHY cmd ok\r\n");
  367. } else {
  368. APP_DBG_MSG("set PHY cmd NOK\r\n");
  369. }
  370. }
  371. static void Ble_Tl_Init( void ) {
  372. HCI_TL_HciInitConf_t Hci_Tl_Init_Conf;
  373. MtxHciId = osMutexNew( NULL );
  374. SemHciId = osSemaphoreNew( 1, 0, NULL ); /*< Create the semaphore and make it busy at initialization */
  375. Hci_Tl_Init_Conf.p_cmdbuffer = (uint8_t*)&BleCmdBuffer;
  376. Hci_Tl_Init_Conf.StatusNotCallBack = BLE_StatusNot;
  377. hci_init(BLE_UserEvtRx, (void*) &Hci_Tl_Init_Conf);
  378. }
  379. static void Ble_Hci_Gap_Gatt_Init() {
  380. uint8_t role;
  381. uint16_t gap_service_handle, gap_dev_name_char_handle, gap_appearance_char_handle;
  382. const uint8_t *bd_addr;
  383. uint32_t srd_bd_addr[2];
  384. uint16_t appearance[1] = { BLE_CFG_GAP_APPEARANCE };
  385. /*HCI Reset to synchronise BLE Stack*/
  386. hci_reset();
  387. /**
  388. * Write the BD Address
  389. */
  390. bd_addr = BleGetBdAddress();
  391. aci_hal_write_config_data(CONFIG_DATA_PUBADDR_OFFSET,
  392. CONFIG_DATA_PUBADDR_LEN,
  393. (uint8_t*) bd_addr);
  394. /* BLE MAC in ADV Packet */
  395. manuf_data[ sizeof(manuf_data)-6] = bd_addr[5];
  396. manuf_data[ sizeof(manuf_data)-5] = bd_addr[4];
  397. manuf_data[ sizeof(manuf_data)-4] = bd_addr[3];
  398. manuf_data[ sizeof(manuf_data)-3] = bd_addr[2];
  399. manuf_data[ sizeof(manuf_data)-2] = bd_addr[1];
  400. manuf_data[ sizeof(manuf_data)-1] = bd_addr[0];
  401. /**
  402. * Write Identity root key used to derive LTK and CSRK
  403. */
  404. aci_hal_write_config_data(CONFIG_DATA_IR_OFFSET,
  405. CONFIG_DATA_IR_LEN,
  406. (uint8_t*) BLE_CFG_IR_VALUE);
  407. /**
  408. * Write Encryption root key used to derive LTK and CSRK
  409. */
  410. aci_hal_write_config_data(CONFIG_DATA_ER_OFFSET,
  411. CONFIG_DATA_ER_LEN,
  412. (uint8_t*) BLE_CFG_ER_VALUE);
  413. /**
  414. * Write random bd_address
  415. */
  416. /* random_bd_address = R_bd_address;
  417. aci_hal_write_config_data(CONFIG_DATA_RANDOM_ADDRESS_WR,
  418. CONFIG_DATA_RANDOM_ADDRESS_LEN,
  419. (uint8_t*) random_bd_address);
  420. */
  421. /**
  422. * Static random Address
  423. * The two upper bits shall be set to 1
  424. * The lowest 32bits is read from the UDN to differentiate between devices
  425. * The RNG may be used to provide a random number on each power on
  426. */
  427. srd_bd_addr[1] = 0x0000ED6E;
  428. srd_bd_addr[0] = LL_FLASH_GetUDN( );
  429. aci_hal_write_config_data( CONFIG_DATA_RANDOM_ADDRESS_OFFSET, CONFIG_DATA_RANDOM_ADDRESS_LEN, (uint8_t*)srd_bd_addr );
  430. /**
  431. * Write Identity root key used to derive LTK and CSRK
  432. */
  433. aci_hal_write_config_data( CONFIG_DATA_IR_OFFSET, CONFIG_DATA_IR_LEN, (uint8_t*)BLE_CFG_IR_VALUE );
  434. /**
  435. * Write Encryption root key used to derive LTK and CSRK
  436. */
  437. aci_hal_write_config_data( CONFIG_DATA_ER_OFFSET, CONFIG_DATA_ER_LEN, (uint8_t*)BLE_CFG_ER_VALUE );
  438. /**
  439. * Set TX Power to 0dBm.
  440. */
  441. aci_hal_set_tx_power_level(1, CFG_TX_POWER);
  442. /**
  443. * Initialize GATT interface
  444. */
  445. aci_gatt_init();
  446. /**
  447. * Initialize GAP interface
  448. */
  449. role = 0;
  450. #if (BLE_CFG_PERIPHERAL == 1)
  451. role |= GAP_PERIPHERAL_ROLE;
  452. #endif
  453. #if (BLE_CFG_CENTRAL == 1)
  454. role |= GAP_CENTRAL_ROLE;
  455. #endif
  456. if (role > 0)
  457. {
  458. const char *name = "Flipper";
  459. aci_gap_init(role, 0,
  460. APPBLE_GAP_DEVICE_NAME_LENGTH,
  461. &gap_service_handle, &gap_dev_name_char_handle, &gap_appearance_char_handle);
  462. if (aci_gatt_update_char_value(gap_service_handle, gap_dev_name_char_handle, 0, strlen(name), (uint8_t *) name))
  463. {
  464. BLE_DBG_SVCCTL_MSG("Device Name aci_gatt_update_char_value failed.\r\n");
  465. }
  466. }
  467. if(aci_gatt_update_char_value(gap_service_handle,
  468. gap_appearance_char_handle,
  469. 0,
  470. 2,
  471. (uint8_t *)&appearance))
  472. {
  473. BLE_DBG_SVCCTL_MSG("Appearance aci_gatt_update_char_value failed.\r\n");
  474. }
  475. /**
  476. * Initialize Default PHY
  477. */
  478. hci_le_set_default_phy(ALL_PHYS_PREFERENCE,TX_2M_PREFERRED,RX_2M_PREFERRED);
  479. /**
  480. * Initialize IO capability
  481. */
  482. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability = CFG_IO_CAPABILITY;
  483. aci_gap_set_io_capability(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.ioCapability);
  484. /**
  485. * Initialize authentication
  486. */
  487. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode = CFG_MITM_PROTECTION;
  488. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin = CFG_ENCRYPTION_KEY_SIZE_MIN;
  489. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax = CFG_ENCRYPTION_KEY_SIZE_MAX;
  490. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin = CFG_USED_FIXED_PIN;
  491. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin = CFG_FIXED_PIN;
  492. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode = CFG_BONDING_MODE;
  493. aci_gap_set_authentication_requirement(BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode,
  494. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.mitm_mode,
  495. CFG_SC_SUPPORT,
  496. CFG_KEYPRESS_NOTIFICATION_SUPPORT,
  497. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMin,
  498. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.encryptionKeySizeMax,
  499. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Use_Fixed_Pin,
  500. BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.Fixed_Pin,
  501. PUBLIC_ADDR
  502. );
  503. /**
  504. * Initialize whitelist
  505. */
  506. if (BleApplicationContext.BleApplicationContext_legacy.bleSecurityParam.bonding_mode)
  507. {
  508. aci_gap_configure_whitelist();
  509. }
  510. }
  511. static void Adv_Request(APP_BLE_ConnStatus_t New_Status)
  512. {
  513. tBleStatus ret = BLE_STATUS_INVALID_PARAMS;
  514. uint16_t Min_Inter, Max_Inter;
  515. if (New_Status == APP_BLE_FAST_ADV)
  516. {
  517. Min_Inter = AdvIntervalMin;
  518. Max_Inter = AdvIntervalMax;
  519. }
  520. else
  521. {
  522. Min_Inter = CFG_LP_CONN_ADV_INTERVAL_MIN;
  523. Max_Inter = CFG_LP_CONN_ADV_INTERVAL_MAX;
  524. }
  525. /**
  526. * Stop the timer, it will be restarted for a new shot
  527. * It does not hurt if the timer was not running
  528. */
  529. HW_TS_Stop(BleApplicationContext.Advertising_mgr_timer_Id);
  530. APP_DBG_MSG("First index in %d state \r\n", BleApplicationContext.Device_Connection_Status);
  531. if ((New_Status == APP_BLE_LP_ADV)
  532. && ((BleApplicationContext.Device_Connection_Status == APP_BLE_FAST_ADV)
  533. || (BleApplicationContext.Device_Connection_Status == APP_BLE_LP_ADV)))
  534. {
  535. /* Connection in ADVERTISE mode have to stop the current advertising */
  536. ret = aci_gap_set_non_discoverable();
  537. if (ret == BLE_STATUS_SUCCESS)
  538. {
  539. APP_DBG_MSG("Successfully Stopped Advertising \r\n");
  540. }
  541. else
  542. {
  543. APP_DBG_MSG("Stop Advertising Failed , result: %d \r\n", ret);
  544. }
  545. }
  546. BleApplicationContext.Device_Connection_Status = New_Status;
  547. /* Start Fast or Low Power Advertising */
  548. ret = aci_gap_set_discoverable(
  549. ADV_IND,
  550. Min_Inter,
  551. Max_Inter,
  552. PUBLIC_ADDR,
  553. NO_WHITE_LIST_USE, /* use white list */
  554. sizeof(local_name),
  555. (uint8_t*) &local_name,
  556. BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen,
  557. BleApplicationContext.BleApplicationContext_legacy.advtServUUID,
  558. 0,
  559. 0);
  560. /* Update Advertising data */
  561. ret = aci_gap_update_adv_data(sizeof(manuf_data), (uint8_t*) manuf_data);
  562. if (ret == BLE_STATUS_SUCCESS) {
  563. if (New_Status == APP_BLE_FAST_ADV) {
  564. APP_DBG_MSG("Successfully Start Fast Advertising \r\n" );
  565. /* Start Timer to STOP ADV - TIMEOUT */
  566. HW_TS_Start(BleApplicationContext.Advertising_mgr_timer_Id, INITIAL_ADV_TIMEOUT);
  567. } else {
  568. APP_DBG_MSG("Successfully Start Low Power Advertising \r\n");
  569. }
  570. } else {
  571. if (New_Status == APP_BLE_FAST_ADV) {
  572. APP_DBG_MSG("Start Fast Advertising Failed , result: %d \r\n", ret);
  573. } else {
  574. APP_DBG_MSG("Start Low Power Advertising Failed , result: %d \r\n", ret);
  575. }
  576. }
  577. }
  578. const uint8_t* BleGetBdAddress( void ) {
  579. uint8_t *otp_addr;
  580. const uint8_t *bd_addr;
  581. uint32_t udn;
  582. uint32_t company_id;
  583. uint32_t device_id;
  584. udn = LL_FLASH_GetUDN();
  585. if(udn != 0xFFFFFFFF) {
  586. company_id = LL_FLASH_GetSTCompanyID();
  587. device_id = LL_FLASH_GetDeviceID();
  588. bd_addr_udn[0] = (uint8_t)(udn & 0x000000FF);
  589. bd_addr_udn[1] = (uint8_t)( (udn & 0x0000FF00) >> 8 );
  590. bd_addr_udn[2] = (uint8_t)( (udn & 0x00FF0000) >> 16 );
  591. bd_addr_udn[3] = (uint8_t)device_id;
  592. bd_addr_udn[4] = (uint8_t)(company_id & 0x000000FF);;
  593. bd_addr_udn[5] = (uint8_t)( (company_id & 0x0000FF00) >> 8 );
  594. bd_addr = (const uint8_t *)bd_addr_udn;
  595. } else {
  596. otp_addr = OTP_Read(0);
  597. if(otp_addr) {
  598. bd_addr = ((OTP_ID0_t*)otp_addr)->bd_address;
  599. } else {
  600. bd_addr = M_bd_addr;
  601. }
  602. }
  603. return bd_addr;
  604. }
  605. /*************************************************************
  606. *
  607. *SPECIFIC FUNCTIONS
  608. *
  609. *************************************************************/
  610. static void Add_Advertisment_Service_UUID( uint16_t servUUID ) {
  611. BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
  612. (uint8_t) (servUUID & 0xFF);
  613. BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
  614. BleApplicationContext.BleApplicationContext_legacy.advtServUUID[BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen] =
  615. (uint8_t) (servUUID >> 8) & 0xFF;
  616. BleApplicationContext.BleApplicationContext_legacy.advtServUUIDlen++;
  617. }
  618. static void Adv_Mgr( void ) {
  619. /**
  620. * The code shall be executed in the background as an aci command may be sent
  621. * The background is the only place where the application can make sure a new aci command
  622. * is not sent if there is a pending one
  623. */
  624. osThreadFlagsSet( AdvUpdateProcessId, 1 );
  625. }
  626. static void AdvUpdateProcess(void *argument) {
  627. UNUSED(argument);
  628. for(;;) {
  629. osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
  630. Adv_Update( );
  631. }
  632. }
  633. static void Adv_Update( void ) {
  634. Adv_Request(APP_BLE_LP_ADV);
  635. }
  636. static void HciUserEvtProcess(void *argument) {
  637. UNUSED(argument);
  638. for(;;)
  639. {
  640. osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
  641. hci_user_evt_proc( );
  642. }
  643. }
  644. /*************************************************************
  645. *
  646. * WRAP FUNCTIONS
  647. *
  648. *************************************************************/
  649. void hci_notify_asynch_evt(void* pdata) {
  650. UNUSED(pdata);
  651. osThreadFlagsSet( HciUserEvtProcessId, 1 );
  652. }
  653. void hci_cmd_resp_release(uint32_t flag) {
  654. UNUSED(flag);
  655. osSemaphoreRelease( SemHciId );
  656. }
  657. void hci_cmd_resp_wait(uint32_t timeout) {
  658. UNUSED(timeout);
  659. osSemaphoreAcquire( SemHciId, osWaitForever );
  660. }
  661. static void BLE_UserEvtRx( void * pPayload ) {
  662. SVCCTL_UserEvtFlowStatus_t svctl_return_status;
  663. tHCI_UserEvtRxParam *pParam;
  664. pParam = (tHCI_UserEvtRxParam *)pPayload;
  665. svctl_return_status = SVCCTL_UserEvtRx((void *)&(pParam->pckt->evtserial));
  666. if (svctl_return_status != SVCCTL_UserEvtFlowDisable) {
  667. pParam->status = HCI_TL_UserEventFlow_Enable;
  668. } else {
  669. pParam->status = HCI_TL_UserEventFlow_Disable;
  670. }
  671. }
  672. static void BLE_StatusNot( HCI_TL_CmdStatus_t status ) {
  673. switch (status) {
  674. case HCI_TL_CmdBusy:
  675. osMutexAcquire( MtxHciId, osWaitForever );
  676. break;
  677. case HCI_TL_CmdAvailable:
  678. osMutexRelease( MtxHciId );
  679. break;
  680. default:
  681. break;
  682. }
  683. }
  684. void SVCCTL_ResumeUserEventFlow( void ) {
  685. hci_resume_flow();
  686. }