@@ -35,8 +35,6 @@ extern "C" { void HW_IPCC_Rx_Handler(void);}
35
35
/* Private variables ---------------------------------------------------------*/
36
36
PLACE_IN_SECTION (" MB_MEM1" ) ALIGN(4 ) static TL_CmdPacket_t BleCmdBuffer;
37
37
38
- /* PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t HciAclDataBuffer[MAX_HCI_ACL_PACKET_SIZE];
39
- */
40
38
PLACE_IN_SECTION (" MB_MEM2" ) ALIGN(4 ) static uint8_t EvtPool[POOL_SIZE];
41
39
PLACE_IN_SECTION (" MB_MEM2" ) ALIGN(4 ) static TL_CmdPacket_t SystemCmdBuffer;
42
40
PLACE_IN_SECTION (" MB_MEM2" ) ALIGN(4 ) static uint8_t
@@ -52,6 +50,11 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t
52
50
uint16_t _write_index;
53
51
uint16_t _write_index_initial;
54
52
53
+ /* * Bluetooth Device Address*/
54
+ static uint8_t bd_addr_udn[6 ];
55
+ static bool phase_bd_addr =false ;
56
+ static bool phase_tx_power =false ;
57
+
55
58
HCISharedMemTransportClass::HCISharedMemTransportClass (BLEChip_t ble_chip) :
56
59
_ble_chip(ble_chip)
57
60
{
@@ -71,12 +74,26 @@ static void evt_received(TL_EvtPacket_t *hcievt)
71
74
// We need to memcpy the data before passing to higher layers.
72
75
switch (hcievt->evtserial .type ) {
73
76
case TL_BLEEVT_PKT_TYPE:
77
+
78
+ /* capture event after HCI_RESET*/
79
+ if (phase_bd_addr) {
80
+ phase_bd_addr =false ;
81
+ bt_ipm_set_addr ();
82
+ phase_tx_power =true ;
83
+ }else if (phase_tx_power) {
84
+ phase_tx_power =false ;
85
+ bt_ipm_set_power ();
86
+ }else {
87
+ phase_bd_addr =false ;
88
+ phase_tx_power =false ;
89
+
74
90
len = hcievt->evtserial .evt .plen + TL_EVT_HDR_SIZE;
75
91
/* store received data in the _rxbuff buffer*/
76
92
memcpy ((uint8_t *)&_rxbuff, (uint8_t *)&hcievt->evtserial , len);
77
93
/* move index*/
78
94
_write_index += len;
79
95
// TODO: control the _rxbuff cannot overflow
96
+ }
80
97
break ;
81
98
case TL_ACL_DATA_PKT_TYPE: {
82
99
TL_AclDataSerial_t *acl = &(((TL_AclDataPacket_t *)hcievt)->AclDataSerial );
@@ -155,30 +172,6 @@ static bool sysevt_check(void)
155
172
}
156
173
}
157
174
158
- #if 0
159
- void shci_cmd_resp_release(uint32_t flag)
160
- {
161
- /* the semaphore is released here, so the variable becomes true. */
162
- sys_resp = true;
163
- return;
164
- }
165
-
166
- void shci_cmd_resp_wait(uint32_t timeout)
167
- {
168
- /* TO DO: manage timeouts if we can return an error */
169
- // for (unsigned long start = millis(); (millis() - start) < 10000;) {
170
- while(1) {
171
- /* Wait for 10sec max - if not return an error */
172
- if (sys_resp) { break; }
173
- }
174
-
175
- if (!sys_resp) {
176
- /* no event received, timeout occurs */
177
- return;
178
- }
179
- }
180
- #endif
181
-
182
175
static void acl_data_ack (void )
183
176
{
184
177
/* *
@@ -266,12 +259,20 @@ int HCISharedMemTransportClass::begin()
266
259
*/
267
260
268
261
269
- /* Now start BLE service on firmware side, using Vendor specific
270
- * command on the System Channel
271
- */
272
- stm32wb_start_ble ();
262
+ /* Now start BLE service on firmware side, using Vendor specific
263
+ * command on the System Channel
264
+ */
265
+ stm32wb_start_ble ();
273
266
274
267
/* "IPM Channel Open Completed"*/
268
+
269
+ /* Once reset complete event is received we willneed
270
+ * to send a few more commands:
271
+ * set bd addr with bt_ipm_set_addr();*/
272
+ phase_bd_addr =false ;
273
+ /* and Tx power with bt_ipm_set_power();*/
274
+ phase_tx_power =false ;
275
+
275
276
return 1 ;
276
277
}else {
277
278
/* "Error opening IPM channel"*/
@@ -344,6 +345,13 @@ int HCISharedMemTransportClass::read()
344
345
345
346
size_t HCISharedMemTransportClass::write (const uint8_t * data,size_t length)
346
347
{
348
+ /* check if the reset phase is in progress*/
349
+ if ((data[1 ] == (HCI_RESET &0x000000FF )) && (data[2 ] == ((HCI_RESET &0x0000FF00 ) >>8 ))) {
350
+ /* this is the HCI Reset command being sent*/
351
+ phase_bd_addr =true ;
352
+ /* after receiving, the address will be send*/
353
+ }
354
+
347
355
const uint8_t * msg_data;
348
356
msg_data = &data[1 ];
349
357
@@ -488,11 +496,96 @@ size_t HCISharedMemTransportClass::write(const uint8_t* data, size_t length)
488
496
489
497
}
490
498
499
+ #if 1
500
+ /* This function fills in a BD address table*/
501
+ bool get_bd_address (uint8_t *bd_addr)
502
+ {
503
+ uint8_t *otp_addr;
504
+ uint32_t udn;
505
+ uint32_t company_id;
506
+ uint32_t device_id;
507
+ bool bd_found;
508
+
509
+ udn =LL_FLASH_GetUDN ();
510
+
511
+ if (udn !=0xFFFFFFFF ) {
512
+ /* "Found Unique Device Number: %#06x", udn)*/
513
+
514
+ company_id =LL_FLASH_GetSTCompanyID ();
515
+ device_id =LL_FLASH_GetDeviceID ();
516
+
517
+ bd_addr[0 ] = (uint8_t )(udn &0x000000FF );
518
+ bd_addr[1 ] = (uint8_t )((udn &0x0000FF00 ) >>8 );
519
+ bd_addr[2 ] = (uint8_t )((udn &0x00FF0000 ) >>16 );
520
+ bd_addr[3 ] = (uint8_t )device_id;
521
+ bd_addr[4 ] = (uint8_t )(company_id &0x000000FF );
522
+ bd_addr[5 ] = (uint8_t )((company_id &0x0000FF00 ) >>8 );
523
+
524
+ bd_found =true ;
525
+ }else {
526
+ bd_addr =NULL ;
527
+ bd_found =false ;
528
+ }
529
+
530
+ return bd_found;
531
+ }
532
+
533
+ static int bt_ipm_set_addr (void )
534
+ {
535
+ /* the specific table for set addr is 8 bytes:
536
+ * one byte for config_offset
537
+ * one byte for length
538
+ * 6 bytes for payload*/
539
+ uint8_t data[4 +8 ];
540
+
541
+ if (get_bd_address (bd_addr_udn)) {
542
+ /* create ACI_HAL_WRITE_CONFIG_DATA*/
543
+
544
+ data[0 ] = BT_BUF_CMD;
545
+ data[1 ] =uint8_t (ACI_WRITE_CONFIG_DATA_OPCODE &0x000000FF );/* OCF*/
546
+ data[2 ] =uint8_t ((ACI_WRITE_CONFIG_DATA_OPCODE &0x0000FF00 ) >>8 );/* OGF*/
547
+ data[3 ] =8 ;/* length of parameters*/
548
+ /* fill the ACI_HAL_WRITE_CONFIG_DATA with the addr*/
549
+ data[4 ] = CONFIG_DATA_PUBADDR_OFFSET;/* the offset*/
550
+ data[5 ] =6 ;/* is the length of the bd_addr table*/
551
+ memcpy (data +6 , bd_addr_udn,6 );
552
+ /* send the ACI_HAL_WRITE_CONFIG_DATA*/
553
+ mbox_write (data[0 ],11 , &data[1 ]);
554
+
555
+ return 1 ;/* success*/
556
+ }else {
557
+ return 0 ;/* Error*/
558
+ }
559
+ }
560
+
561
+ static int bt_ipm_set_power (void )
562
+ {
563
+ /* the specific table for power is 3 bytes:
564
+ * one byte for cmd
565
+ * two bytes for value*/
566
+ uint8_t data[4 +3 ];
567
+
568
+ data[0 ] = BT_BUF_CMD;/* the type*/
569
+ data[1 ] = (uint8_t )(ACI_HAL_SET_TX_POWER_LEVEL &0x000000FF );/* the OPCODE*/
570
+ data[2 ] = (uint8_t )((ACI_HAL_SET_TX_POWER_LEVEL &0x0000FF00 ) >>8 );
571
+ data[3 ] =3 ;/* the length*/
572
+ /* fill the ACI_HAL_WRITE_CONFIG_DATA*/
573
+ data[4 ] =0x0F ;/* the command*/
574
+ data[5 ] =0x18 ;
575
+ data[6 ] =0x01 ;
576
+
577
+ /* send the ACI_HAL_WRITE_CONFIG_DATA*/
578
+ mbox_write (data[0 ],3 , &data[1 ]);
579
+
580
+ return 1 ;/* success*/
581
+ }
582
+
583
+ #else
491
584
int bt_ipm_ble_init(void)
492
585
{
493
586
uint16_t opcode;
494
587
static uint8_t randCnt;
495
- # if 0
588
+
496
589
/* if event is a command complete event */
497
590
if (*pMsg == HCI_CMD_CMPL_EVT) {
498
591
/* "Command Complete Event Command" */
@@ -707,9 +800,10 @@ size_t HCISharedMemTransportClass::write(const uint8_t* data, size_t length)
707
800
#endif /* DEBUG */
708
801
}
709
802
}
710
- # endif
711
- return 0 ;
803
+
804
+ return1; /* success */
712
805
}
806
+ #endif
713
807
714
808
uint16_t mbox_write (uint8_t type,uint16_t len,const uint8_t *pData)
715
809
{
@@ -817,40 +911,3 @@ static void init_debug(void)
817
911
818
912
return ;
819
913
}
820
-
821
- /* This function fills in a BD address table*/
822
- bool get_bd_address (uint8_t *bd_addr)
823
- {
824
- uint8_t *otp_addr;
825
- uint32_t udn;
826
- uint32_t company_id;
827
- uint32_t device_id;
828
- bool bd_found;
829
-
830
- udn =LL_FLASH_GetUDN ();
831
-
832
- if (udn !=0xFFFFFFFF ) {
833
- #if defined(DEBUG)
834
- tr_info (" Found Unique Device Number: %#06x" , udn);
835
- #endif /* DEBUG*/
836
- company_id =LL_FLASH_GetSTCompanyID ();
837
- device_id =LL_FLASH_GetDeviceID ();
838
-
839
- bd_addr[0 ] = (uint8_t )(udn &0x000000FF );
840
- bd_addr[1 ] = (uint8_t )((udn &0x0000FF00 ) >>8 );
841
- bd_addr[2 ] = (uint8_t )((udn &0x00FF0000 ) >>16 );
842
- bd_addr[3 ] = (uint8_t )device_id;
843
- bd_addr[4 ] = (uint8_t )(company_id &0x000000FF );
844
- bd_addr[5 ] = (uint8_t )((company_id &0x0000FF00 ) >>8 );
845
-
846
- bd_found =true ;
847
- }else {
848
- #if defined(DEBUG)
849
- tr_info (" Cannot find Bluetooth Device ADDRESS to program - will leave hw default" );
850
- #endif /* DEBUG*/
851
- bd_addr =NULL ;
852
- bd_found =false ;
853
- }
854
-
855
- return bd_found;
856
- }