Skip to content

Commit 2db301c

Browse files
committed
CYW43XXX: use cyhal or mbed uart
1 parent 75ffa1e commit 2db301c

File tree

2 files changed

+86
-6
lines changed

2 files changed

+86
-6
lines changed

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

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#include "CyH4TransportDriver.h"
2121
#include "mbed_power_mgmt.h"
2222
#include "drivers/InterruptIn.h"
23+
#if !defined(CYW43XXX_UNBUFFERED_UART)
24+
#include "cybsp_types.h"
25+
#endif
2326
#include "Callback.h"
2427
#include "rtos/ThisThread.h"
2528
#include <chrono>
@@ -30,9 +33,13 @@ namespace cypress_ble {
3033

3134
using namespace std::chrono_literals;
3235

33-
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-
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),
3643
bt_host_wake_name(bt_host_wake_name),
3744
bt_device_wake_name(bt_device_wake_name),
3845
bt_power(bt_power_name, PIN_OUTPUT, PullNone, 0),
@@ -47,9 +54,12 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi
4754
}
4855

4956
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
5260
tx(tx), rx(rx),
61+
#endif
62+
cts(cts), rts(rts),
5363
bt_host_wake_name(NC),
5464
bt_device_wake_name(NC),
5565
bt_power(bt_power_name, PIN_OUTPUT, PullNone, 0),
@@ -106,15 +116,31 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
106116
}
107117
}
108118

119+
#if defined(CYW43XXX_UNBUFFERED_UART)
109120
void CyH4TransportDriver::on_controller_irq()
121+
#else
122+
static void on_controller_irq(void *callback_arg, cyhal_uart_event_t event)
123+
#endif
110124
{
125+
#if !defined(CYW43XXX_UNBUFFERED_UART)
126+
(void)(event);
127+
cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
128+
#endif
129+
111130
sleep_manager_lock_deep_sleep();
112131

132+
#if defined(CYW43XXX_UNBUFFERED_UART)
113133
while (uart.readable()) {
114134
uint8_t char_received;
115135
if (uart.read(&char_received, 1)) {
116136
CordioHCITransportDriver::on_data_received(&char_received, 1);
117137
}
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
118144
}
119145

120146
sleep_manager_unlock_deep_sleep();
@@ -127,6 +153,7 @@ void CyH4TransportDriver::initialize()
127153
bt_power = 0;
128154
rtos::ThisThread::sleep_for(1ms);
129155

156+
#if defined(CYW43XXX_UNBUFFERED_UART)
130157
uart.baud(DEF_BT_BAUD_RATE);
131158

132159
uart.format(
@@ -145,6 +172,16 @@ void CyH4TransportDriver::initialize()
145172
mbed::callback(this, &CyH4TransportDriver::on_controller_irq),
146173
mbed::SerialBase::RxIrq
147174
);
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
148185

149186
bt_power = 1;
150187

@@ -168,6 +205,19 @@ void CyH4TransportDriver::initialize()
168205

169206
void CyH4TransportDriver::terminate()
170207
{
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+
171221
if(bt_host_wake.is_connected())
172222
{
173223
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
@@ -179,7 +229,11 @@ void CyH4TransportDriver::terminate()
179229

180230
bt_power = 0; //BT_POWER is an output, should not be freed only set inactive
181231

232+
#if defined(CYW43XXX_UNBUFFERED_UART)
182233
uart.close();
234+
#else
235+
cyhal_uart_free(&uart);
236+
#endif
183237
}
184238

185239
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)
191245

192246
while (i < len + 1) {
193247
uint8_t to_write = i == 0 ? type : pData[i - 1];
248+
#if defined(CYW43XXX_UNBUFFERED_UART)
194249
while (uart.writeable() == 0);
195250
uart.write(&to_write, 1);
251+
#else
252+
while (cyhal_uart_writable(&uart) == 0);
253+
cyhal_uart_putc(&uart, to_write);
254+
#endif
196255
++i;
197256
}
257+
#if defined(CYW43XXX_UNBUFFERED_UART)
198258
while (uart.writeable() == 0);
259+
#else
260+
while(cyhal_uart_is_tx_active(&uart));
261+
#endif
199262

200263
deassert_bt_dev_wake();
201264
sleep_manager_unlock_deep_sleep();
@@ -231,7 +294,12 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
231294

232295
void CyH4TransportDriver::update_uart_baud_rate(int baud)
233296
{
297+
#if defined(CYW43XXX_UNBUFFERED_UART)
234298
uart.baud((uint32_t)baud);
299+
#else
300+
uint32_t ignore;
301+
cyhal_uart_set_baud(&uart, (uint32_t)baud, &ignore);
302+
#endif
235303
}
236304

237305
bool CyH4TransportDriver::get_enabled_powersave()

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

Lines changed: 14 additions & 2 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)
2729
#include "drivers/UnbufferedSerial.h"
30+
#else
31+
#include "cyhal_uart.h"
32+
#endif
2833

2934
namespace ble {
3035
namespace vendor {
@@ -81,7 +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)
8491
void on_controller_irq();
92+
#endif
8593

8694
// Use HAL serial because Cypress UART is buffered.
8795
// The PUTC function does not actually blocks until data is fully transmitted,
@@ -90,11 +98,15 @@ class CyH4TransportDriver : public CordioHCITransportDriver {
9098
// However UART APIs does not prevent the BT radio from going to sleep.
9199
// Use the HAL APIs to prevent the radio from going to sleep until UART transmition is complete.
92100
// Mbed layer has no API that distinguish between data in HW buffer v.s. data already transmitted.
101+
#if defined(CYW43XXX_UNBUFFERED_UART)
93102
mbed::UnbufferedSerial uart;
94-
PinName cts;
95-
PinName rts;
103+
#else
104+
cyhal_uart_t uart;
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)