@@ -53,12 +53,14 @@ PLACE_IN_SECTION("MB_MEM2") ALIGN(4) static uint8_t
53
53
uint16_t _read_index;
54
54
uint16_t _write_index;
55
55
56
-
57
56
/* * Bluetooth Device Address */
58
57
static uint8_t bd_addr_udn[6 ];
58
+
59
+ /* * different device steps */
59
60
static bool phase_bd_addr = false ;
60
61
static bool phase_tx_power = false ;
61
62
static bool phase_reset = false ;
63
+ static bool phase_cnx = false ;
62
64
63
65
HCISharedMemTransportClass::HCISharedMemTransportClass (BLEChip_t ble_chip) :
64
66
_ble_chip(ble_chip)
@@ -82,16 +84,16 @@ static void evt_received(TL_EvtPacket_t *hcievt)
82
84
case TL_BLEEVT_PKT_TYPE:
83
85
84
86
/* check the Rx event of complete the previous bd_addr opcode 0xfc0c */
85
- if ((hcievt->evtserial .evt .evtcode == 0x0e ) &&
87
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE ) &&
86
88
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
87
89
(hcievt->evtserial .evt .payload [1 ] == 0x0C ) &&
88
90
(hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
89
91
phase_bd_addr = true ;
90
92
/* rx data is no more useful */
91
93
break ;
92
94
}
93
- /* check the Rx event of complete the previous tx power opcode 0xfc0f */
94
- if ((hcievt->evtserial .evt .evtcode == 0x0e ) &&
95
+ /* check the Rx event of complete the previous tx power opcode 0xFC0F */
96
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE ) &&
95
97
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
96
98
(hcievt->evtserial .evt .payload [1 ] == 0x0F ) &&
97
99
(hcievt->evtserial .evt .payload [2 ] == 0xFC )) {
@@ -101,22 +103,31 @@ static void evt_received(TL_EvtPacket_t *hcievt)
101
103
}
102
104
103
105
/* check if the reset phase is in progress (opcode is 0x0C03) */
104
- if ((hcievt->evtserial .evt .evtcode == 0x0e ) &&
106
+ if ((hcievt->evtserial .evt .evtcode == TL_BLEEVT_CC_OPCODE ) &&
105
107
(hcievt->evtserial .evt .payload [0 ] == 0x01 ) &&
106
108
(hcievt->evtserial .evt .payload [1 ] == 0x03 ) &&
107
109
(hcievt->evtserial .evt .payload [2 ] == 0x0C )) {
108
- /* this is the HCI Reset command being sent */
109
110
phase_reset = true ;
110
111
}
111
112
113
+ /* check if the connection phase is up (event code is 0x3E) */
114
+ if ((hcievt->evtserial .evt .evtcode == 0x3E )) {
115
+ phase_cnx = true ;
116
+ }
117
+ /* check if the connection phase is down (event code is 0x05) */
118
+ if ((hcievt->evtserial .evt .evtcode == 0x05 )) {
119
+ phase_cnx = false ;
120
+ }
121
+
122
+ __disable_irq ();
112
123
/* store received data in the _rxbuff buffer */
113
124
len = hcievt->evtserial .evt .plen + TL_EVT_HDR_SIZE;
114
125
/* at the position of the _write_index */
115
126
memcpy ((uint8_t *)&_rxbuff[_write_index], (uint8_t *)&hcievt->evtserial , len);
116
127
/* move index */
117
128
_write_index += len;
118
129
// TODO: control the _rxbuff cannot overflow
119
-
130
+ __enable_irq ();
120
131
break ;
121
132
case TL_ACL_DATA_PKT_TYPE: {
122
133
TL_AclDataSerial_t *acl = &(((TL_AclDataPacket_t *)hcievt)->AclDataSerial );
@@ -353,19 +364,19 @@ int HCISharedMemTransportClass::available()
353
364
int HCISharedMemTransportClass::peek ()
354
365
{
355
366
int peek_val = -1 ;
356
-
367
+ __disable_irq ();
357
368
if (_read_index != _write_index)
358
369
{
359
370
peek_val = _rxbuff[_read_index];
360
371
}
361
-
372
+ __enable_irq ();
362
373
return peek_val;
363
374
}
364
375
365
376
int HCISharedMemTransportClass::read ()
366
377
{
367
378
int read_val = -1 ;
368
-
379
+ __disable_irq ();
369
380
if (_read_index != _write_index)
370
381
{
371
382
read_val = _rxbuff[_read_index];
@@ -377,7 +388,7 @@ int HCISharedMemTransportClass::read()
377
388
_write_index = 0 ;
378
389
}
379
390
}
380
-
391
+ __enable_irq ();
381
392
return read_val;
382
393
}
383
394
0 commit comments