@@ -63,6 +63,7 @@ static uint8_t bd_addr_udn[6];
63
63
static bool phase_bd_addr = false ;
64
64
static bool phase_tx_power = false ;
65
65
static bool phase_reset = false ;
66
+ static bool phase_running = false ;
66
67
67
68
HCISharedMemTransportClass::HCISharedMemTransportClass (BLEChip_t ble_chip) :
68
69
_ble_chip(ble_chip)
@@ -99,13 +100,20 @@ static void evt_received(TL_EvtPacket_t *hcievt)
99
100
#endif /* PRINT_HCI_DATA */
100
101
#endif /* DEBUG */
101
102
103
+ if (phase_running == false ) {
102
104
/* check the Rx event of complete the previous bd_addr opcode 0xfc0c */
103
105
if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
104
106
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
105
107
(hcievt->evtserial .evt .payload [1 ] == 0x0C ) &&
106
108
(hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
107
- phase_bd_addr = true ;
109
+ phase_bd_addr = true ;
108
110
/* rx data is no more useful */
111
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
112
+ #if defined(DEBUG)
113
+ printf (" Error: wrong BD Addr\r\n " );
114
+ #endif /* DEBUG */
115
+ return ;
116
+ }
109
117
break ;
110
118
}
111
119
/* check the Rx event of complete the previous tx power opcode 0xFC0F */
@@ -115,16 +123,31 @@ static void evt_received(TL_EvtPacket_t *hcievt)
115
123
(hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
116
124
phase_tx_power = true ;
117
125
/* rx data is no more useful */
126
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
127
+ #if defined(DEBUG)
128
+ printf (" Error: wrong Tx power\r\n " );
129
+ #endif /* DEBUG */
130
+ return ;
131
+ }
118
132
break ;
119
133
}
120
-
121
134
/* check if the reset phase is in progress (opcode is 0x0C03) */
122
135
if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE) &&
123
136
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
124
137
(hcievt->evtserial .evt .payload [1 ] == 0x03 ) &&
125
138
(hcievt->evtserial .evt .payload [2 ] == 0x0C )) {
126
139
phase_reset = true ;
140
+ if (hcievt->evtserial .evt .payload [3 ] != 0 ) {
141
+ #if defined(DEBUG)
142
+ printf (" Error: wrong reset\r\n " );
143
+ #endif /* DEBUG */
144
+ return ;
145
+ }
146
+ }
147
+ if ((phase_bd_addr == true ) && (phase_bd_addr == true ) && (phase_reset == true )) {
148
+ phase_running = true ;
127
149
}
150
+ }
128
151
__disable_irq ();
129
152
/* store received data in the _rxbuff buffer */
130
153
len = hcievt->evtserial .evt .plen + TL_EVT_HDR_SIZE;
@@ -623,7 +646,7 @@ static int bt_ipm_set_addr(void)
623
646
624
647
/* now wait for the corresponding Rx event */
625
648
while (!phase_bd_addr);
626
- phase_bd_addr = false ; /* this sequence is now complete */
649
+ /* this sequence is now complete */
627
650
628
651
return 1 ; /* success */
629
652
} else {
@@ -652,7 +675,7 @@ static int bt_ipm_set_power(void)
652
675
653
676
/* now wait for the corresponding Rx event */
654
677
while (!phase_tx_power);
655
- phase_tx_power = false ; /* this sequence is now complete */
678
+ /* this sequence is now complete */
656
679
657
680
return 1 ; /* success */
658
681
}
0 commit comments