2020#include " CyH4TransportDriver.h"
2121#include " mbed_power_mgmt.h"
2222#include " drivers/InterruptIn.h"
23+ #if !defined(CYW43XXX_UNBUFFERED_UART)
2324#include " cybsp_types.h"
25+ #endif
2426#include " Callback.h"
2527#include " rtos/ThisThread.h"
2628#include < chrono>
@@ -32,8 +34,12 @@ namespace cypress_ble {
3234using namespace std ::chrono_literals;
3335
3436CyH4TransportDriver::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
3640 tx (tx), rx(rx),
41+ #endif
42+ cts (cts), rts(rts),
3743 bt_host_wake_name (bt_host_wake_name),
3844 bt_device_wake_name (bt_device_wake_name),
3945 bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -47,10 +53,13 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
4753 bt_host_wake_active = false ;
4854}
4955
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
5360 tx (tx), rx(rx),
61+ #endif
62+ cts (cts), rts(rts),
5463 bt_host_wake_name (NC),
5564 bt_device_wake_name (NC),
5665 bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -107,16 +116,31 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
107116 }
108117}
109118
119+ #if defined(CYW43XXX_UNBUFFERED_UART)
120+ void CyH4TransportDriver::on_controller_irq ()
121+ #else
110122static void on_controller_irq (void *callback_arg, cyhal_uart_event_t event)
123+ #endif
111124{
125+ #if !defined(CYW43XXX_UNBUFFERED_UART)
112126 (void )(event);
113127 cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
128+ #endif
129+
114130 sleep_manager_lock_deep_sleep ();
115131
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
116139 while (cyhal_uart_readable (uart_obj)) {
117140 uint8_t char_received;
118141 cyhal_uart_getc (uart_obj, &char_received, 0 );
119142 CyH4TransportDriver::on_data_received (&char_received, 1 );
143+ #endif
120144 }
121145
122146 sleep_manager_unlock_deep_sleep ();
@@ -129,6 +153,26 @@ void CyH4TransportDriver::initialize()
129153 bt_power = 0 ;
130154 rtos::ThisThread::sleep_for (1ms);
131155
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
132176 cyhal_uart_init (&uart, tx, rx, NULL , NULL );
133177
134178 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()
137181 cyhal_uart_clear (&uart);
138182 cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
139183 cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
184+ #endif
140185
141186 bt_power = 1 ;
142187
@@ -160,6 +205,7 @@ void CyH4TransportDriver::initialize()
160205
161206void CyH4TransportDriver::terminate ()
162207{
208+ #if !defined(CYW43XXX_UNBUFFERED_UART)
163209 cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t )(CYHAL_UART_IRQ_RX_DONE
164210 | CYHAL_UART_IRQ_TX_DONE
165211 | CYHAL_UART_IRQ_RX_NOT_EMPTY
@@ -170,6 +216,7 @@ void CyH4TransportDriver::terminate()
170216 CYHAL_ISR_PRIORITY_DEFAULT,
171217 false
172218 );
219+ #endif
173220
174221 if (bt_host_wake.is_connected ())
175222 {
@@ -182,7 +229,11 @@ void CyH4TransportDriver::terminate()
182229
183230 bt_power = 0 ; // BT_POWER is an output, should not be freed only set inactive
184231
232+ #if defined(CYW43XXX_UNBUFFERED_UART)
233+ uart.close ();
234+ #else
185235 cyhal_uart_free (&uart);
236+ #endif
186237}
187238
188239uint16_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)
194245
195246 while (i < len + 1 ) {
196247 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
197252 while (cyhal_uart_writable (&uart) == 0 );
198253 cyhal_uart_putc (&uart, to_write);
254+ #endif
199255 ++i;
200256 }
257+ #if defined(CYW43XXX_UNBUFFERED_UART)
258+ while (uart.writeable () == 0 );
259+ #else
201260 while (cyhal_uart_is_tx_active (&uart));
261+ #endif
202262
203263 deassert_bt_dev_wake ();
204264 sleep_manager_unlock_deep_sleep ();
@@ -234,8 +294,12 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
234294
235295void CyH4TransportDriver::update_uart_baud_rate (int baud)
236296{
297+ #if defined(CYW43XXX_UNBUFFERED_UART)
298+ uart.baud ((uint32_t )baud);
299+ #else
237300 uint32_t ignore;
238301 cyhal_uart_set_baud (&uart, (uint32_t )baud, &ignore);
302+ #endif
239303}
240304
241305bool CyH4TransportDriver::get_enabled_powersave ()
0 commit comments