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+ #else
26+ #include " mbed_wait_api.h"
27+ #endif
2428#include " Callback.h"
2529#include " rtos/ThisThread.h"
2630#include < chrono>
@@ -32,8 +36,12 @@ namespace cypress_ble {
3236using namespace std ::chrono_literals;
3337
3438CyH4TransportDriver::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
3642 tx (tx), rx(rx),
43+ #endif
44+ cts (cts), rts(rts),
3745 bt_host_wake_name (bt_host_wake_name),
3846 bt_device_wake_name (bt_device_wake_name),
3947 bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -47,10 +55,13 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
4755 bt_host_wake_active = false ;
4856}
4957
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
5362 tx (tx), rx(rx),
63+ #endif
64+ cts (cts), rts(rts),
5465 bt_host_wake_name (NC),
5566 bt_device_wake_name (NC),
5667 bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
@@ -107,16 +118,31 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
107118 }
108119}
109120
121+ #if defined(CYW43XXX_UNBUFFERED_UART)
122+ void CyH4TransportDriver::on_controller_irq ()
123+ #else
110124static void on_controller_irq (void *callback_arg, cyhal_uart_event_t event)
125+ #endif
111126{
127+ #if !defined(CYW43XXX_UNBUFFERED_UART)
112128 (void )(event);
113129 cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
130+ #endif
131+
114132 sleep_manager_lock_deep_sleep ();
115133
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
116141 while (cyhal_uart_readable (uart_obj)) {
117142 uint8_t char_received;
118143 cyhal_uart_getc (uart_obj, &char_received, 0 );
119144 CyH4TransportDriver::on_data_received (&char_received, 1 );
145+ #endif
120146 }
121147
122148 sleep_manager_unlock_deep_sleep ();
@@ -129,6 +155,26 @@ void CyH4TransportDriver::initialize()
129155 bt_power = 0 ;
130156 rtos::ThisThread::sleep_for (1ms);
131157
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
132178 cyhal_uart_init (&uart, tx, rx, NULL , NULL );
133179
134180 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()
137183 cyhal_uart_clear (&uart);
138184 cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
139185 cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
186+ #endif
140187
141188 bt_power = 1 ;
142189
@@ -160,6 +207,7 @@ void CyH4TransportDriver::initialize()
160207
161208void CyH4TransportDriver::terminate ()
162209{
210+ #if !defined(CYW43XXX_UNBUFFERED_UART)
163211 cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t )(CYHAL_UART_IRQ_RX_DONE
164212 | CYHAL_UART_IRQ_TX_DONE
165213 | CYHAL_UART_IRQ_RX_NOT_EMPTY
@@ -170,6 +218,7 @@ void CyH4TransportDriver::terminate()
170218 CYHAL_ISR_PRIORITY_DEFAULT,
171219 false
172220 );
221+ #endif
173222
174223 if (bt_host_wake.is_connected ())
175224 {
@@ -182,7 +231,11 @@ void CyH4TransportDriver::terminate()
182231
183232 bt_power = 0 ; // BT_POWER is an output, should not be freed only set inactive
184233
234+ #if defined(CYW43XXX_UNBUFFERED_UART)
235+ uart.close ();
236+ #else
185237 cyhal_uart_free (&uart);
238+ #endif
186239}
187240
188241uint16_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)
194247
195248 while (i < len + 1 ) {
196249 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
197254 while (cyhal_uart_writable (&uart) == 0 );
198255 cyhal_uart_putc (&uart, to_write);
256+ #endif
199257 ++i;
200258 }
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
201267 while (cyhal_uart_is_tx_active (&uart));
268+ #endif
202269
203270 deassert_bt_dev_wake ();
204271 sleep_manager_unlock_deep_sleep ();
@@ -234,8 +301,12 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
234301
235302void CyH4TransportDriver::update_uart_baud_rate (int baud)
236303{
304+ #if defined(CYW43XXX_UNBUFFERED_UART)
305+ uart.baud ((uint32_t )baud);
306+ #else
237307 uint32_t ignore;
238308 cyhal_uart_set_baud (&uart, (uint32_t )baud, &ignore);
309+ #endif
239310}
240311
241312bool CyH4TransportDriver::get_enabled_powersave ()
0 commit comments