diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp index 787f1a7c7c..8b9639dac8 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp @@ -31,32 +31,38 @@ namespace cypress_ble { 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) : +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) : 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_power(bt_power_name, PIN_OUTPUT, PullNone, 0), bt_host_wake(bt_host_wake_name, PIN_INPUT, PullNone, 0), bt_device_wake(bt_device_wake_name, PIN_OUTPUT, PullNone, 1), 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; } -CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud) : +CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) : cts(cts), rts(rts), + tx(tx), rx(rx), bt_host_wake_name(NC), bt_device_wake_name(NC), + bt_power(bt_power_name, PIN_OUTPUT, PullNone, 0), 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; } @@ -118,18 +124,22 @@ static void on_controller_irq(void *callback_arg, cyhal_uart_event_t event) void CyH4TransportDriver::initialize() { -#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) - mbed::InterruptIn *host_wake_pin; -#endif - sleep_manager_lock_deep_sleep(); + bt_power = 0; + rtos::ThisThread::sleep_for(1ms); + + 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); + bt_power = 1; + #if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) if (bt_host_wake_name != NC) { //Register IRQ for Host WAKE @@ -146,10 +156,34 @@ void CyH4TransportDriver::initialize() bt_device_wake = WAKE_EVENT_ACTIVE_HIGH; } sleep_manager_unlock_deep_sleep(); - 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 + ); + + if(bt_host_wake.is_connected()) + { +#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) + delete host_wake_pin; +#endif + } + + deassert_bt_dev_wake(); + + bt_power = 0; //BT_POWER is an output, should not be freed only set inactive + + cyhal_uart_free(&uart); +} uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData) { @@ -229,14 +263,14 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_default_h4_transpo #if (defined(CYBSP_BT_HOST_WAKE) && defined(CYBSP_BT_DEVICE_WAKE)) static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver( /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX, - /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE, + /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, CYBSP_BT_POWER, DEF_BT_BAUD_RATE, CYBSP_BT_HOST_WAKE, CYBSP_BT_DEVICE_WAKE ); #else static ble::vendor::cypress_ble::CyH4TransportDriver s_transport_driver( /* TX */ CYBSP_BT_UART_TX, /* RX */ CYBSP_BT_UART_RX, - /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, DEF_BT_BAUD_RATE); + /* cts */ CYBSP_BT_UART_CTS, /* rts */ CYBSP_BT_UART_RTS, CYBSP_BT_POWER, DEF_BT_BAUD_RATE); #endif return s_transport_driver; } diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h index 0f90e884b8..bac796b2ef 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h @@ -23,6 +23,7 @@ #include #include "ble/driver/CordioHCITransportDriver.h" #include "drivers/DigitalInOut.h" +#include "drivers/InterruptIn.h" #include "cyhal_uart.h" namespace ble { @@ -40,9 +41,9 @@ public: * Initialize the transport driver. * */ - CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud, PinName bt_host_wake_name, PinName bt_device_wake_name, + 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 = 0, uint8_t dev_wake_irq = 0); - CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, int baud); + CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud); /** * Destructor @@ -92,19 +93,26 @@ private: cyhal_uart_t uart; PinName cts; PinName rts; + PinName tx; + PinName rx; PinName bt_host_wake_name; PinName bt_device_wake_name; + mbed::DigitalInOut bt_power; mbed::DigitalInOut bt_host_wake; mbed::DigitalInOut bt_device_wake; + bool bt_host_wake_active; +#if (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) + mbed::InterruptIn *host_wake_pin; +#endif + bool enabled_powersave; uint8_t host_wake_irq_event; uint8_t dev_wake_irq_event; bool holding_deep_sleep_lock; - }; } // namespace cypress diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/TARGET_PSOC6/cy_bt_cordio_cfg.cpp b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/TARGET_PSOC6/cy_bt_cordio_cfg.cpp index e4fcd38794..6747d078a4 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/TARGET_PSOC6/cy_bt_cordio_cfg.cpp +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/TARGET_PSOC6/cy_bt_cordio_cfg.cpp @@ -87,7 +87,8 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_drive /* TX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_TX), /* RX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RX), /* cts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_CTS), - /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), DEF_BT_BAUD_RATE, + /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), + /* power */ cyhal_gpio_to_rtos(CYBSP_BT_POWER), DEF_BT_BAUD_RATE, cyhal_gpio_to_rtos(CYCFG_BT_HOST_WAKE_GPIO), cyhal_gpio_to_rtos(CYCFG_BT_DEV_WAKE_GPIO), CYCFG_BT_HOST_WAKE_IRQ_EVENT, @@ -99,7 +100,8 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_drive /* TX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_TX), /* RX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RX), /* cts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_CTS), - /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), DEF_BT_BAUD_RATE); + /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), + /* power */ cyhal_gpio_to_rtos(CYBSP_BT_POWER), DEF_BT_BAUD_RATE); return s_transport_driver; } #else /* (defined(CYCFG_BT_LP_ENABLED)) */ @@ -107,7 +109,8 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_drive /* TX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_TX), /* RX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RX), /* cts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_CTS), - /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), DEF_BT_BAUD_RATE, + /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), + /* power */ cyhal_gpio_to_rtos(CYBSP_BT_POWER), DEF_BT_BAUD_RATE, cyhal_gpio_to_rtos(CYBSP_BT_HOST_WAKE), cyhal_gpio_to_rtos(CYBSP_BT_DEVICE_WAKE) ); return s_transport_driver; @@ -118,7 +121,8 @@ ble::vendor::cypress_ble::CyH4TransportDriver& ble_cordio_get_h4_transport_drive /* TX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_TX), /* RX */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RX), /* cts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_CTS), - /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), DEF_BT_BAUD_RATE); + /* rts */ cyhal_gpio_to_rtos(CYBSP_BT_UART_RTS), + /* power */ cyhal_gpio_to_rtos(CYBSP_BT_POWER), DEF_BT_BAUD_RATE); return s_transport_driver; #endif /* (defined(MBED_TICKLESS) && DEVICE_SLEEP && DEVICE_LPTICKER) */ }