@@ -30,19 +30,27 @@ extern const int brcm_patch_ram_length;
30
30
extern const uint8_t brcm_patchram_buf[];
31
31
32
32
static const uint8_t pre_brcm_patchram_buf[] = {
33
- // RESET followed by download mini driver cmd
33
+ // RESET followed by update uart baudrate
34
34
0x03 , 0x0C , 0x00 ,
35
+ 0x18 , 0xFC , 0x06 , 0x00 , 0x00 , 0xC0 , 0xC6 , 0x2D , 0x00 , // update uart baudrate 3 mbp
36
+ };
37
+
38
+ static const uint8_t pre_brcm_patchram_buf2[] = {
39
+ // download mini driver
35
40
0x2E , 0xFC , 0x00 ,
36
41
};
42
+
37
43
static const uint8_t post_brcm_patchram_buf[] = {
38
44
// RESET cmd
39
45
0x03 , 0x0C , 0x00 ,
40
46
};
41
47
42
48
static const int pre_brcm_patch_ram_length = sizeof (pre_brcm_patchram_buf);
49
+ static const int pre_brcm_patch_ram_length2 = sizeof (pre_brcm_patchram_buf2);
43
50
static const int post_brcm_patch_ram_length = sizeof (post_brcm_patchram_buf);
44
51
45
52
#define HCI_RESET_RAND_CNT 4
53
+ #define HCI_VS_CMD_UPDATE_UART_BAUD_RATE 0xFC18
46
54
#define HCI_VS_CMD_SET_SLEEP_MODE 0xFC27
47
55
48
56
@@ -55,7 +63,7 @@ namespace cypress {
55
63
class HCIDriver : public cordio ::CordioHCIDriver {
56
64
public:
57
65
HCIDriver (
58
- cordio::CordioHCITransportDriver & transport_driver,
66
+ ble::vendor::cypress_ble::CyH4TransportDriver & transport_driver,
59
67
PinName bt_power_name,
60
68
bool ps_enabled,
61
69
uint8_t host_wake_irq,
@@ -70,7 +78,8 @@ class HCIDriver : public cordio::CordioHCIDriver {
70
78
service_pack_ptr(0 ),
71
79
service_pack_length(0 ),
72
80
service_pack_next(),
73
- service_pack_transfered(false ) {
81
+ service_pack_transfered(false ),
82
+ cy_transport_driver(transport_driver) {
74
83
}
75
84
76
85
virtual cordio::buf_pool_desc_t get_buffer_pool_description ()
@@ -81,6 +90,9 @@ class HCIDriver : public cordio::CordioHCIDriver {
81
90
82
91
virtual void do_initialize ()
83
92
{
93
+ // Prevent PSoC6 to enter deep-sleep till BT initialization is complete
94
+ sleep_manager_lock_deep_sleep ();
95
+ rtos::ThisThread::sleep_for (500 );
84
96
bt_power = 1 ;
85
97
rtos::ThisThread::sleep_for (500 );
86
98
}
@@ -113,6 +125,40 @@ class HCIDriver : public cordio::CordioHCIDriver {
113
125
114
126
/* decode opcode */
115
127
switch (opcode) {
128
+ case HCI_VS_CMD_UPDATE_UART_BAUD_RATE:
129
+ cy_transport_driver.update_uart_baud_rate (DEF_BT_3M_BAUD_RATE);
130
+ #ifdef CY_DEBUG
131
+ HciReadLocalVerInfoCmd ();
132
+ #else
133
+ set_sleep_mode ();
134
+ #endif
135
+ break ;
136
+
137
+ #ifdef CY_DEBUG
138
+ case HCI_OPCODE_READ_LOCAL_VER_INFO:
139
+ uint8_t hci_version;
140
+ uint8_t hci_revision;
141
+ uint8_t lmp_revision;
142
+ uint16_t manufacturer_name;
143
+
144
+ BSTREAM_TO_UINT8 (hci_version, pMsg);
145
+ BSTREAM_TO_UINT8 (hci_revision, pMsg);
146
+ BSTREAM_TO_UINT8 (lmp_revision, pMsg);
147
+ BSTREAM_TO_UINT16 (manufacturer_name, pMsg);
148
+
149
+ if (hci_revision == 0 || manufacturer_name == 0xF )
150
+ {
151
+ printf (" bt firmware download failed, rom code is being used\n " );
152
+ }
153
+ else
154
+ {
155
+ printf (" bt firmware download success\n " );
156
+ }
157
+
158
+ set_sleep_mode ();
159
+ break ;
160
+ #endif
161
+
116
162
// Note: Reset is handled by ack_service_pack.
117
163
case HCI_VS_CMD_SET_SLEEP_MODE:
118
164
HciWriteLeHostSupport ();
@@ -263,20 +309,40 @@ class HCIDriver : public cordio::CordioHCIDriver {
263
309
}
264
310
}
265
311
312
+ #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
313
+ virtual void on_host_stack_inactivity (void )
314
+ {
315
+ cy_transport_driver.on_host_stack_inactivity ();
316
+ }
317
+ #endif
318
+
266
319
private:
267
320
268
- // send pre_brcm_patchram_buf
321
+ // send pre_brcm_patchram_buf issue hci reset and update baud rate on 43012
269
322
void prepare_service_pack_transfert (void )
270
323
{
271
324
service_pack_ptr = pre_brcm_patchram_buf;
272
325
service_pack_length = pre_brcm_patch_ram_length;
326
+ service_pack_next = &HCIDriver::prepare_service_pack_transfert2;
327
+ service_pack_index = 0 ;
328
+ service_pack_transfered = false ;
329
+ send_service_pack_command ();
330
+ }
331
+
332
+ // Called one pre_brcm_patchram_buf has been transferred; send pre_brcm_patchram_buf2 update uart baudrate
333
+ // on PSoC6 to send hci download minidriver
334
+ void prepare_service_pack_transfert2 (void )
335
+ {
336
+ cy_transport_driver.update_uart_baud_rate (DEF_BT_3M_BAUD_RATE);
337
+ service_pack_ptr = pre_brcm_patchram_buf2;
338
+ service_pack_length = pre_brcm_patch_ram_length2;
273
339
service_pack_next = &HCIDriver::start_service_pack_transfert;
274
340
service_pack_index = 0 ;
275
341
service_pack_transfered = false ;
276
342
send_service_pack_command ();
277
343
}
278
344
279
- // Called once pre_brcm_patchram_buf has been transferred; send brcm_patchram_buf
345
+ // Called once pre_brcm_patchram_buf2 has been transferred; send brcm_patchram_buf
280
346
void start_service_pack_transfert (void )
281
347
{
282
348
service_pack_ptr = brcm_patchram_buf;
@@ -290,6 +356,7 @@ class HCIDriver : public cordio::CordioHCIDriver {
290
356
// Called once brcm_patchram_buf has been transferred; send post_brcm_patchram_buf
291
357
void post_service_pack_transfert (void )
292
358
{
359
+ cy_transport_driver.update_uart_baud_rate (DEF_BT_BAUD_RATE);
293
360
service_pack_ptr = post_brcm_patchram_buf;
294
361
service_pack_length = post_brcm_patch_ram_length;
295
362
service_pack_next = &HCIDriver::terminate_service_pack_transfert;;
@@ -307,7 +374,8 @@ class HCIDriver : public cordio::CordioHCIDriver {
307
374
service_pack_next = NULL ;
308
375
service_pack_index = 0 ;
309
376
service_pack_transfered = true ;
310
- set_sleep_mode ();
377
+ HciUpdateUartBaudRate ();
378
+ sleep_manager_unlock_deep_sleep ();
311
379
}
312
380
313
381
void send_service_pack_command (void )
@@ -354,7 +422,11 @@ class HCIDriver : public cordio::CordioHCIDriver {
354
422
pBuf[HCI_CMD_HDR_LEN] = 0x00 ; // no sleep
355
423
}
356
424
pBuf[HCI_CMD_HDR_LEN + 1 ] = 0x00 ; // no idle threshold host (N/A)
357
- pBuf[HCI_CMD_HDR_LEN + 2 ] = 0x00 ; // no idle threshold HC (N/A)
425
+ if (is_powersave_on ()) {
426
+ pBuf[HCI_CMD_HDR_LEN + 2 ] = 0x05 ; // no idle threshold HC (N/A)
427
+ } else {
428
+ pBuf[HCI_CMD_HDR_LEN + 2 ] = 0x00 ; // no idle threshold HC (N/A)
429
+ }
358
430
if (is_powersave_on ()) {
359
431
pBuf[HCI_CMD_HDR_LEN + 3 ] = dev_wake_irq; // BT WAKE
360
432
} else {
@@ -363,15 +435,31 @@ class HCIDriver : public cordio::CordioHCIDriver {
363
435
if (is_powersave_on ()) {
364
436
pBuf[HCI_CMD_HDR_LEN + 4 ] = host_wake_irq; // HOST WAKE
365
437
} else {
366
- pBuf[HCI_CMD_HDR_LEN + 3 ] = 0x00 ; // BT WAKE
438
+ pBuf[HCI_CMD_HDR_LEN + 4 ] = 0x00 ; // HOST WAKE
367
439
}
368
440
pBuf[HCI_CMD_HDR_LEN + 5 ] = 0x00 ; // Sleep during SCO
369
441
pBuf[HCI_CMD_HDR_LEN + 6 ] = 0x00 ; // Combining sleep mode and SCM
370
442
pBuf[HCI_CMD_HDR_LEN + 7 ] = 0x00 ; // Tristate TX
371
443
pBuf[HCI_CMD_HDR_LEN + 8 ] = 0x00 ; // Active connection handling on suspend
372
444
pBuf[HCI_CMD_HDR_LEN + 9 ] = 0x00 ; // resume timeout
373
445
pBuf[HCI_CMD_HDR_LEN + 10 ] = 0x00 ; // break to host
374
- pBuf[HCI_CMD_HDR_LEN + 10 ] = 0x00 ; // Pulsed host wake
446
+ pBuf[HCI_CMD_HDR_LEN + 11 ] = 0x00 ; // Pulsed host wake
447
+ hciCmdSend (pBuf);
448
+ }
449
+ }
450
+
451
+ // 0x18, 0xFC, 0x06, 0x00, 0x00, 0xC0, 0xC6, 0x2D, 0x00, //update uart baudrate 3 mbp
452
+ void HciUpdateUartBaudRate ()
453
+ {
454
+ uint8_t *pBuf;
455
+ if ((pBuf = hciCmdAlloc (HCI_VS_CMD_UPDATE_UART_BAUD_RATE, 6 )) != NULL )
456
+ {
457
+ pBuf[HCI_CMD_HDR_LEN] = 0x00 ; // encoded_baud_rate
458
+ pBuf[HCI_CMD_HDR_LEN + 1 ] = 0x00 ; // use_encoded_form
459
+ pBuf[HCI_CMD_HDR_LEN + 2 ] = 0xC0 ; // explicit baud rate bit 0-7
460
+ pBuf[HCI_CMD_HDR_LEN + 3 ] = 0xC6 ; // explicit baud rate bit 8-15
461
+ pBuf[HCI_CMD_HDR_LEN + 4 ] = 0x2D ; // explicit baud rate bit 16-23
462
+ pBuf[HCI_CMD_HDR_LEN + 5 ] = 0x00 ; // explicit baud rate bit 24-31
375
463
hciCmdSend (pBuf);
376
464
}
377
465
}
@@ -440,6 +528,7 @@ class HCIDriver : public cordio::CordioHCIDriver {
440
528
int service_pack_length;
441
529
void (HCIDriver::*service_pack_next)();
442
530
bool service_pack_transfered;
531
+ ble::vendor::cypress_ble::CyH4TransportDriver& cy_transport_driver;
443
532
444
533
};
445
534
0 commit comments