@@ -25,27 +25,28 @@ namespace cypress_ble {
25
25
26
26
27
27
CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name, uint8_t host_wake_irq, uint8_t dev_wake_irq) :
28
- uart (tx, rx, baud), cts(cts), rts(rts),
28
+ cts (cts), rts(rts),
29
29
bt_host_wake_name (bt_host_wake_name),
30
30
bt_device_wake_name (bt_device_wake_name),
31
31
bt_host_wake (bt_host_wake_name, PIN_INPUT, PullNone, 0 ),
32
32
bt_device_wake (bt_device_wake_name, PIN_OUTPUT, PullNone, 1 ),
33
33
host_wake_irq_event (host_wake_irq),
34
34
dev_wake_irq_event (dev_wake_irq)
35
35
{
36
+ cyhal_uart_init (&uart, tx, rx, NULL , NULL );
36
37
enabled_powersave = true ;
37
38
bt_host_wake_active = false ;
38
39
}
39
40
40
41
CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud) :
41
- uart (tx, rx, baud),
42
42
cts (cts),
43
43
rts (rts),
44
44
bt_host_wake_name (NC),
45
45
bt_device_wake_name (NC),
46
46
bt_host_wake (bt_host_wake_name),
47
47
bt_device_wake (bt_device_wake_name)
48
48
{
49
+ cyhal_uart_init (&uart, tx, rx, NULL , NULL );
49
50
enabled_powersave = false ;
50
51
bt_host_wake_active = false ;
51
52
sleep_manager_lock_deep_sleep ();
@@ -93,6 +94,21 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void)
93
94
}
94
95
}
95
96
97
+ static void on_controller_irq (void *callback_arg, cyhal_uart_event_t event)
98
+ {
99
+ (void )(event);
100
+ cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg;
101
+ sleep_manager_lock_deep_sleep ();
102
+
103
+ while (cyhal_uart_readable (uart_obj)) {
104
+ uint8_t char_received;
105
+ cyhal_uart_getc (uart_obj, &char_received, 0 );
106
+ CyH4TransportDriver::on_data_received (&char_received, 1 );
107
+ }
108
+
109
+ sleep_manager_unlock_deep_sleep ();
110
+ }
111
+
96
112
void CyH4TransportDriver::initialize ()
97
113
{
98
114
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
@@ -101,24 +117,11 @@ void CyH4TransportDriver::initialize()
101
117
102
118
sleep_manager_lock_deep_sleep ();
103
119
104
- uart.format (
105
- /* bits */ 8 ,
106
- /* parity */ SerialBase::None,
107
- /* stop bit */ 1
108
- );
109
-
110
- uart.set_flow_control (
111
- /* flow */ SerialBase::RTSCTS,
112
- /* rts */ rts,
113
- /* cts */ cts
114
- );
115
-
116
- uart.attach (
117
- callback (this , &CyH4TransportDriver::on_controller_irq),
118
- SerialBase::RxIrq
119
- );
120
-
121
- sleep_manager_unlock_deep_sleep ();
120
+ 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 };
121
+ cyhal_uart_configure (&uart, &uart_cfg);
122
+ cyhal_uart_set_flow_control (&uart, cts, rts);
123
+ cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
124
+ cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
122
125
123
126
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
124
127
if (bt_host_wake_name != NC) {
@@ -150,28 +153,17 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData)
150
153
151
154
while (i < len + 1 ) {
152
155
uint8_t to_write = i == 0 ? type : pData[i - 1 ];
153
- while (uart. writeable ( ) == 0 );
154
- uart. putc ( to_write);
156
+ while (cyhal_uart_writable (&uart ) == 0 );
157
+ cyhal_uart_putc (&uart, to_write);
155
158
++i;
156
159
}
160
+ while (cyhal_uart_is_tx_active (&uart));
157
161
158
162
deassert_bt_dev_wake ();
159
163
sleep_manager_unlock_deep_sleep ();
160
164
return len;
161
165
}
162
166
163
- void CyH4TransportDriver::on_controller_irq ()
164
- {
165
- sleep_manager_lock_deep_sleep ();
166
-
167
- while (uart.readable ()) {
168
- uint8_t char_received = uart.getc ();
169
- on_data_received (&char_received, 1 );
170
- }
171
-
172
- sleep_manager_unlock_deep_sleep ();
173
- }
174
-
175
167
void CyH4TransportDriver::assert_bt_dev_wake ()
176
168
{
177
169
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
@@ -189,8 +181,6 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
189
181
{
190
182
#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
191
183
if (enabled_powersave) {
192
- wait_us (5000 ); /* remove and replace when uart tx transmit complete api is available */
193
- // De-assert bt_device_wake
194
184
if (dev_wake_irq_event == WAKE_EVENT_ACTIVE_LOW) {
195
185
bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
196
186
} else {
@@ -203,7 +193,8 @@ void CyH4TransportDriver::deassert_bt_dev_wake()
203
193
204
194
void CyH4TransportDriver::update_uart_baud_rate (int baud)
205
195
{
206
- uart.baud (baud);
196
+ uint32_t ignore;
197
+ cyhal_uart_set_baud (&uart, (uint32_t )baud, &ignore);
207
198
}
208
199
209
200
bool CyH4TransportDriver::get_enabled_powersave ()
0 commit comments