@@ -31,32 +31,38 @@ namespace cypress_ble {
3131
3232using namespace std ::chrono_literals;
3333
34- 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) :
34+ 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) :
3535 cts (cts), rts(rts),
36+ tx (tx), rx(rx),
3637 bt_host_wake_name (bt_host_wake_name),
3738 bt_device_wake_name (bt_device_wake_name),
39+ bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
3840 bt_host_wake (bt_host_wake_name, PIN_INPUT, PullNone, 0 ),
3941 bt_device_wake (bt_device_wake_name, PIN_OUTPUT, PullNone, 1 ),
4042 host_wake_irq_event (host_wake_irq),
4143 dev_wake_irq_event (dev_wake_irq)
44+
4245{
43- cyhal_uart_init (&uart, tx, rx, NULL , NULL );
4446 enabled_powersave = true ;
4547 bt_host_wake_active = false ;
4648}
4749
48- CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, int baud) :
50+ CyH4TransportDriver::CyH4TransportDriver (PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) :
4951 cts (cts),
5052 rts (rts),
53+ tx (tx), rx(rx),
5154 bt_host_wake_name (NC),
5255 bt_device_wake_name (NC),
56+ bt_power (bt_power_name, PIN_OUTPUT, PullNone, 0 ),
5357 bt_host_wake (bt_host_wake_name),
5458 bt_device_wake (bt_device_wake_name)
59+
5560{
56- cyhal_uart_init (&uart, tx, rx, NULL , NULL );
5761 enabled_powersave = false ;
5862 bt_host_wake_active = false ;
59- sleep_manager_lock_deep_sleep ();
63+
64+ sleep_manager_lock_deep_sleep (); // locking deep sleep because this option
65+ // does not include a host wake pin
6066 holding_deep_sleep_lock = true ;
6167}
6268
@@ -118,18 +124,22 @@ static void on_controller_irq(void *callback_arg, cyhal_uart_event_t event)
118124
119125void CyH4TransportDriver::initialize ()
120126{
121- #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
122- mbed::InterruptIn *host_wake_pin;
123- #endif
124-
125127 sleep_manager_lock_deep_sleep ();
126128
129+ bt_power = 0 ;
130+ rtos::ThisThread::sleep_for (1ms);
131+
132+ cyhal_uart_init (&uart, tx, rx, NULL , NULL );
133+
127134 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 };
128135 cyhal_uart_configure (&uart, &uart_cfg);
129136 cyhal_uart_set_flow_control (&uart, cts, rts);
137+ cyhal_uart_clear (&uart);
130138 cyhal_uart_register_callback (&uart, &on_controller_irq, &uart);
131139 cyhal_uart_enable_event (&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true );
132140
141+ bt_power = 1 ;
142+
133143#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
134144 if (bt_host_wake_name != NC) {
135145 // Register IRQ for Host WAKE
@@ -146,10 +156,34 @@ void CyH4TransportDriver::initialize()
146156 bt_device_wake = WAKE_EVENT_ACTIVE_HIGH;
147157 }
148158 sleep_manager_unlock_deep_sleep ();
149- rtos::ThisThread::sleep_for (500ms);
150159}
151160
152- void CyH4TransportDriver::terminate () { }
161+ void CyH4TransportDriver::terminate ()
162+ {
163+ cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t )(CYHAL_UART_IRQ_RX_DONE
164+ | CYHAL_UART_IRQ_TX_DONE
165+ | CYHAL_UART_IRQ_RX_NOT_EMPTY
166+ );
167+
168+ cyhal_uart_enable_event (&uart,
169+ enable_irq_event,
170+ CYHAL_ISR_PRIORITY_DEFAULT,
171+ false
172+ );
173+
174+ if (bt_host_wake.is_connected ())
175+ {
176+ #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER)
177+ delete host_wake_pin;
178+ #endif
179+ }
180+
181+ deassert_bt_dev_wake ();
182+
183+ bt_power = 0 ; // BT_POWER is an output, should not be freed only set inactive
184+
185+ cyhal_uart_free (&uart);
186+ }
153187
154188uint16_t CyH4TransportDriver::write (uint8_t type, uint16_t len, uint8_t *pData)
155189{
@@ -229,14 +263,14 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transpo
229263#if (defined(CYBSP_BT_HOST_WAKE) && defined(CYBSP_BT_DEVICE_WAKE))
230264 static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver (
231265 /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX,
232- /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE,
266+ /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, CYBSP_BT_POWER, DEF_BT_BAUD_RATE,
233267 CYBSP_BT_HOST_WAKE, CYBSP_BT_DEVICE_WAKE
234268 );
235269
236270#else
237271 static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver (
238272 /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX,
239- /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE);
273+ /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, CYBSP_BT_POWER, DEF_BT_BAUD_RATE);
240274#endif
241275 return s_transport_driver;
242276}
0 commit comments