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
+ #endif
24
26
#include " Callback.h"
25
27
#include " rtos/ThisThread.h"
26
28
#include < chrono>
@@ -32,8 +34,12 @@ namespace cypress_ble {
32
34
using namespace std ::chrono_literals;
33
35
34
36
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),
37
+ #if defined(CYW43XXX_UNBUFFERED_UART)
38
+ uart (tx, rx),
39
+ #else
36
40
tx (tx), rx(rx),
41
+ #endif
42
+ cts (cts), rts(rts),
37
43
bt_host_wake_name (bt_host_wake_name),
38
44
bt_device_wake_name (bt_device_wake_name),
39
45
bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -47,10 +53,13 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
47
53
bt_host_wake_active = false ;
48
54
}
49
55
50
- CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) :
51
- cts (cts),
52
- rts (rts),
56
+ CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) :
57
+ #if defined(CYW43XXX_UNBUFFERED_UART)
58
+ uart (tx, rx),
59
+ #else
53
60
tx (tx), rx(rx),
61
+ #endif
62
+ cts (cts), rts(rts),
54
63
bt_host_wake_name (NC),
55
64
bt_device_wake_name (NC),
56
65
bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -107,16 +116,31 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
107
116
}
108
117
}
109
118
119
+ #if defined(CYW43XXX_UNBUFFERED_UART)
120
+ void CyH4TransportDriver::on_controller_irq ()
121
+ #else
110
122
static void on_controller_irq (void *callback_arg, cyhal_uart_event_t event)
123
+ #endif
111
124
{
125
+ #if !defined(CYW43XXX_UNBUFFERED_UART)
112
126
(void )(event);
113
127
cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
128
+ #endif
129
+
114
130
sleep_manager_lock_deep_sleep ();
115
131
132
+ #if defined(CYW43XXX_UNBUFFERED_UART)
133
+ while (uart.readable ()) {
134
+ uint8_t char_received;
135
+ if (uart.read (&char_received, 1 )) {
136
+ CordioHCITransportDriver::on_data_received (&char_received, 1 );
137
+ }
138
+ #else
116
139
while (cyhal_uart_readable (uart_obj)) {
117
140
uint8_t char_received;
118
141
cyhal_uart_getc (uart_obj, &char_received, 0 );
119
142
CyH4TransportDriver::on_data_received (&char_received, 1 );
143
+ #endif
120
144
}
121
145
122
146
sleep_manager_unlock_deep_sleep ();
@@ -129,6 +153,26 @@ void CyH4TransportDriver::initialize()
129
153
bt_power = 0 ;
130
154
rtos::ThisThread::sleep_for (1ms);
131
155
156
+ #if defined(CYW43XXX_UNBUFFERED_UART)
157
+ uart.baud (DEF_BT_BAUD_RATE);
158
+
159
+ uart.format (
160
+ /* bits */ 8 ,
161
+ /* parity */ mbed::SerialBase::None,
162
+ /* stop bit */ 1
163
+ );
164
+
165
+ uart.set_flow_control (
166
+ /* flow */ mbed::SerialBase::RTSCTS,
167
+ /* rts */ rts,
168
+ /* cts */ cts
169
+ );
170
+
171
+ uart.attach (
172
+ mbed::callback (this , &CyH4TransportDriver::on_controller_irq),
173
+ mbed::SerialBase::RxIrq
174
+ );
175
+ #else
132
176
cyhal_uart_init (&uart, tx, rx, NULL , NULL );
133
177
134
178
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 +181,7 @@ void CyH4TransportDriver::initialize()
137
181
cyhal_uart_clear (&uart);
138
182
cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
139
183
cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
184
+ #endif
140
185
141
186
bt_power = 1 ;
142
187
@@ -160,6 +205,7 @@ void CyH4TransportDriver::initialize()
160
205
161
206
void CyH4TransportDriver::terminate ()
162
207
{
208
+ #if !defined(CYW43XXX_UNBUFFERED_UART)
163
209
cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t )(CYHAL_UART_IRQ_RX_DONE
164
210
| CYHAL_UART_IRQ_TX_DONE
165
211
| CYHAL_UART_IRQ_RX_NOT_EMPTY
@@ -170,6 +216,7 @@ void CyH4TransportDriver::terminate()
170
216
CYHAL_ISR_PRIORITY_DEFAULT,
171
217
false
172
218
);
219
+ #endif
173
220
174
221
if (bt_host_wake.is_connected ())
175
222
{
@@ -182,7 +229,11 @@ void CyH4TransportDriver::terminate()
182
229
183
230
bt_power = 0 ; // BT_POWER is an output, should not be freed only set inactive
184
231
232
+ #if defined(CYW43XXX_UNBUFFERED_UART)
233
+ uart.close ();
234
+ #else
185
235
cyhal_uart_free (&uart);
236
+ #endif
186
237
}
187
238
188
239
uint16_t CyH4TransportDriver::write (uint8_t type, uint16_t len, uint8_t *pData)
@@ -194,11 +245,20 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
194
245
195
246
while (i < len + 1 ) {
196
247
uint8_t to_write = i == 0 ? type : pData[i - 1 ];
248
+ #if defined(CYW43XXX_UNBUFFERED_UART)
249
+ while (uart.writeable () == 0 );
250
+ uart.write (&to_write, 1 );
251
+ #else
197
252
while (cyhal_uart_writable (&uart) == 0 );
198
253
cyhal_uart_putc (&uart, to_write);
254
+ #endif
199
255
++i;
200
256
}
257
+ #if defined(CYW43XXX_UNBUFFERED_UART)
258
+ while (uart.writeable () == 0 );
259
+ #else
201
260
while (cyhal_uart_is_tx_active (&uart));
261
+ #endif
202
262
203
263
deassert_bt_dev_wake ();
204
264
sleep_manager_unlock_deep_sleep ();
@@ -234,8 +294,12 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
234
294
235
295
void CyH4TransportDriver::update_uart_baud_rate (int baud)
236
296
{
297
+ #if defined(CYW43XXX_UNBUFFERED_UART)
298
+ uart.baud ((uint32_t )baud);
299
+ #else
237
300
uint32_t ignore;
238
301
cyhal_uart_set_baud (&uart, (uint32_t )baud, &ignore);
302
+ #endif
239
303
}
240
304
241
305
bool CyH4TransportDriver::get_enabled_powersave ()
0 commit comments