Skip to content

Commit c0a8e41

Browse files
facchinmpennam
authored andcommitted
CYW43XXX: Add generic transport layer
1 parent 8a19e3e commit c0a8e41

File tree

2 files changed

+83
-7
lines changed

2 files changed

+83
-7
lines changed

connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp

Lines changed: 68 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
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 {
3234
using namespace std::chrono_literals;
3335

3436
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
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
110122
static 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

161206
void 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

188239
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)
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

235295
void 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

241305
bool CyH4TransportDriver::get_enabled_powersave()

connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,12 @@
2424
#include "ble/driver/CordioHCITransportDriver.h"
2525
#include "drivers/DigitalInOut.h"
2626
#include "drivers/InterruptIn.h"
27+
28+
#if defined(CYW43XXX_UNBUFFERED_UART)
29+
#include "drivers/UnbufferedSerial.h"
30+
#else
2731
#include "cyhal_uart.h"
32+
#endif
2833

2934
namespace ble {
3035
namespace vendor {
@@ -81,6 +86,10 @@ class CyH4TransportDriver : public CordioHCITransportDriver {
8186
private:
8287
void assert_bt_dev_wake();
8388
void deassert_bt_dev_wake();
89+
90+
#if defined(CYW43XXX_UNBUFFERED_UART)
91+
void on_controller_irq();
92+
#endif
8493

8594
// Use HAL serial because Cypress UART is buffered.
8695
// The PUTC function does not actually blocks until data is fully transmitted,
@@ -89,12 +98,15 @@ class CyH4TransportDriver : public CordioHCITransportDriver {
8998
// However UART APIs does not prevent the BT radio from going to sleep.
9099
// Use the HAL APIs to prevent the radio from going to sleep until UART transmition is complete.
91100
// Mbed layer has no API that distinguish between data in HW buffer v.s. data already transmitted.
92-
101+
#if defined(CYW43XXX_UNBUFFERED_UART)
102+
mbed::UnbufferedSerial uart;
103+
#else
93104
cyhal_uart_t uart;
94-
PinName cts;
95-
PinName rts;
105+
#endif
96106
PinName tx;
97107
PinName rx;
108+
PinName cts;
109+
PinName rts;
98110
PinName bt_host_wake_name;
99111
PinName bt_device_wake_name;
100112

0 commit comments

Comments
 (0)