diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp index 02919b351d..18f05dc588 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp @@ -33,6 +33,7 @@ using namespace std::chrono_literals; 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) : cts(cts), rts(rts), + tx(tx), rx(rx), bt_host_wake_name(bt_host_wake_name), bt_device_wake_name(bt_device_wake_name), bt_host_wake(bt_host_wake_name, PIN_INPUT, PullNone, 0), @@ -40,7 +41,6 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi host_wake_irq_event(host_wake_irq), dev_wake_irq_event(dev_wake_irq) { - cyhal_uart_init(&uart, tx, rx, NULL, NULL); enabled_powersave = true; bt_host_wake_active = false; } @@ -48,15 +48,16 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud) : cts(cts), rts(rts), + tx(tx), rx(rx), bt_host_wake_name(NC), bt_device_wake_name(NC), bt_host_wake(bt_host_wake_name), bt_device_wake(bt_device_wake_name) { - cyhal_uart_init(&uart, tx, rx, NULL, NULL); enabled_powersave = false; bt_host_wake_active = false; - sleep_manager_lock_deep_sleep(); + sleep_manager_lock_deep_sleep(); // locking deep sleep because this option + // does not include a host wake pin holding_deep_sleep_lock = true; } @@ -124,12 +125,21 @@ void CyH4TransportDriver::initialize() sleep_manager_lock_deep_sleep(); + cyhal_gpio_write(CYBSP_BT_POWER, 0); + rtos::ThisThread::sleep_for(20ms); + + cyhal_uart_init(&uart, tx, rx, NULL, NULL); + 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 }; cyhal_uart_configure(&uart, &uart_cfg); cyhal_uart_set_flow_control(&uart, cts, rts); + cyhal_uart_clear(&uart); cyhal_uart_register_callback(&uart, &on_controller_irq, &uart); cyhal_uart_enable_event(&uart, CYHAL_UART_IRQ_RX_NOT_EMPTY, CYHAL_ISR_PRIORITY_DEFAULT, true); + cyhal_gpio_write(CYBSP_BT_POWER, 1); + rtos::ThisThread::sleep_for(10ms); + #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) if (bt_host_wake_name != NC) { //Register IRQ for Host WAKE @@ -149,26 +159,34 @@ void CyH4TransportDriver::initialize() rtos::ThisThread::sleep_for(500ms); } -void CyH4TransportDriver::terminate() -{ +void CyH4TransportDriver::terminate() +{ cyhal_uart_event_t enable_irq_event = (cyhal_uart_event_t)(CYHAL_UART_IRQ_RX_DONE | CYHAL_UART_IRQ_TX_DONE | CYHAL_UART_IRQ_RX_NOT_EMPTY - ); + ); cyhal_uart_enable_event(&uart, - enable_irq_event, - CYHAL_ISR_PRIORITY_DEFAULT, - false - ); + enable_irq_event, + CYHAL_ISR_PRIORITY_DEFAULT, + false + ); + cyhal_uart_register_callback(&uart, + NULL, + NULL + ); + + if(CYBSP_BT_DEVICE_WAKE != NC) cyhal_gpio_free(CYBSP_BT_DEVICE_WAKE); + + + if(CYBSP_BT_HOST_WAKE != NC) cyhal_gpio_write(CYBSP_BT_DEVICE_WAKE, false); + + if(CYBSP_BT_POWER != NC) + { + cyhal_gpio_write(CYBSP_BT_POWER, false); + } - cyhal_uart_register_callback(&uart, NULL, NULL); cyhal_uart_free(&uart); - - cyhal_gpio_free(CYBSP_BT_DEVICE_WAKE); - cyhal_gpio_free(CYBSP_BT_HOST_WAKE); - cyhal_gpio_write(CYBSP_BT_POWER, false); - cyhal_gpio_free(CYBSP_BT_POWER); } uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData) diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h index 0f90e884b8..4c853229e7 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h @@ -92,6 +92,8 @@ private: cyhal_uart_t uart; PinName cts; PinName rts; + PinName tx; + PinName rx; PinName bt_host_wake_name; PinName bt_device_wake_name;