20
20
#include " CyH4TransportDriver.h"
21
21
#include " mbed_power_mgmt.h"
22
22
#include " drivers/InterruptIn.h"
23
+ #if !defined(CYW43XXX_UNBUFFERED_UART)
23
24
#include " cybsp_types.h"
25
+ #else
26
+ #include " mbed_wait_api.h"
27
+ #endif
24
28
#include " Callback.h"
25
29
#include " rtos/ThisThread.h"
26
30
#include < chrono>
@@ -32,8 +36,12 @@ namespace cypress_ble {
32
36
using namespace std ::chrono_literals;
33
37
34
38
CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name, uint8_t host_wake_irq, uint8_t dev_wake_irq) :
35
- cts (cts), rts(rts),
39
+ #if defined(CYW43XXX_UNBUFFERED_UART)
40
+ uart (tx, rx),
41
+ #else
36
42
tx (tx), rx(rx),
43
+ #endif
44
+ cts (cts), rts(rts),
37
45
bt_host_wake_name (bt_host_wake_name),
38
46
bt_device_wake_name (bt_device_wake_name),
39
47
bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -47,10 +55,13 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
47
55
bt_host_wake_active = false ;
48
56
}
49
57
50
- CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) :
51
- cts (cts),
52
- rts (rts),
58
+ CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) :
59
+ #if defined(CYW43XXX_UNBUFFERED_UART)
60
+ uart (tx, rx),
61
+ #else
53
62
tx (tx), rx(rx),
63
+ #endif
64
+ cts (cts), rts(rts),
54
65
bt_host_wake_name (NC),
55
66
bt_device_wake_name (NC),
56
67
bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -107,16 +118,31 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
107
118
}
108
119
}
109
120
121
+ #if defined(CYW43XXX_UNBUFFERED_UART)
122
+ void CyH4TransportDriver::on_controller_irq ()
123
+ #else
110
124
static void on_controller_irq (void *callback_arg, cyhal_uart_event_t event)
125
+ #endif
111
126
{
127
+ #if !defined(CYW43XXX_UNBUFFERED_UART)
112
128
(void )(event);
113
129
cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
130
+ #endif
131
+
114
132
sleep_manager_lock_deep_sleep ();
115
133
134
+ #if defined(CYW43XXX_UNBUFFERED_UART)
135
+ while (uart.readable ()) {
136
+ uint8_t char_received;
137
+ if (uart.read (&char_received, 1 )) {
138
+ CordioHCITransportDriver::on_data_received (&char_received, 1 );
139
+ }
140
+ #else
116
141
while (cyhal_uart_readable (uart_obj)) {
117
142
uint8_t char_received;
118
143
cyhal_uart_getc (uart_obj, &char_received, 0 );
119
144
CyH4TransportDriver::on_data_received (&char_received, 1 );
145
+ #endif
120
146
}
121
147
122
148
sleep_manager_unlock_deep_sleep ();
@@ -129,6 +155,26 @@ void CyH4TransportDriver::initialize()
129
155
bt_power = 0 ;
130
156
rtos::ThisThread::sleep_for (1ms);
131
157
158
+ #if defined(CYW43XXX_UNBUFFERED_UART)
159
+ uart.baud (DEF_BT_BAUD_RATE);
160
+
161
+ uart.format (
162
+ /* bits */ 8 ,
163
+ /* parity */ mbed::SerialBase::None,
164
+ /* stop bit */ 1
165
+ );
166
+
167
+ uart.set_flow_control (
168
+ /* flow */ mbed::SerialBase::RTSCTS,
169
+ /* rts */ rts,
170
+ /* cts */ cts
171
+ );
172
+
173
+ uart.attach (
174
+ mbed::callback (this , &CyH4TransportDriver::on_controller_irq),
175
+ mbed::SerialBase::RxIrq
176
+ );
177
+ #else
132
178
cyhal_uart_init (&uart, tx, rx, NULL , NULL );
133
179
134
180
const cyhal_uart_cfg_t uart_cfg = { .data_bits = 8 , .stop_bits = 1 , .parity = CYHAL_UART_PARITY_NONE, .rx_buffer = NULL , .rx_buffer_size = 0 };
@@ -137,6 +183,7 @@ void CyH4TransportDriver::initialize()
137
183
cyhal_uart_clear (&uart);
138
184
cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
139
185
cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
186
+ #endif
140
187
141
188
bt_power = 1 ;
142
189
@@ -160,6 +207,7 @@ void CyH4TransportDriver::initialize()
160
207
161
208
void CyH4TransportDriver::terminate ()
162
209
{
210
+ #if !defined(CYW43XXX_UNBUFFERED_UART)
163
211
cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t )(CYHAL_UART_IRQ_RX_DONE
164
212
| CYHAL_UART_IRQ_TX_DONE
165
213
| CYHAL_UART_IRQ_RX_NOT_EMPTY
@@ -170,6 +218,7 @@ void CyH4TransportDriver::terminate()
170
218
CYHAL_ISR_PRIORITY_DEFAULT,
171
219
false
172
220
);
221
+ #endif
173
222
174
223
if (bt_host_wake.is_connected ())
175
224
{
@@ -182,7 +231,11 @@ void CyH4TransportDriver::terminate()
182
231
183
232
bt_power = 0 ; // BT_POWER is an output, should not be freed only set inactive
184
233
234
+ #if defined(CYW43XXX_UNBUFFERED_UART)
235
+ uart.close ();
236
+ #else
185
237
cyhal_uart_free (&uart);
238
+ #endif
186
239
}
187
240
188
241
uint16_t CyH4TransportDriver::write (uint8_t type, uint16_t len, uint8_t *pData)
@@ -194,11 +247,25 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
194
247
195
248
while (i < len + 1 ) {
196
249
uint8_t to_write = i == 0 ? type : pData[i - 1 ];
250
+ #if defined(CYW43XXX_UNBUFFERED_UART)
251
+ while (uart.writeable () == 0 );
252
+ uart.write (&to_write, 1 );
253
+ #else
197
254
while (cyhal_uart_writable (&uart) == 0 );
198
255
cyhal_uart_putc (&uart, to_write);
256
+ #endif
199
257
++i;
200
258
}
259
+ #if defined(CYW43XXX_UNBUFFERED_UART)
260
+ /* Assuming a 16 byte FIFO as worst case this will ensure all bytes are sent before deasserting bt_dev_wake */
261
+ #ifndef BT_UART_NO_3M_SUPPORT
262
+ wait_us (50 ); // 3000000 bps
263
+ #else
264
+ rtos::ThisThread::sleep_for (2ms); // 115200 bps
265
+ #endif
266
+ #else
201
267
while (cyhal_uart_is_tx_active (&uart));
268
+ #endif
202
269
203
270
deassert_bt_dev_wake ();
204
271
sleep_manager_unlock_deep_sleep ();
@@ -234,8 +301,12 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
234
301
235
302
void CyH4TransportDriver::update_uart_baud_rate (int baud)
236
303
{
304
+ #if defined(CYW43XXX_UNBUFFERED_UART)
305
+ uart.baud ((uint32_t )baud);
306
+ #else
237
307
uint32_t ignore;
238
308
cyhal_uart_set_baud (&uart, (uint32_t )baud, &ignore);
309
+ #endif
239
310
}
240
311
241
312
bool CyH4TransportDriver::get_enabled_powersave ()
0 commit comments