@@ -48,11 +48,17 @@ volatile uint16_t _write_index; /* fifo position when receiving */
48
48
/* var of different device steps during init and receiving */
49
49
volatile bool phase_bd_addr;
50
50
volatile bool phase_tx_power;
51
+ volatile bool phase_gatt_init;
52
+ volatile bool phase_gap_init;
53
+ volatile bool phase_random_addr;
54
+ volatile bool phase_get_random_addr;
51
55
volatile bool phase_reset;
52
56
volatile bool phase_running;
57
+ volatile bool is_random_addr_msg;
53
58
54
59
/* * Bluetooth Device Address */
55
60
static uint8_t bd_addr_udn[CONFIG_DATA_PUBADDR_LEN];
61
+ static uint8_t helper_random_addr[6 ];
56
62
57
63
/* Private functions ---------------------------------------------------------*/
58
64
/* *
@@ -175,12 +181,21 @@ void evt_received(TL_EvtPacket_t *hcievt)
175
181
* the Reset packet is handled at HCI layer : the running_phase begins
176
182
*/
177
183
if (phase_running == false ) {
178
- /* check the Rx event of complete the previous bd_addr opcode 0xFC0C */
184
+ /* check the Rx event of complete the previous bd_addr or random address opcode 0xFC0C */
179
185
if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
180
186
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
181
187
(hcievt->evtserial .evt .payload [1 ] == 0x0C ) &&
182
188
(hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
183
- phase_bd_addr = true ;
189
+ /* First setting must be global address and is_random_addr_msg should be false
190
+ * Second setting must be static random address and is_random_addr_msg should be true
191
+ */
192
+ if (!is_random_addr_msg) {
193
+ phase_bd_addr = true ;
194
+ is_random_addr_msg = true ;
195
+ } else {
196
+ phase_random_addr = true ;
197
+ is_random_addr_msg = false ;
198
+ }
184
199
if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
185
200
#if defined(PRINT_IPCC_INFO)
186
201
printf (" Error: wrong BD Addr\r\n " );
@@ -203,6 +218,50 @@ void evt_received(TL_EvtPacket_t *hcievt)
203
218
/* rx data is no more useful : not stored in the _rxbuff */
204
219
break ;
205
220
}
221
+ /* check the Rx event of complete the previous gatt init 0xFD01 */
222
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
223
+ (hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
224
+ (hcievt->evtserial .evt .payload [1 ] == 0x01 ) &&
225
+ (hcievt->evtserial .evt .payload [2 ] == 0xFD )) {
226
+ phase_gatt_init = true ;
227
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
228
+ #if defined(PRINT_IPCC_INFO)
229
+ printf (" Error: wrong Random Addr\r\n " );
230
+ #endif /* (PRINT_IPCC_INFO)*/
231
+ }
232
+ /* rx data is no more useful : not stored in the _rxbuff */
233
+ break ;
234
+ }
235
+ /* check the Rx event of complete the previous gap init 0xFC8A */
236
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
237
+ (hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
238
+ (hcievt->evtserial .evt .payload [1 ] == 0x8A ) &&
239
+ (hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
240
+ phase_gap_init = true ;
241
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
242
+ #if defined(PRINT_IPCC_INFO)
243
+ printf (" Error: wrong Random Addr\r\n " );
244
+ #endif /* (PRINT_IPCC_INFO)*/
245
+ }
246
+ /* rx data is no more useful : not stored in the _rxbuff */
247
+ break ;
248
+ }
249
+ /* check the Rx event of complete the previous get random addr opcode 0xFC0D */
250
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
251
+ (hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
252
+ (hcievt->evtserial .evt .payload [1 ] == 0x0D ) &&
253
+ (hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
254
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
255
+ #if defined(PRINT_IPCC_INFO)
256
+ printf (" Error: wrong Random Addr\r\n " );
257
+ #endif /* (PRINT_IPCC_INFO)*/
258
+ }
259
+
260
+ memcpy (helper_random_addr, &hcievt->evtserial .evt .payload [5 ], 6 );
261
+ phase_get_random_addr = true ;
262
+ /* rx data is no more useful : not stored in the _rxbuff */
263
+ break ;
264
+ }
206
265
/* check if the reset phase is in progress (opcode is 0x0C03) */
207
266
if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
208
267
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
@@ -389,8 +448,13 @@ HCISharedMemTransportClass::HCISharedMemTransportClass()
389
448
390
449
phase_bd_addr = false ;
391
450
phase_tx_power = false ;
451
+ phase_gatt_init = false ;
452
+ phase_gap_init = false ;
453
+ phase_random_addr = false ;
454
+ phase_get_random_addr = false ;
392
455
phase_reset = false ;
393
456
phase_running = false ;
457
+ is_random_addr_msg = false ;
394
458
}
395
459
396
460
HCISharedMemTransportClass::~HCISharedMemTransportClass ()
@@ -453,8 +517,13 @@ void HCISharedMemTransportClass::end()
453
517
/* the HCI RESET command ready to be processed again */
454
518
phase_bd_addr = false ;
455
519
phase_tx_power = false ;
520
+ phase_gatt_init = false ;
521
+ phase_gap_init = false ;
522
+ phase_random_addr = false ;
523
+ phase_get_random_addr = false ;
456
524
phase_reset = false ;
457
525
phase_running = false ;
526
+ is_random_addr_msg = false ;
458
527
}
459
528
460
529
void HCISharedMemTransportClass::wait (unsigned long timeout)
@@ -543,11 +612,34 @@ size_t HCISharedMemTransportClass::write(const uint8_t *data, size_t length)
543
612
while (!phase_bd_addr);
544
613
/* this sequence is now complete */
545
614
615
+ /* set the random address */
616
+ bt_ipm_set_random_addr ();
617
+ /* wait for the Rx complete */
618
+ while (!phase_random_addr);
619
+
546
620
/* set the Tx power */
547
621
bt_ipm_set_power ();
548
622
/* wait for the Rx complete */
549
623
while (!phase_tx_power);
550
624
625
+ /* gatt init */
626
+ bt_ipm_gatt_init ();
627
+ /* wait for the Rx complete */
628
+ while (!phase_gatt_init);
629
+
630
+ /* gap init */
631
+ bt_ipm_gap_init ();
632
+ /* wait for the Rx complete */
633
+ while (!phase_gap_init);
634
+
635
+ /* get the random address */
636
+ bt_ipm_get_random_addr ();
637
+ /* wait for the Rx complete */
638
+ while (!phase_get_random_addr);
639
+
640
+ /* Now we can copy the random address and save it in the transport class */
641
+ memcpy (_random_addr, helper_random_addr, 6 );
642
+
551
643
/* this sequence is now complete */
552
644
phase_running = true ;
553
645
@@ -725,6 +817,41 @@ int HCISharedMemTransportClass::bt_ipm_set_addr(void)
725
817
return 0 ; /* Error */
726
818
}
727
819
820
+ int HCISharedMemTransportClass::bt_ipm_set_random_addr (void )
821
+ {
822
+ /* the specific table for set addr is 8 bytes:
823
+ * one byte for config_offset
824
+ * one byte for length
825
+ * 6 bytes for payload */
826
+ uint8_t data[4 + 8 ];
827
+
828
+ /*
829
+ * Static random Address
830
+ * The two upper bits shall be set to 1
831
+ * The lowest 32bits is read from the UDN to differentiate between devices
832
+ * The RNG may be used to provide a random number on each power on
833
+ */
834
+ uint32_t srd_bd_addr[2 ];
835
+
836
+ phase_random_addr = false ;
837
+
838
+ srd_bd_addr[1 ] = 0x0000ED6E ;
839
+ srd_bd_addr[0 ] = LL_FLASH_GetUDN ( );
840
+
841
+ data[0 ] = BT_BUF_CMD;
842
+ data[1 ] = uint8_t (ACI_WRITE_CONFIG_DATA_OPCODE & 0x000000FF ); /* OCF */
843
+ data[2 ] = uint8_t ((ACI_WRITE_CONFIG_DATA_OPCODE & 0x0000FF00 ) >> 8 ); /* OGF */
844
+ data[3 ] = 8 ; /* length of parameters */
845
+ /* fill the ACI_HAL_WRITE_CONFIG_DATA with the addr*/
846
+ data[4 ] = 0x2E ; /* the offset */
847
+ data[5 ] = 6 ; /* is the length of the random address */
848
+ memcpy (data + 6 , srd_bd_addr, 6 );
849
+ /* send the ACI_HAL_WRITE_CONFIG_DATA */
850
+ mbox_write (data[0 ], 11 , &data[1 ]);
851
+ /* now wait for the corresponding Rx event */
852
+ return 1 ; /* success */
853
+ }
854
+
728
855
int HCISharedMemTransportClass::bt_ipm_set_power (void )
729
856
{
730
857
/* the specific table for power is 2 bytes:
@@ -737,14 +864,79 @@ int HCISharedMemTransportClass::bt_ipm_set_power(void)
737
864
data[1 ] = (uint8_t )(ACI_HAL_SET_TX_POWER_LEVEL & 0x000000FF ); /* the OPCODE */
738
865
data[2 ] = (uint8_t )((ACI_HAL_SET_TX_POWER_LEVEL & 0x0000FF00 ) >> 8 );
739
866
data[3 ] = 2 ; /* the length */
740
- /* fill the ACI_HAL_WRITE_CONFIG_DATA */
867
+ /* fill the SET_POWER */
741
868
data[4 ] = 0x01 ; /* En_High_Power */
742
869
data[5 ] = CFG_TX_POWER; /* PA_level */
743
870
744
- /* send the ACI_HAL_WRITE_CONFIG_DATA */
871
+ /* send the SET_POWER */
745
872
mbox_write (data[0 ], 5 , &data[1 ]);
746
873
/* now wait for the corresponding Rx event */
747
874
return 1 ; /* success */
748
875
}
749
876
877
+ int HCISharedMemTransportClass::bt_ipm_gatt_init (void )
878
+ {
879
+ /* the specific table for gatt init */
880
+ uint8_t data[4 ];
881
+
882
+ phase_gatt_init = false ;
883
+
884
+ data[0 ] = BT_BUF_CMD; /* the type */
885
+ data[1 ] = 0x01 ; /* the OPCODE */
886
+ data[2 ] = 0xFD ;
887
+ data[3 ] = 0 ; /* the length */
888
+
889
+ /* send the GATT_INIT */
890
+ mbox_write (data[0 ], 3 , &data[1 ]);
891
+ /* now wait for the corresponding Rx event */
892
+ return 1 ; /* success */
893
+ }
894
+
895
+ int HCISharedMemTransportClass::bt_ipm_gap_init (void )
896
+ {
897
+ /* the specific table for gap init is 3 bytes:
898
+ * Role byte, enable_privacy byte, device_name_char_len byte */
899
+ uint8_t data[4 + 3 ];
900
+
901
+ phase_tx_power = false ;
902
+
903
+ data[0 ] = BT_BUF_CMD; /* the type */
904
+ data[1 ] = 0x8A ; /* the OPCODE */
905
+ data[2 ] = 0xFC ;
906
+ data[3 ] = 3 ; /* the length */
907
+ /* fill the GAP_INIT */
908
+ data[4 ] = 0x0F ; /* role */
909
+ data[5 ] = 0x00 ; /* enable_privacy */
910
+ data[6 ] = 0x00 ; /* device_name_char_len */
911
+
912
+ /* send the GAP_INIT */
913
+ mbox_write (data[0 ], 6 , &data[1 ]);
914
+ /* now wait for the corresponding Rx event */
915
+ return 1 ; /* success */
916
+ }
917
+
918
+ int HCISharedMemTransportClass::bt_ipm_get_random_addr (void )
919
+ {
920
+ /* the specific table for set addr is 8 bytes:
921
+ * one byte for config_offset
922
+ * one byte for length
923
+ * 6 bytes for payload */
924
+ uint8_t data[4 + 1 ];
925
+
926
+ phase_get_random_addr = false ;
927
+
928
+ /* create ACI_READ_CONFIG_DATA_OPCODE */
929
+ data[0 ] = BT_BUF_CMD;
930
+ data[1 ] = uint8_t (ACI_READ_CONFIG_DATA_OPCODE & 0x000000FF ); /* OCF */
931
+ data[2 ] = uint8_t ((ACI_READ_CONFIG_DATA_OPCODE & 0x0000FF00 ) >> 8 ); /* OGF */
932
+ data[3 ] = 1 ; /* length of parameters */
933
+ /* fill the ACI_READ_CONFIG_DATA_OPCODE with the offset*/
934
+ data[4 ] = 0x2E ; /* the offset */
935
+
936
+ /* send the ACI_READ_CONFIG_DATA_OPCODE */
937
+ mbox_write (data[0 ], 4 , &data[1 ]);
938
+ /* now wait for the corresponding Rx event */
939
+ return 1 ; /* success */
940
+ }
941
+
750
942
#endif /* STM32WBxx */
0 commit comments