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