diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp index f46cc0c125c1..bcd0e44f17a8 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.cpp @@ -20,7 +20,7 @@ #include "CyH4TransportDriver.h" #include "mbed_power_mgmt.h" #include "drivers/InterruptIn.h" -#if !defined(CYW43XXX_UNBUFFERED_UART) +#if !(defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) #include "cybsp_types.h" #endif #include "Callback.h" @@ -34,7 +34,7 @@ namespace cypress_ble { using namespace std::chrono_literals; 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) : -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) uart(tx, rx), #else tx(tx), rx(rx), @@ -54,7 +54,7 @@ CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, Pi } CyH4TransportDriver::CyH4TransportDriver(PinName tx, PinName rx, PinName cts, PinName rts, PinName bt_power_name, int baud) : -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) uart(tx, rx), #else tx(tx), rx(rx), @@ -116,20 +116,20 @@ void CyH4TransportDriver::bt_host_wake_fall_irq_handler(void) } } -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) void CyH4TransportDriver::on_controller_irq() #else static void on_controller_irq(void *callback_arg, cyhal_uart_event_t event) #endif { -#if !defined(CYW43XXX_UNBUFFERED_UART) +#if !(defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) (void)(event); cyhal_uart_t *uart_obj = (cyhal_uart_t *)callback_arg; #endif sleep_manager_lock_deep_sleep(); -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) while (uart.readable()) { uint8_t char_received; if (uart.read(&char_received, 1)) { @@ -153,7 +153,7 @@ void CyH4TransportDriver::initialize() bt_power = 0; rtos::ThisThread::sleep_for(1ms); -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) uart.baud(DEF_BT_BAUD_RATE); uart.format( @@ -205,7 +205,7 @@ void CyH4TransportDriver::initialize() void CyH4TransportDriver::terminate() { -#if !defined(CYW43XXX_UNBUFFERED_UART) +#if !(defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) 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 @@ -229,7 +229,7 @@ void CyH4TransportDriver::terminate() bt_power = 0; //BT_POWER is an output, should not be freed only set inactive -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) uart.close(); #else cyhal_uart_free(&uart); @@ -245,7 +245,7 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData) while (i < len + 1) { uint8_t to_write = i == 0 ? type : pData[i - 1]; -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) while (uart.writeable() == 0); uart.write(&to_write, 1); #else @@ -254,8 +254,8 @@ uint16_t CyH4TransportDriver::write(uint8_t type, uint16_t len, uint8_t *pData) #endif ++i; } -#if defined(CYW43XXX_UNBUFFERED_UART) - while (uart.writeable() == 0); +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) + while(uart.is_tx_active() != 0); #else while(cyhal_uart_is_tx_active(&uart)); #endif @@ -294,7 +294,7 @@ void CyH4TransportDriver::deassert_bt_dev_wake() void CyH4TransportDriver::update_uart_baud_rate(int baud) { -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) uart.baud((uint32_t)baud); #else uint32_t ignore; diff --git a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h index 8babd0abec41..8e78de99ec42 100644 --- a/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h +++ b/connectivity/drivers/ble/FEATURE_BLE/COMPONENT_CYW43XXX/CyH4TransportDriver.h @@ -25,7 +25,7 @@ #include "drivers/DigitalInOut.h" #include "drivers/InterruptIn.h" -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) #include "drivers/UnbufferedSerial.h" #else #include "cyhal_uart.h" @@ -86,8 +86,8 @@ class CyH4TransportDriver : public CordioHCITransportDriver { private: void assert_bt_dev_wake(); void deassert_bt_dev_wake(); - -#if defined(CYW43XXX_UNBUFFERED_UART) + +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) void on_controller_irq(); #endif @@ -98,7 +98,7 @@ class CyH4TransportDriver : public CordioHCITransportDriver { // However UART APIs does not prevent the BT radio from going to sleep. // Use the HAL APIs to prevent the radio from going to sleep until UART transmition is complete. // Mbed layer has no API that distinguish between data in HW buffer v.s. data already transmitted. -#if defined(CYW43XXX_UNBUFFERED_UART) +#if (defined(CYW43XXX_UNBUFFERED_UART) && DEVICE_SERIAL_ASYNCH) mbed::UnbufferedSerial uart; #else cyhal_uart_t uart; diff --git a/drivers/include/drivers/SerialBase.h b/drivers/include/drivers/SerialBase.h index 9288c271e156..33bb7a8741c1 100644 --- a/drivers/include/drivers/SerialBase.h +++ b/drivers/include/drivers/SerialBase.h @@ -273,6 +273,12 @@ class SerialBase : private NonCopyable { */ int set_dma_usage_rx(DMAUsage usage); + /** Attempts to determine if the serial peripheral is already in use for TX + * + * @return Non-zero if the TX transaction is ongoing, 0 otherwise + */ + int is_tx_active(); + #if !defined(DOXYGEN_ONLY) protected: void start_read(void *buffer, int buffer_size, char buffer_width, const event_callback_t &callback, int event, unsigned char char_match); diff --git a/drivers/include/drivers/UnbufferedSerial.h b/drivers/include/drivers/UnbufferedSerial.h index a330d6e92bc4..dc93e764aeec 100644 --- a/drivers/include/drivers/UnbufferedSerial.h +++ b/drivers/include/drivers/UnbufferedSerial.h @@ -211,6 +211,14 @@ class UnbufferedSerial: */ void set_flow_control(Flow type, PinName flow1 = NC, PinName flow2 = NC); #endif // DEVICE_SERIAL_FC + +#if DEVICE_SERIAL_ASYNCH + /** Attempts to determine if the serial peripheral is already in use for TX + * + * @return Non-zero if the TX transaction is ongoing, 0 otherwise + */ + int is_tx_active(); +#endif // DEVICE_SERIAL_ASYNCH }; } // namespace mbed diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 40bf7d0b6187..3b56daff923b 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -486,6 +486,16 @@ void SerialBase::interrupt_handler_asynch(void) } } +int SerialBase::is_tx_active(void) +{ + int result = 0; + lock(); + result = serial_tx_active(&_serial); + unlock(); + + return result; +} + #endif } // namespace mbed diff --git a/drivers/source/UnbufferedSerial.cpp b/drivers/source/UnbufferedSerial.cpp index cc86530344df..43477c06e624 100644 --- a/drivers/source/UnbufferedSerial.cpp +++ b/drivers/source/UnbufferedSerial.cpp @@ -122,6 +122,19 @@ void UnbufferedSerial::set_flow_control(Flow type, PinName flow1, PinName flow2) } #endif // DEVICE_SERIAL_FC +#if DEVICE_SERIAL_ASYNCH +int UnbufferedSerial::is_tx_active(void) +{ + int retval; + + lock(); + retval = SerialBase::is_tx_active(); + unlock(); + + return retval; +} +#endif // DEVICE_SERIAL_ASYNCH + } // namespace mbed #endif // #if DEVICE_SERIAL diff --git a/targets/targets.json b/targets/targets.json index 003a004c0f19..9717c9658836 100644 --- a/targets/targets.json +++ b/targets/targets.json @@ -3050,7 +3050,8 @@ "device_has_add": [ "USBDEVICE", "EMAC", - "QSPI" + "QSPI", + "SERIAL_ASYNCH" ], "overrides": { "system_power_supply": "PWR_SMPS_1V8_SUPPLIES_LDO",