Skip to content

Commit 9b0f190

Browse files
authored
Merge pull request #14227 from arduino/cyw43xxx_transport_layer
CYW43XXX: Add generic transport layer
2 parents 0e52d49 + dc4fb8d commit 9b0f190

File tree

2 files changed

+90
-7
lines changed

2 files changed

+90
-7
lines changed

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

Lines changed: 75 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@
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 {
3236
using namespace std::chrono_literals;
3337

3438
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),
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
110124
static 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

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

188241
uint16_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

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

241312
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;
96105
PinName tx;
97106
PinName rx;
107+
#endif
108+
PinName cts;
109+
PinName rts;
98110
PinName bt_host_wake_name;
99111
PinName bt_device_wake_name;
100112

0 commit comments

Comments
 (0)