From 8d63828996b460c23cc9df37074cb721743c2506 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 15:17:06 +0200 Subject: [PATCH 01/65] Add serial_tx_empty API --- hal/include/hal/serial_api.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/hal/include/hal/serial_api.h b/hal/include/hal/serial_api.h index 78a1ee8aa40..4b11e7697ae 100644 --- a/hal/include/hal/serial_api.h +++ b/hal/include/hal/serial_api.h @@ -296,6 +296,13 @@ int serial_readable(serial_t *obj); */ int serial_writable(serial_t *obj); +/** Check if the serial peripheral tx buffer is empty + * + * @param obj The serial object + * @return Non-zero value if tx is empty, 0 otherwise. + */ +int serial_tx_empty(serial_t *obj); + /** Clear the serial peripheral * * @param obj The serial object From 069c0308fbc990f1ddd4291150bec45528b118ef Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 15:18:15 +0200 Subject: [PATCH 02/65] serial_tx_empty TARGET_Ambiq_Micro/TARGET_Apollo3 --- .../TARGET_Ambiq_Micro/TARGET_Apollo3/device/serial_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/targets/TARGET_Ambiq_Micro/TARGET_Apollo3/device/serial_api.c b/targets/TARGET_Ambiq_Micro/TARGET_Apollo3/device/serial_api.c index 83d23f34834..30794d4cd7c 100644 --- a/targets/TARGET_Ambiq_Micro/TARGET_Apollo3/device/serial_api.c +++ b/targets/TARGET_Ambiq_Micro/TARGET_Apollo3/device/serial_api.c @@ -68,6 +68,7 @@ void uart_configure_pin_function(PinName pin, UARTName uart, const PinMap *map); * * ::serial_putc is a blocking call (waits for a peripheral to be available). * * ::serial_readable returns non-zero value if a character can be read, 0 otherwise. * * ::serial_writable returns non-zero value if a character can be written, 0 otherwise. + * * ::serial_tx_empty returns non-zero value if tx is empty, 0 otherwise. * * ::serial_clear clears the ::serial_t RX/TX buffers * * ::serial_break_set sets the break signal. * * ::serial_break_clear clears the break signal. @@ -308,6 +309,12 @@ int serial_writable(serial_t *obj) return !(UARTn(obj->serial.uart_control->inst)->FR_b.TXFF); } +int serial_tx_empty(serial_t *obj) +{ + MBED_ASSERT(obj->serial.uart_control != NULL); + return ((UARTn(obj->serial.uart_control->inst)->FR_b.TXFE) && (!(UARTn(obj->serial.uart_control->inst)->FR_b.TXBUSY))); +} + void serial_clear(serial_t *obj) { // todo: From 970bb55347a6432f23f92d6033356da296bd3829 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 15:26:40 +0200 Subject: [PATCH 03/65] serial_tx_empty TARGET_Analog_Devices/TARGET_ADUCM302X/ --- .../TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c index cd0d2b2bf76..11684b11b3d 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c @@ -262,6 +262,13 @@ int serial_writable(serial_t *obj) return bAvailable; } +int serial_tx_empty(serial_t *obj) +{ + bool bAvailable = false; + adi_uart_IsTxComplete(hDevice[obj->index], &bAvailable); + return bAvailable; +} + void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { MBED_ASSERT(obj); From 255b4bcab8ccfdad638b7aca71aa99ee4cadd112 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 15:27:31 +0200 Subject: [PATCH 04/65] serial_tx_empty TARGET_Analog_Devices/TARGET_ADUCM4X50 --- .../TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c index ef48996dc9a..52055fa4b2d 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM4X50/TARGET_ADUCM4050/api/serial_api.c @@ -204,6 +204,13 @@ int serial_writable(serial_t *obj) return bAvailable; } +int serial_tx_empty(serial_t *obj) +{ + bool bAvailable = false; + adi_uart_IsTxComplete(hDevice[obj->index], &bAvailable); + return bAvailable; +} + void serial_putc(serial_t *obj, int c) { void *pBuff; From ef1fa492f52177b71ffbb9e69e6dd69534eade5d Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:18:10 +0200 Subject: [PATCH 05/65] serial_tx_empty Target_Freescale TARGET_KL25Z --- .../TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/serial_api.c b/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/serial_api.c index 7da437b5197..4952d8086b4 100644 --- a/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/serial_api.c @@ -290,6 +290,11 @@ int serial_writable(serial_t *obj) { return (obj->uart->S1 & UARTLP_S1_TDRE_MASK); } +int serial_tx_empty(serial_t *obj) { + // check transmission complete + return (obj->uart->S1 & UARTLP_S1_TC_MASK); +} + void serial_clear(serial_t *obj) { } From 1bf539686263b54fc65499df9b67b89c07fbb42d Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:18:35 +0200 Subject: [PATCH 06/65] serial_tx_empty Target_Freescale TARGET_KL46Z --- .../TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/serial_api.c b/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/serial_api.c index f38c3c8424a..701475b6e4a 100644 --- a/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_KLXX/TARGET_KL46Z/serial_api.c @@ -290,6 +290,11 @@ int serial_writable(serial_t *obj) { return (obj->uart->S1 & UARTLP_S1_TDRE_MASK); } +int serial_tx_empty(serial_t *obj) { + // check transmission complete + return (obj->uart->S1 & UARTLP_S1_TC_MASK); +} + void serial_clear(serial_t *obj) { } From 0b659649aca61f2a05c099102d6ea5807137b33d Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:30:04 +0200 Subject: [PATCH 07/65] serial_tx_empty TARGET_Freescale TARGET_K66F --- .../TARGET_MCUXpresso_MCUS/TARGET_K66F/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/serial_api.c index 44f776d2e1b..20cec9cc326 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K66F/serial_api.c @@ -284,6 +284,12 @@ int serial_writable(serial_t *obj) return (status_flags & kUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = UART_GetStatusFlags(uart_addrs[obj->serial.index]); + return ((status_flags & kUART_TxDataRegEmptyFlag) && (status_flags & kUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { } From 0ac64d3aff9a2af77300b874831f1a15ea3b8d90 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:30:36 +0200 Subject: [PATCH 08/65] serial_tx_empty TARGET_Freescale TARGET_K82F --- .../TARGET_MCUXpresso_MCUS/TARGET_K82F/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K82F/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K82F/serial_api.c index 7e54d19c021..a690b16ec7e 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K82F/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_K82F/serial_api.c @@ -294,6 +294,12 @@ int serial_writable(serial_t *obj) return (status_flags & kLPUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); + return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { } From db32e05e9e94e0b1630d998f47ae651c43312d71 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:31:02 +0200 Subject: [PATCH 09/65] serial_tx_empty TARGET_Freescale TARGET_KL43Z --- .../TARGET_MCUXpresso_MCUS/TARGET_KL43Z/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL43Z/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL43Z/serial_api.c index 340400927e5..924975c40be 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL43Z/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KL43Z/serial_api.c @@ -250,6 +250,12 @@ int serial_writable(serial_t *obj) return (status_flags & kLPUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); + return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { } From 4a413c235ca9f349975733dc975446ae974aaf24 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:31:42 +0200 Subject: [PATCH 10/65] serial_tx_empty TARGET_Freescale TARGET_KW41Z --- .../TARGET_MCUXpresso_MCUS/TARGET_KW41Z/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KW41Z/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KW41Z/serial_api.c index 675e101e007..d99a7199fee 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KW41Z/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_KW41Z/serial_api.c @@ -231,6 +231,12 @@ int serial_writable(serial_t *obj) return (status_flags & kLPUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); + return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { From 5ae1c35d26a2a10aa9e6c7ca2b2e882f1b6d1753 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:32:12 +0200 Subject: [PATCH 11/65] serial_tx_empty TARGET_Freescale TARGET_MCU_K22F --- .../TARGET_MCUXpresso_MCUS/TARGET_MCU_K22F/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K22F/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K22F/serial_api.c index 25e8b8bd255..56a6137a737 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K22F/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K22F/serial_api.c @@ -252,6 +252,12 @@ int serial_writable(serial_t *obj) return (status_flags & kUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = UART_GetStatusFlags(uart_addrs[obj->index]); + return ((status_flags & kUART_TxDataRegEmptyFlag) && (status_flags & kUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { } From b669dc9162fdc9cf910b8954ac6b01df004bbb43 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:32:48 +0200 Subject: [PATCH 12/65] serial_tx_empty TARGET_Freescale TARGET_MCU_K64F --- .../TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c index 0b16d007069..7998152f0f6 100644 --- a/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c +++ b/targets/TARGET_Freescale/TARGET_MCUXpresso_MCUS/TARGET_MCU_K64F/serial_api.c @@ -309,6 +309,12 @@ int serial_writable(serial_t *obj) return (status_flags & kUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = UART_GetStatusFlags(uart_addrs[obj->serial.index]); + return ((status_flags & kUART_TxDataRegEmptyFlag) && (status_flags & kUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { } From f67116c310b78d5c29a608f5618d5be38978d533 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:46:48 +0200 Subject: [PATCH 13/65] serial_tx_empty TARGET_GigaDevice/TARGET_GD32F30X --- .../TARGET_GigaDevice/TARGET_GD32F30X/serial_api.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/targets/TARGET_GigaDevice/TARGET_GD32F30X/serial_api.c b/targets/TARGET_GigaDevice/TARGET_GD32F30X/serial_api.c index 50347de3ff0..1b093abbd82 100644 --- a/targets/TARGET_GigaDevice/TARGET_GD32F30X/serial_api.c +++ b/targets/TARGET_GigaDevice/TARGET_GD32F30X/serial_api.c @@ -439,6 +439,18 @@ int serial_writable(serial_t *obj) return (usart_flag_get(p_obj->uart, USART_FLAG_TBE) != RESET) ? 1 : 0; } +/** Check if the serial peripheral tx buffer is empty + * + * @param obj The serial object + * @return Non-zero value if the tx buffer is empty, 0 otherwise. + */ +int serial_tx_empty(serial_t *obj) +{ + struct serial_s *p_obj = GET_SERIAL_S(obj); + + return ((usart_flag_get(p_obj->uart, USART_FLAG_TBE) != RESET) && (usart_flag_get(p_obj->uart, USART_FLAG_TC) != RESET)) ? 1 : 0; +} + /** Clear the serial peripheral * * @param obj The serial object From 4c9a34b507545e7fa8d856be3a13f566ade07175 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 16:47:18 +0200 Subject: [PATCH 14/65] serial_tx_empty TARGET_GigaDevice/TARGET_GD32F4XX --- .../TARGET_GigaDevice/TARGET_GD32F4XX/serial_api.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/targets/TARGET_GigaDevice/TARGET_GD32F4XX/serial_api.c b/targets/TARGET_GigaDevice/TARGET_GD32F4XX/serial_api.c index 5fd4ee48355..59b830590c8 100644 --- a/targets/TARGET_GigaDevice/TARGET_GD32F4XX/serial_api.c +++ b/targets/TARGET_GigaDevice/TARGET_GD32F4XX/serial_api.c @@ -501,6 +501,18 @@ int serial_writable(serial_t *obj) return (usart_flag_get(p_obj->uart, USART_FLAG_TBE) != RESET) ? 1 : 0; } +/** Check if the serial peripheral tx buffer is empty + * + * @param obj The serial object + * @return Non-zero value if the tx buffer is empty, 0 otherwise. + */ +int serial_tx_empty(serial_t *obj) +{ + struct serial_s *p_obj = GET_SERIAL_S(obj); + + return ((usart_flag_get(p_obj->uart, USART_FLAG_TBE) != RESET) && (usart_flag_get(p_obj->uart, USART_FLAG_TC) != RESET)) ? 1 : 0; +} + /** Clear the serial peripheral * * @param obj The serial object From 2bc6b86ee8cb1fb1ef4e80cba2a3e567c992d373 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:01:25 +0200 Subject: [PATCH 15/65] serial_tx_empty TARGET_Maxim/TARGET_MAX32620C --- targets/TARGET_Maxim/TARGET_MAX32620C/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Maxim/TARGET_MAX32620C/serial_api.c b/targets/TARGET_Maxim/TARGET_MAX32620C/serial_api.c index b51826815bf..61f06b5eca1 100644 --- a/targets/TARGET_Maxim/TARGET_MAX32620C/serial_api.c +++ b/targets/TARGET_Maxim/TARGET_MAX32620C/serial_api.c @@ -312,6 +312,12 @@ int serial_writable(serial_t *obj) return UART_NumWriteAvail(obj->uart); } +//****************************************************************************** +int serial_tx_empty(serial_t *obj) +{ + return (MXC_UART_FIFO_DEPTH == UART_NumWriteAvail(obj->uart)) ? 1 : 0; +} + //****************************************************************************** void serial_clear(serial_t *obj) { From f755ad37611aaea4c8b9796fa86e1f313974a099 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:01:43 +0200 Subject: [PATCH 16/65] serial_tx_empty TARGET_Maxim/TARGET_MAX32625 --- targets/TARGET_Maxim/TARGET_MAX32625/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Maxim/TARGET_MAX32625/serial_api.c b/targets/TARGET_Maxim/TARGET_MAX32625/serial_api.c index 7fc1cc09001..6ca35349771 100644 --- a/targets/TARGET_Maxim/TARGET_MAX32625/serial_api.c +++ b/targets/TARGET_Maxim/TARGET_MAX32625/serial_api.c @@ -307,6 +307,12 @@ int serial_writable(serial_t *obj) return UART_NumWriteAvail(obj->uart); } +//****************************************************************************** +int serial_tx_empty(serial_t *obj) +{ + return (MXC_UART_FIFO_DEPTH == UART_NumWriteAvail(obj->uart)) ? 1 : 0; +} + //****************************************************************************** void serial_clear(serial_t *obj) { From 77501b3a6a924d319855d0dfb1b446e1b95a5dde Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:02:03 +0200 Subject: [PATCH 17/65] serial_tx_empty TARGET_Maxim/TARGET_MAX32630 --- targets/TARGET_Maxim/TARGET_MAX32630/serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Maxim/TARGET_MAX32630/serial_api.c b/targets/TARGET_Maxim/TARGET_MAX32630/serial_api.c index b9bbc9ed78f..6da121df1da 100644 --- a/targets/TARGET_Maxim/TARGET_MAX32630/serial_api.c +++ b/targets/TARGET_Maxim/TARGET_MAX32630/serial_api.c @@ -307,6 +307,12 @@ int serial_writable(serial_t *obj) return UART_NumWriteAvail(obj->uart); } +//****************************************************************************** +int serial_tx_empty(serial_t *obj) +{ + return (MXC_UART_FIFO_DEPTH == UART_NumWriteAvail(obj->uart)) ? 1 : 0; +} + //****************************************************************************** void serial_clear(serial_t *obj) { From f0b25da81f08358682c155653eacb0ad78461e9f Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:33:05 +0200 Subject: [PATCH 18/65] serial_tx_empty TARGET_NUVOTON/TARGET_M251 --- targets/TARGET_NUVOTON/TARGET_M251/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c index aefd9673197..9886f96a458 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c @@ -448,6 +448,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From ee0945a9bf8e33030ee8c8b8374460ef866244ca Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:33:34 +0200 Subject: [PATCH 19/65] serial_tx_empty TARGET_NUVOTON/TARGET_M261 --- targets/TARGET_NUVOTON/TARGET_M261/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c index a57c20204d4..285a79f2f00 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c @@ -493,6 +493,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From 8a3bb5a10255d61fa95c0732f3de70a1c8a48e36 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:33:51 +0200 Subject: [PATCH 20/65] serial_tx_empty TARGET_NUVOTON/TARGET_M451 --- targets/TARGET_NUVOTON/TARGET_M451/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c index 7d7bce7e7a9..f754207abbd 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c @@ -448,6 +448,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From 004fb7f2db2db1c848cdff3182faa0ee5ab1c5e5 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:34:31 +0200 Subject: [PATCH 21/65] serial_tx_empty TARGET_NUVOTON/TARGET_M480 --- targets/TARGET_NUVOTON/TARGET_M480/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c index fdf825a4b46..e1360adfb2b 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c @@ -525,6 +525,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From c0a4c66bb2729747326b7c44a52c37de1f025b9f Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:34:51 +0200 Subject: [PATCH 22/65] serial_tx_empty TARGET_NUVOTON/TARGET_NANO100 --- targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c index 2da2c9d3606..1db2bdba8c0 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c @@ -410,6 +410,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From 9f0ea6068a3de8cf366f2434667e625cc52e46c7 Mon Sep 17 00:00:00 2001 From: pennam Date: Thu, 22 Apr 2021 17:35:29 +0200 Subject: [PATCH 23/65] serial_tx_empty TARGET_NUVOTON/TARGET_NUC472 --- targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c index 6c1f8889b0c..55f7bb46ab3 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c @@ -488,6 +488,11 @@ int serial_writable(serial_t *obj) return ! UART_IS_TX_FULL(((UART_T *) NU_MODBASE(obj->serial.uart))); } +int serial_tx_empty(serial_t *obj) +{ + return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From 3593d3762ba763a7d35bd5cc3233df9cfcab7b62 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 23 Apr 2021 13:56:26 +0200 Subject: [PATCH 24/65] serial_tx_empty TARGET_RENESAS/TARGET_RZ_A1XX --- targets/TARGET_RENESAS/TARGET_RZ_A1XX/serial_api.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/targets/TARGET_RENESAS/TARGET_RZ_A1XX/serial_api.c b/targets/TARGET_RENESAS/TARGET_RZ_A1XX/serial_api.c index ace09575e81..e450a9e6cef 100644 --- a/targets/TARGET_RENESAS/TARGET_RZ_A1XX/serial_api.c +++ b/targets/TARGET_RENESAS/TARGET_RZ_A1XX/serial_api.c @@ -614,6 +614,15 @@ int serial_writable(serial_t *obj) { return ((obj->serial.uart->SCFSR & 0x20) != 0); // TDFE } +int serial_tx_empty(serial_t *obj) { + if(((obj->serial.uart->SCFSR & 0x20) != 0) && // TDFE = 1 && TEND = 1 + ((obj->serial.uart->SCFSR & 0x40) != 0)) { + return 1; + } else { + return 0; + } +} + void serial_clear(serial_t *obj) { core_util_critical_section_enter(); From 8d4353a70f5234fbb0af63f02b7d9ca6b4bbc9fc Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 23 Apr 2021 13:56:47 +0200 Subject: [PATCH 25/65] serial_tx_empty TARGET_RENESAS/TARGET_RZ_A2XX --- .../TARGET_RENESAS/TARGET_RZ_A2XX/serial_api.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/targets/TARGET_RENESAS/TARGET_RZ_A2XX/serial_api.c b/targets/TARGET_RENESAS/TARGET_RZ_A2XX/serial_api.c index fc8513c1adc..65c608ab5c4 100644 --- a/targets/TARGET_RENESAS/TARGET_RZ_A2XX/serial_api.c +++ b/targets/TARGET_RENESAS/TARGET_RZ_A2XX/serial_api.c @@ -627,6 +627,21 @@ int serial_writable(serial_t *obj) } } +int serial_tx_empty(serial_t *obj) +{ +#if defined(PRINTF_NOT_USE) + if ((int)obj->serial.ch == NC) { + return 0; + } +#endif + if((obj->serial.uart->FSR.BIT.TDFE != 0) && // TDFE = 1 && TEND = 1 + (obj->serial.uart->FSR.BIT.TEND != 0)) { + return 1; + } else { + return 0; + } +} + void serial_clear(serial_t *obj) { #if defined(PRINTF_NOT_USE) From 7e0a4c73999555d7deff8318d13be5fd80ab4c12 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 23 Apr 2021 16:08:48 +0200 Subject: [PATCH 26/65] serial_tx_empty TARGET_NRF5x/TARGET_NRF52 --- .../TARGET_NRF5x/TARGET_NRF52/serial_api.c | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c index 7db9639f519..cb9beb6ea9d 100644 --- a/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c +++ b/targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c @@ -1429,6 +1429,27 @@ int serial_writable(serial_t *obj) (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDDY))); } +/** Check if the serial peripheral tx buffer + * + * Param obj The serial object + * Return Non-zero value if a character can be written, 0 otherwise. + */ +int serial_tx_empty(serial_t *obj) +{ + MBED_ASSERT(obj); + +#if DEVICE_SERIAL_ASYNCH + struct serial_s *uart_object = &obj->serial; +#else + struct serial_s *uart_object = obj; +#endif + + int instance = uart_object->instance; + + return (!core_util_atomic_load_bool(&nordic_nrf5_uart_state[instance].tx_in_progress) && + (nrf_uarte_event_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDDY))); +} + const PinMap *serial_tx_pinmap() { return PinMap_UART_testing; From fe43bcadc7badae8cbb0c57870e6c382cc5c318f Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 23 Apr 2021 16:27:38 +0200 Subject: [PATCH 27/65] serial_tx_empty TARGET_Cypress/TARGET_PSOC6 --- targets/TARGET_Cypress/TARGET_PSOC6/cy_serial_api.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/targets/TARGET_Cypress/TARGET_PSOC6/cy_serial_api.c b/targets/TARGET_Cypress/TARGET_PSOC6/cy_serial_api.c index 26086aa7bf2..3822ade724e 100644 --- a/targets/TARGET_Cypress/TARGET_PSOC6/cy_serial_api.c +++ b/targets/TARGET_Cypress/TARGET_PSOC6/cy_serial_api.c @@ -194,6 +194,12 @@ int serial_writable(serial_t *obj) return cyhal_uart_writable(&(ser->hal_obj)) > 0 ? 1 : 0; } +int serial_tx_empty(serial_t *obj) +{ + struct serial_s *ser = cy_serial_get_struct(obj); + return cyhal_uart_is_tx_active(&(ser->hal_obj)) ? 0 : 1; +} + void serial_clear(serial_t *obj) { struct serial_s *ser = cy_serial_get_struct(obj); From db359b678f6af94014fb2fe82c1725ebb8d00c34 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 23 Apr 2021 17:49:20 +0200 Subject: [PATCH 28/65] serial_tx_empty TARGET_STM --- targets/TARGET_STM/serial_api.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/targets/TARGET_STM/serial_api.c b/targets/TARGET_STM/serial_api.c index 259c7b8719b..73dfc6c7d5a 100644 --- a/targets/TARGET_STM/serial_api.c +++ b/targets/TARGET_STM/serial_api.c @@ -585,6 +585,18 @@ int serial_writable(serial_t *obj) return (__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) ? 1 : 0; } +int serial_tx_empty(serial_t *obj) +{ + struct serial_s *obj_s = SERIAL_S(obj); + UART_HandleTypeDef *huart = &uart_handlers[obj_s->index]; + + if((__HAL_UART_GET_FLAG(huart, UART_FLAG_TXE) != RESET) && + (__HAL_UART_GET_FLAG(huart, UART_FLAG_TC) != RESET) ) { + return 1; + } + return 0; +} + void serial_pinout_tx(PinName tx) { pinmap_pinout(tx, PinMap_UART_TX); From c82bbef029eafb4c7cf806079ade23293d9437bf Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 09:41:39 +0200 Subject: [PATCH 29/65] serial_tx_empty TARGET_NXP/TARGET_LPC11XX_11CXX --- targets/TARGET_NXP/TARGET_LPC11XX_11CXX/serial_api.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/targets/TARGET_NXP/TARGET_LPC11XX_11CXX/serial_api.c b/targets/TARGET_NXP/TARGET_LPC11XX_11CXX/serial_api.c index c993f1d3f85..3b2e464acf4 100644 --- a/targets/TARGET_NXP/TARGET_LPC11XX_11CXX/serial_api.c +++ b/targets/TARGET_NXP/TARGET_LPC11XX_11CXX/serial_api.c @@ -283,6 +283,10 @@ int serial_writable(serial_t *obj) { return obj->uart->LSR & 0x20; } +int serial_tx_empty(serial_t *obj) { + return obj->uart->LSR & 0x20; +} + void serial_clear(serial_t *obj) { obj->uart->FCR = 1 << 1 // rx FIFO reset | 1 << 2 // tx FIFO reset From 1da87c29b3d0ac69f3b0ce4949e49dca628b693a Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 10:02:36 +0200 Subject: [PATCH 30/65] serial_tx_empty TARGET_NXP/TARGET_LPC176X --- targets/TARGET_NXP/TARGET_LPC176X/serial_api.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/targets/TARGET_NXP/TARGET_LPC176X/serial_api.c b/targets/TARGET_NXP/TARGET_LPC176X/serial_api.c index 15358039f6c..a2f74cdc19c 100644 --- a/targets/TARGET_NXP/TARGET_LPC176X/serial_api.c +++ b/targets/TARGET_NXP/TARGET_LPC176X/serial_api.c @@ -377,6 +377,10 @@ int serial_writable(serial_t *obj) { return isWritable; } +int serial_tx_empty(serial_t *obj) { + return obj->uart->LSR & 0x20; +} + void serial_clear(serial_t *obj) { obj->uart->FCR = 1 << 0 // FIFO Enable - 0 = Disables, 1 = Enabled | 1 << 1 // rx FIFO reset From 3670bb00f136acf99f5a5f22dbbf93fe281b292a Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 10:12:11 +0200 Subject: [PATCH 31/65] serial_tx_empty TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC --- .../TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c index 4e7bfe62b00..169c98c4bf9 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_LPC/serial_api.c @@ -383,6 +383,13 @@ int serial_writable(serial_t *obj) return (status_flags & kUSART_TxFifoNotFullFlag); } +int serial_tx_empty(serial_t *obj) +{ + uint32_t status_flags = USART_GetStatusFlags(uart_addrs[obj->index]); + + return (status_flags & kUSART_TxFifoEmptyFlag); +} + void serial_clear(serial_t *obj) { } From f8da4c6fde698b8670000ff41adb26a16b5d8c9b Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 10:37:58 +0200 Subject: [PATCH 32/65] serial_tx_empty TARGET_Samsung/TARGET_SIDK_S1SBP6A --- targets/TARGET_Samsung/TARGET_SIDK_S1SBP6A/serial_api.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S1SBP6A/serial_api.c b/targets/TARGET_Samsung/TARGET_SIDK_S1SBP6A/serial_api.c index 99f9c13bb3e..be51573a486 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S1SBP6A/serial_api.c +++ b/targets/TARGET_Samsung/TARGET_SIDK_S1SBP6A/serial_api.c @@ -336,6 +336,13 @@ int serial_writable(serial_t *obj) #endif } +int serial_tx_empty(serial_t *obj) +{ + struct serial_s *objs = serial_s(obj); + + return ((getreg32(objs->uart + UART_UTRSTAT_OFFSET) & UART_UTRSTAT_TX_EMPTY_MASK)); +} + void serial_clear(serial_t *obj) { struct serial_s *objs = serial_s(obj); From 465218f07db508b42a6b84f6ff04bc1a4418c3f9 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 10:57:19 +0200 Subject: [PATCH 33/65] serial_tx_empty TARGET_Silicon_Labs/TARGET_EFM32 --- .../TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c b/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c index ede181441ef..dbf27833326 100644 --- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c +++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/serial_api.c @@ -1149,6 +1149,18 @@ int serial_writable(serial_t *obj) } } +/** + * Check if TX buffer is empty + */ +int serial_tx_empty(serial_t *obj) +{ + if(LEUART_REF_VALID(obj->serial.periph.leuart)) { + return ((obj->serial.periph.leuart->STATUS & LEUART_STATUS_TXBL) && (obj->serial.periph.leuart->STATUS & LEUART_STATUS_TXIDLE)); + } else { + return ((obj->serial.periph.uart->STATUS & USART_STATUS_TXBL) && (obj->serial.periph.uart->STATUS & USART_STATUS_TXIDLE)); + } +} + /** * Clear UART interrupts */ From f675e51c2036ca2d578a50f8e7029ad4a07fa712 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 11:19:21 +0200 Subject: [PATCH 34/65] serial_tx_empty TARGET_TOSHIBA/TARGET_TMPM46B --- .../TARGET_TMPM46B/serial_api.c | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/targets/TARGET_TOSHIBA/TARGET_TMPM46B/serial_api.c b/targets/TARGET_TOSHIBA/TARGET_TMPM46B/serial_api.c index 090b1599fbd..19696f12a6c 100644 --- a/targets/TARGET_TOSHIBA/TARGET_TMPM46B/serial_api.c +++ b/targets/TARGET_TOSHIBA/TARGET_TMPM46B/serial_api.c @@ -491,6 +491,31 @@ int serial_writable(serial_t *obj) return ret; } +int serial_tx_empty(serial_t *obj) +{ + int ret = 0; + + switch (obj->index) { + case SERIAL_0: + case SERIAL_1: + case SERIAL_2: + case SERIAL_3: + if (UART_GetBufState(obj->UARTx, UART_TX) == DONE) { + ret = 1; + } + break; + case SERIAL_4: + case SERIAL_5: + if (FUART_GetStorageStatus(obj->FUART, FUART_TX) == FUART_STORAGE_EMPTY) { + ret = 1; + } + break; + default: + break; + } + return ret; +} + void serial_clear(serial_t *obj) { switch (obj->index) { From 4845616d2a3f3fb51642d0b8120d6a8a7e52b2db Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 11:19:44 +0200 Subject: [PATCH 35/65] serial_tx_empty TARGET_TOSHIBA/TARGET_TMPM4G9 --- .../TARGET_TOSHIBA/TARGET_TMPM4G9/serial_api.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/targets/TARGET_TOSHIBA/TARGET_TMPM4G9/serial_api.c b/targets/TARGET_TOSHIBA/TARGET_TMPM4G9/serial_api.c index bd14d8a566f..0ced078f17f 100644 --- a/targets/TARGET_TOSHIBA/TARGET_TMPM4G9/serial_api.c +++ b/targets/TARGET_TOSHIBA/TARGET_TMPM4G9/serial_api.c @@ -538,6 +538,23 @@ int serial_writable(serial_t *obj) return ret; } +int serial_tx_empty(serial_t *obj) +{ + int ret = 0; + + if(!(obj->is_using_fuart)) { + if ((obj->UARTx->SR & 0x8000) == 0) { + ret = 1; + } + } else { + if(obj->FUARTx->FR & (1 << 7U)) { + ret = 1; + } + } + + return ret; +} + void serial_clear(serial_t *obj) { uint32_t dummy; From 08f7853212f89ab334740a7a02a933e9b87bb325 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 14:19:48 +0200 Subject: [PATCH 36/65] serial_tx_empty TARGET_ARM_SSG/TARGET_MUSCA_B1 --- .../device/drivers/uart_pl011_drv.c | 17 +++++++++++++++++ .../device/drivers/uart_pl011_drv.h | 11 +++++++++++ .../TARGET_ARM_SSG/TARGET_MUSCA_B1/serial_api.c | 5 +++++ 3 files changed, 33 insertions(+) diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.c index 5de1b4e0209..4add826b20f 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.c +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.c @@ -97,6 +97,8 @@ struct _uart_pl011_reg_map_t { 0x1u<cfg->base; + + if( ((p_uart->uartfr & UART_PL011_UARTFR_TX_FIFO_EMPTY) == 1) && + /* Transmit Fifo is empty */ + ((p_uart->uartfr & UART_PL011_UARTFR_BUSYBIT) == 0)) { + /* Tx is not BUSY */ + return true; + } + return false; + +} + void uart_pl011_write(struct uart_pl011_dev_t* dev, uint8_t byte) { struct _uart_pl011_reg_map_t* p_uart = diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.h b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.h index 0ec6a64f517..2b3f5c97bb6 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.h +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/device/drivers/uart_pl011_drv.h @@ -496,6 +496,17 @@ enum uart_pl011_error_t uart_pl011_read(struct uart_pl011_dev_t* dev, */ bool uart_pl011_is_writable(struct uart_pl011_dev_t* dev); +/** + * \brief Check if the UART tx buffer is empty + * + * \param[in] dev UART device struct \ref uart_pl011_dev_t + * + * \return Returns bool, true if UART is tx buffer is empty, false otherwise + * + * \note This function doesn't check if dev is NULL. + */ +bool uart_pl011_is_tx_empty(struct uart_pl011_dev_t* dev); + /** * \brief Writes a byte to UART dev. * diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/serial_api.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/serial_api.c index d01b6e57994..79fd871cc4f 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/serial_api.c +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_B1/serial_api.c @@ -175,6 +175,11 @@ int serial_writable(serial_t *obj) return (int)uart_pl011_is_writable(obj->uart_dev); } +int serial_tx_empty(serial_t *obj) +{ + return (int)uart_pl011_is_tx_empty(obj->uart_dev); +} + int serial_getc(serial_t *obj) { uint8_t byte = 0; From 5245c1c2bee88341b296ee5c2a4cbc8e1cf6f172 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 14:27:54 +0200 Subject: [PATCH 37/65] serial_tx_empty TARGET_ARM_SSG/TARGET_MUSCA_S1 --- .../device/drivers/uart_pl011_drv.c | 17 +++++++++++++++++ .../device/drivers/uart_pl011_drv.h | 11 +++++++++++ .../TARGET_ARM_SSG/TARGET_MUSCA_S1/serial_api.c | 5 +++++ 3 files changed, 33 insertions(+) diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.c index 557f2565ef5..a7b885b85c6 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.c +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.c @@ -98,6 +98,8 @@ struct _uart_pl011_reg_map_t { 0x1u<cfg->base; + + if( ((p_uart->uartfr & UART_PL011_UARTFR_TX_FIFO_EMPTY) == 1) && + /* Transmit Fifo is empty */ + ((p_uart->uartfr & UART_PL011_UARTFR_BUSYBIT) == 0)) { + /* Tx is not BUSY */ + return true; + } + return false; + +} + void uart_pl011_write(struct uart_pl011_dev_t* dev, uint8_t byte) { struct _uart_pl011_reg_map_t* p_uart = diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.h b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.h index 1cf5b622c38..02fdac92d93 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.h +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/device/drivers/uart_pl011_drv.h @@ -497,6 +497,17 @@ enum uart_pl011_error_t uart_pl011_read(struct uart_pl011_dev_t* dev, */ bool uart_pl011_is_writable(struct uart_pl011_dev_t* dev); +/** + * \brief Check if the UART tx buffer is empty + * + * \param[in] dev UART device struct \ref uart_pl011_dev_t + * + * \return Returns bool, true if UART is tx buffer is empty, false otherwise + * + * \note This function doesn't check if dev is NULL. + */ +bool uart_pl011_is_tx_empty(struct uart_pl011_dev_t* dev); + /** * \brief Writes a byte to UART dev. * diff --git a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/serial_api.c b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/serial_api.c index d6a85011aad..bd70a433d27 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/serial_api.c +++ b/targets/TARGET_ARM_SSG/TARGET_MUSCA_S1/serial_api.c @@ -176,6 +176,11 @@ int serial_writable(serial_t *obj) return (int)uart_pl011_is_writable(obj->uart_dev); } +int serial_tx_empty(serial_t *obj) +{ + return (int)uart_pl011_is_tx_empty(obj->uart_dev); +} + int serial_getc(serial_t *obj) { uint8_t byte = 0; From 4c17121bfcfa58b632fd74478e1958b5fdbccffa Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 27 Apr 2021 14:42:19 +0200 Subject: [PATCH 38/65] serial_tx_empty TARGET_Samsung/TARGET_SIDK_S5JS100 --- targets/TARGET_Samsung/TARGET_SIDK_S5JS100/objects.h | 1 + targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_api.c | 5 +++++ .../TARGET_Samsung/TARGET_SIDK_S5JS100/serial_dummy_api.c | 6 ++++++ .../TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c | 8 ++++++++ 4 files changed, 20 insertions(+) diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/objects.h b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/objects.h index 8513b23e8f5..ab121804c93 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/objects.h +++ b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/objects.h @@ -71,6 +71,7 @@ struct uart_ops_s { void (*serial_irq_set)(void *obj, SerialIrq irq, uint32_t enable); void (*serial_putc)(void *obj, int c); int (*serial_writable)(void *obj); + int (*serial_tx_empty)(void *obj); int (*serial_getc)(void *obj); int (*serial_readable)(void *obj); #if DEVICE_SERIAL_FC diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_api.c b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_api.c index 394ab65835e..c5995da6b43 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_api.c +++ b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_api.c @@ -238,6 +238,11 @@ int serial_writable(serial_t *obj) return obj->ops.serial_writable(obj); } +int serial_tx_empty(serial_t *obj) +{ + return obj->ops.serial_tx_empty(obj); +} + /* Shall it be ever used ??? void serial_clear(serial_t *obj) diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_dummy_api.c b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_dummy_api.c index c510e31fa44..aeb50a049b3 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_dummy_api.c +++ b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_dummy_api.c @@ -67,6 +67,11 @@ static int dummy_serial_writable(void *obj) return 1; } +static int dummy_serial_tx_empty(void *obj) +{ + return 1; +} + static int dummy_serial_getc(void *obj) @@ -111,6 +116,7 @@ void dummy_serial_init(void *obj, PinName tx, PinName rx) priv->ops.serial_writable = dummy_serial_writable; priv->ops.serial_getc = dummy_serial_getc; priv->ops.serial_readable = dummy_serial_readable; + priv->ops.serial_tx_empty = dummy_serial_tx_empty; #if DEVICE_SERIAL_FC priv->ops.serial_set_flow_control = dummy_serial_set_flow_control; #endif diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c index 860138226f5..d687bf78616 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c +++ b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c @@ -234,6 +234,13 @@ static int pl011_serial_writable(void *obj) return !(p_PL011_UART->FR & (1u << 5)); } +static int pl011_serial_serial_tx_empty(void *obj) +{ + struct serial_s *priv = (struct serial_s *)obj; + S5JS100_UART_TypeDef *p_PL011_UART = UART_PTR(priv->uart); + return ((p_PL011_UART->FR & (1u << 7)) && (!(p_PL011_UART->FR & (1u << 3)))); +} + static int pl011_serial_getc(void *obj) @@ -306,6 +313,7 @@ void pl011_serial_init(void *obj, PinName tx, PinName rx) priv->ops.serial_writable = pl011_serial_writable; priv->ops.serial_getc = pl011_serial_getc; priv->ops.serial_readable = pl011_serial_readable; + priv->ops.serial_tx_empty = pl011_serial_tx_empty; #if DEVICE_SERIAL_FC priv->ops.serial_set_flow_control = pl011_serial_set_flow_control; #endif From 2c491f61e859079fccd9472bb29c0346aa54b22f Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 19 Apr 2021 14:20:11 +0200 Subject: [PATCH 39/65] UartBase hardware sync --- drivers/include/drivers/SerialBase.h | 6 ++++++ drivers/include/drivers/UnbufferedSerial.h | 6 ++++++ drivers/source/BufferedSerial.cpp | 2 ++ drivers/source/SerialBase.cpp | 13 +++++++++++++ drivers/source/UnbufferedSerial.cpp | 5 +++++ 5 files changed, 32 insertions(+) diff --git a/drivers/include/drivers/SerialBase.h b/drivers/include/drivers/SerialBase.h index 9288c271e15..20e6b0396e8 100644 --- a/drivers/include/drivers/SerialBase.h +++ b/drivers/include/drivers/SerialBase.h @@ -119,6 +119,12 @@ class SerialBase : private NonCopyable { */ void send_break(); + /** Flush hardware buffers associated with serial port + * + * @return 0 on success, negative error code on failure + */ + int sync(void); + /** Enable serial input * * If both serial input and serial output are disabled, the diff --git a/drivers/include/drivers/UnbufferedSerial.h b/drivers/include/drivers/UnbufferedSerial.h index a330d6e92bc..d2e1eb3d269 100644 --- a/drivers/include/drivers/UnbufferedSerial.h +++ b/drivers/include/drivers/UnbufferedSerial.h @@ -114,6 +114,12 @@ class UnbufferedSerial: return -ESPIPE; } + /** Flush any buffers associated with the file + * + * @return 0 on success, negative error code on failure + */ + int sync() override; + /** Get the size of the file * * @return Size of the file in bytes diff --git a/drivers/source/BufferedSerial.cpp b/drivers/source/BufferedSerial.cpp index a2c8873b031..c993af4af2a 100644 --- a/drivers/source/BufferedSerial.cpp +++ b/drivers/source/BufferedSerial.cpp @@ -115,6 +115,8 @@ int BufferedSerial::sync() api_unlock(); + SerialBase::sync(); + return 0; } diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 40bf7d0b618..e175dd47a2a 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -164,6 +164,19 @@ void SerialBase::_deinit() serial_free(&_serial); } +int SerialBase:: sync() +{ + lock(); + + while (!serial_tx_empty(&_serial)) { + // See send_break() + wait_us(18000000 / _baud); + } + + unlock(); + return 0; +} + void SerialBase::enable_input(bool enable) { lock(); diff --git a/drivers/source/UnbufferedSerial.cpp b/drivers/source/UnbufferedSerial.cpp index cc86530344d..1b92760d26c 100644 --- a/drivers/source/UnbufferedSerial.cpp +++ b/drivers/source/UnbufferedSerial.cpp @@ -99,6 +99,11 @@ short UnbufferedSerial::poll(short events) const return revents; } +int UnbufferedSerial::sync() +{ + return SerialBase::sync(); +} + int UnbufferedSerial::enable_input(bool enabled) { SerialBase::enable_input(enabled); From fa10ae3612b73392fc26d7ea70c69cbb86a76cde Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 10:07:11 +0200 Subject: [PATCH 40/65] SerialBase fixes and timeout implementation --- drivers/include/drivers/SerialBase.h | 2 +- drivers/source/BufferedSerial.cpp | 4 +--- drivers/source/SerialBase.cpp | 15 ++++++++++----- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/drivers/include/drivers/SerialBase.h b/drivers/include/drivers/SerialBase.h index 20e6b0396e8..3753468ecd7 100644 --- a/drivers/include/drivers/SerialBase.h +++ b/drivers/include/drivers/SerialBase.h @@ -123,7 +123,7 @@ class SerialBase : private NonCopyable { * * @return 0 on success, negative error code on failure */ - int sync(void); + int sync(); /** Enable serial input * diff --git a/drivers/source/BufferedSerial.cpp b/drivers/source/BufferedSerial.cpp index c993af4af2a..0548e04797d 100644 --- a/drivers/source/BufferedSerial.cpp +++ b/drivers/source/BufferedSerial.cpp @@ -115,9 +115,7 @@ int BufferedSerial::sync() api_unlock(); - SerialBase::sync(); - - return 0; + return SerialBase::sync(); } void BufferedSerial::sigio(Callback func) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index e175dd47a2a..dbdf3783798 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -164,17 +164,22 @@ void SerialBase::_deinit() serial_free(&_serial); } -int SerialBase:: sync() +int SerialBase::sync() { + int count = 0; lock(); - - while (!serial_tx_empty(&_serial)) { + while ((!serial_tx_empty(&_serial)) && (count < 16)) { // See send_break() wait_us(18000000 / _baud); + count++; } - unlock(); - return 0; + + if (count < 16) { + return 0; + } else { + return -ETIME; + } } void SerialBase::enable_input(bool enable) From 45bac9e7771c83174e1081522e98e09d370d1ac8 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 11:00:43 +0200 Subject: [PATCH 41/65] Use sleep_for instead of wait_us --- drivers/source/SerialBase.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index dbdf3783798..2c5de3a5b12 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -18,6 +18,8 @@ #include "platform/mbed_wait_api.h" #include "platform/mbed_critical.h" #include "platform/mbed_power_mgmt.h" +#include "mbed_chrono.h" +#include "ThisThread.h" #if DEVICE_SERIAL @@ -167,10 +169,11 @@ void SerialBase::_deinit() int SerialBase::sync() { int count = 0; + // See send_break(), ensure at least 1ms sleep time + int timeout_ms = (18000 / _baud) + 1; lock(); while ((!serial_tx_empty(&_serial)) && (count < 16)) { - // See send_break() - wait_us(18000000 / _baud); + rtos::ThisThread::sleep_for(chrono::milliseconds_u32(timeout_ms)); count++; } unlock(); From 4e52fb1451482a8ec7c40d4944e36e324d11f447 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 11:07:31 +0200 Subject: [PATCH 42/65] Don't use software timeout if _flow_type == CTS or _flow_type == RTSCTS --- drivers/source/SerialBase.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 2c5de3a5b12..51143561084 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -174,7 +174,10 @@ int SerialBase::sync() lock(); while ((!serial_tx_empty(&_serial)) && (count < 16)) { rtos::ThisThread::sleep_for(chrono::milliseconds_u32(timeout_ms)); - count++; +#if DEVICE_SERIAL_FC + if ((_flow_type == RTS) || (_flow_type == Disabled)) +#endif + count++; } unlock(); From 84eb2059ecb186f59dd9811934621f23882e3ccc Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:22:11 +0200 Subject: [PATCH 43/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_M251/ --- targets/TARGET_NUVOTON/TARGET_M251/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c index 9886f96a458..78edc8477bf 100644 --- a/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M251/serial_api.c @@ -450,7 +450,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 9d2236e84b8a1f8d53e825c97a446161e8689e11 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:23:11 +0200 Subject: [PATCH 44/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_M261/ --- targets/TARGET_NUVOTON/TARGET_M261/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c index 285a79f2f00..b0e550daa52 100644 --- a/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M261/serial_api.c @@ -495,7 +495,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 55243ece7d3da0ec59ad27abf2aea16a5e2f5afc Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:24:01 +0200 Subject: [PATCH 45/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_M451/ --- targets/TARGET_NUVOTON/TARGET_M451/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c index f754207abbd..82516513981 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c @@ -450,7 +450,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 5cd61f281986ae976b90a8f3dd3fe054fa571391 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:24:50 +0200 Subject: [PATCH 46/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_M480/ --- targets/TARGET_NUVOTON/TARGET_M480/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c index e1360adfb2b..49ffb834005 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c @@ -527,7 +527,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 1c5f33f164ac20c85c7e25e31a3d8e830917aca2 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:25:38 +0200 Subject: [PATCH 47/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_NANO100/ --- targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c index 1db2bdba8c0..ce72f86b953 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c @@ -412,7 +412,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 6cd7063bf4f232302770f279d47910d95bf05305 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 12:26:25 +0200 Subject: [PATCH 48/65] Fix UART_IS_TX_EMPTY TARGET_NUVOTON/TARGET_NUC472/ --- targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c index 55f7bb46ab3..5b85cac33d2 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c @@ -490,7 +490,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { - return UART_GET_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); + return UART_IS_TX_EMPTY(((UART_T *) NU_MODBASE(obj->serial.uart))); } void serial_pinout_tx(PinName tx) From 66ecb29ed0e2657e792f71c91d440d89e892a1f3 Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 3 May 2021 15:53:56 +0200 Subject: [PATCH 49/65] Fix keep char time allowance in Chrono domain --- drivers/source/SerialBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 51143561084..3443d743680 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -170,10 +170,10 @@ int SerialBase::sync() { int count = 0; // See send_break(), ensure at least 1ms sleep time - int timeout_ms = (18000 / _baud) + 1; + auto char_time_allowance = chrono::milliseconds_u32((18000 / _baud) + 1); lock(); while ((!serial_tx_empty(&_serial)) && (count < 16)) { - rtos::ThisThread::sleep_for(chrono::milliseconds_u32(timeout_ms)); + rtos::ThisThread::sleep_for(char_time_allowance); #if DEVICE_SERIAL_FC if ((_flow_type == RTS) || (_flow_type == Disabled)) #endif From 3b7c94cf548ac3d549b791a9fc2bc996bbf56dfe Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 12 May 2021 11:29:32 +0200 Subject: [PATCH 50/65] serial_tx_empty TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050 --- .../TARGET_MIMXRT1050/TARGET_EVK/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c index 0af83e98d30..b6a4fe1967b 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c @@ -266,6 +266,11 @@ int serial_writable(serial_t *obj) return (status_flags & kLPUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { From 5aece6b753838cfab5980d6e9d504c02fb3f66cb Mon Sep 17 00:00:00 2001 From: pennam Date: Wed, 12 May 2021 11:29:55 +0200 Subject: [PATCH 51/65] serial_tx_empty TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170 --- .../TARGET_MIMXRT1170/TARGET_EVK/serial_api.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c index c479ade934e..7c803e2a3f1 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c @@ -266,6 +266,11 @@ int serial_writable(serial_t *obj) return (status_flags & kLPUART_TxDataRegEmptyFlag); } +int serial_tx_empty(serial_t *obj) +{ + return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); +} + void serial_clear(serial_t *obj) { From bdb44e2b54d21e1b8e552b29a4f3d37098fa4ab8 Mon Sep 17 00:00:00 2001 From: pennam Date: Sat, 5 Jun 2021 14:21:24 +0200 Subject: [PATCH 52/65] Use explicit paths for mbed_chrono and ThisThread --- drivers/source/SerialBase.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 3443d743680..5be0772367b 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -18,8 +18,8 @@ #include "platform/mbed_wait_api.h" #include "platform/mbed_critical.h" #include "platform/mbed_power_mgmt.h" -#include "mbed_chrono.h" -#include "ThisThread.h" +#include "platform/mbed_chrono.h" +#include "rtos/ThisThread.h" #if DEVICE_SERIAL From 91417019d5bd199f27ee6b7f4030f66c5f86994e Mon Sep 17 00:00:00 2001 From: pennam Date: Sat, 5 Jun 2021 14:33:27 +0200 Subject: [PATCH 53/65] Update serial_tx_empty() function description --- hal/include/hal/serial_api.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/hal/include/hal/serial_api.h b/hal/include/hal/serial_api.h index 4b11e7697ae..eacf8c9824a 100644 --- a/hal/include/hal/serial_api.h +++ b/hal/include/hal/serial_api.h @@ -296,7 +296,8 @@ int serial_readable(serial_t *obj); */ int serial_writable(serial_t *obj); -/** Check if the serial peripheral tx buffer is empty +/** Check if the serial peripheral tx buffer or tx FIFO is empty and the last byte has + * been completely transmitted from the shift register to the bus. * * @param obj The serial object * @return Non-zero value if tx is empty, 0 otherwise. From 6f6b6653a4bf34d923460779566dc206d69bd4ee Mon Sep 17 00:00:00 2001 From: pennam Date: Sat, 5 Jun 2021 14:42:25 +0200 Subject: [PATCH 54/65] Update FileHandle sync() function description --- platform/include/platform/FileHandle.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/include/platform/FileHandle.h b/platform/include/platform/FileHandle.h index b666301d91c..a3d23588242 100644 --- a/platform/include/platform/FileHandle.h +++ b/platform/include/platform/FileHandle.h @@ -92,7 +92,7 @@ class FileHandle : private NonCopyable { */ virtual int close() = 0; - /** Flush any buffers associated with the file + /** Synchronize the contents of a file with storage device * * @return 0 on success, negative error code on failure */ From bf8aa3cb6418bc0c367e4a3270506072f4b31273 Mon Sep 17 00:00:00 2001 From: pennam Date: Sat, 5 Jun 2021 14:53:30 +0200 Subject: [PATCH 55/65] Update SerialBase sync() function description --- drivers/include/drivers/SerialBase.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/include/drivers/SerialBase.h b/drivers/include/drivers/SerialBase.h index 3753468ecd7..de3229fcfd3 100644 --- a/drivers/include/drivers/SerialBase.h +++ b/drivers/include/drivers/SerialBase.h @@ -119,7 +119,9 @@ class SerialBase : private NonCopyable { */ void send_break(); - /** Flush hardware buffers associated with serial port + /** Ensures all data stored in peripheral buffers is transmitted to the bus + * + * The function shall block until all the content of peripheral buffers is transmitted. * * @return 0 on success, negative error code on failure */ From 97994e3855277773463f8120cca4e6a193ee830f Mon Sep 17 00:00:00 2001 From: pennam Date: Mon, 7 Jun 2021 15:20:26 +0200 Subject: [PATCH 56/65] Increase char_time_allowance maximum counter value because CY8CPROTO_062_4343W has a 128 byte TX FIFO --- drivers/source/SerialBase.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/drivers/source/SerialBase.cpp b/drivers/source/SerialBase.cpp index 5be0772367b..b269c5bb569 100644 --- a/drivers/source/SerialBase.cpp +++ b/drivers/source/SerialBase.cpp @@ -172,7 +172,8 @@ int SerialBase::sync() // See send_break(), ensure at least 1ms sleep time auto char_time_allowance = chrono::milliseconds_u32((18000 / _baud) + 1); lock(); - while ((!serial_tx_empty(&_serial)) && (count < 16)) { + // Assuming the biggest Tx FIFO of 128 bytes (as for CY8CPROTO_062_4343W) + while ((!serial_tx_empty(&_serial)) && (count < 128)) { rtos::ThisThread::sleep_for(char_time_allowance); #if DEVICE_SERIAL_FC if ((_flow_type == RTS) || (_flow_type == Disabled)) @@ -181,7 +182,7 @@ int SerialBase::sync() } unlock(); - if (count < 16) { + if (count < 128) { return 0; } else { return -ETIME; From 2a15da2d76838bfe1e3f3d28957e9ce5db572985 Mon Sep 17 00:00:00 2001 From: pennam Date: Fri, 18 Jun 2021 15:51:18 +0200 Subject: [PATCH 57/65] Add testcase to check SerialBase sync capability --- .../tests/TESTS/host_tests/serial_comms.py | 6 ++ .../mbed_drivers/sync_serial/CMakeLists.txt | 13 +++ .../TESTS/mbed_drivers/sync_serial/main.cpp | 99 +++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 drivers/tests/TESTS/mbed_drivers/sync_serial/CMakeLists.txt create mode 100644 drivers/tests/TESTS/mbed_drivers/sync_serial/main.cpp diff --git a/drivers/tests/TESTS/host_tests/serial_comms.py b/drivers/tests/TESTS/host_tests/serial_comms.py index f51ac7d60f0..d453a1e0c29 100644 --- a/drivers/tests/TESTS/host_tests/serial_comms.py +++ b/drivers/tests/TESTS/host_tests/serial_comms.py @@ -20,6 +20,7 @@ MSG_KEY_ECHO_MESSAGE = "echo_message" +MSG_KEY_SYNC_MESSAGE = "sync_message" class SerialComms(BaseHostTest): @@ -32,7 +33,12 @@ def __init__(self): def setup(self): """Register call backs to handle message from the target.""" self.register_callback(MSG_KEY_ECHO_MESSAGE, self.cb_echo_message) + self.register_callback(MSG_KEY_SYNC_MESSAGE, self.cb_sync_message) def cb_echo_message(self, key, value, timestamp): """Send back the key and value received.""" self.send_kv(key, value) + + def cb_sync_message(self, key, value, timestamp): + """Test completed.""" + self.notify_complete(True) diff --git a/drivers/tests/TESTS/mbed_drivers/sync_serial/CMakeLists.txt b/drivers/tests/TESTS/mbed_drivers/sync_serial/CMakeLists.txt new file mode 100644 index 00000000000..21451ef751d --- /dev/null +++ b/drivers/tests/TESTS/mbed_drivers/sync_serial/CMakeLists.txt @@ -0,0 +1,13 @@ +# Copyright (c) 2020 ARM Limited. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.19.0 FATAL_ERROR) + +set(MBED_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../../../.. CACHE INTERNAL "") +set(TEST_TARGET mbed-drivers-sync-serial) + +include(${MBED_PATH}/tools/cmake/mbed_greentea.cmake) + +project(${TEST_TARGET}) + +mbed_greentea_add_test(TEST_NAME ${TEST_TARGET}) diff --git a/drivers/tests/TESTS/mbed_drivers/sync_serial/main.cpp b/drivers/tests/TESTS/mbed_drivers/sync_serial/main.cpp new file mode 100644 index 00000000000..a40640875c2 --- /dev/null +++ b/drivers/tests/TESTS/mbed_drivers/sync_serial/main.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 Arm Limited and affiliates. + * SPDX-License-Identifier: Apache-2.0 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#if !DEVICE_SERIAL +#error [NOT_SUPPORTED] serial communication not supported for this target +#else + +#include "mbed.h" +#include "utest/utest.h" +#include "unity/unity.h" +#include "greentea-client/test_env.h" +#include "platform/FileHandle.h" +#include "drivers/BufferedSerial.h" + + +using namespace utest::v1; + + +/** + * Macros for setting console flow control. + */ +#define CONSOLE_FLOWCONTROL_RTS 1 +#define CONSOLE_FLOWCONTROL_CTS 2 +#define CONSOLE_FLOWCONTROL_RTSCTS 3 +#define mbed_console_concat_(x) CONSOLE_FLOWCONTROL_##x +#define mbed_console_concat(x) mbed_console_concat_(x) +#define CONSOLE_FLOWCONTROL mbed_console_concat(MBED_CONF_TARGET_CONSOLE_UART_FLOW_CONTROL) + + +#define MSG_KEY_SYNC_MESSAGE "sync_message" +#define MSG_VALUE_HELLO_WORLD "Hello, world!" + + +#define EXPECTED_SYNCED_STRING "{{" MSG_KEY_SYNC_MESSAGE ";" MSG_VALUE_HELLO_WORLD "}}" +// The target is expected to transmit Greentea messages with \n (or \r\n) or they are not detected by the host +#define SYNC_STRING_TO_SEND EXPECTED_SYNCED_STRING "\n" + + +static BufferedSerial buffered_serial_obj( + CONSOLE_TX, CONSOLE_RX, MBED_CONF_PLATFORM_STDIO_BAUD_RATE +); + + +FileHandle *mbed::mbed_override_console(int fd) +{ + return &buffered_serial_obj; +} + + +static void test_serial_sync() +{ + char tx_msg[] = SYNC_STRING_TO_SEND; + + TEST_ASSERT_EQUAL_UINT( + strlen(tx_msg) + 1, + buffered_serial_obj.write(tx_msg, strlen(tx_msg) + 1) + ); + + // Wait the message is completely sent to the bus + buffered_serial_obj.sync(); + system_reset(); + TEST_ASSERT_MESSAGE(0, "The device did not reset as expected."); +} + + +int main() +{ +#if CONSOLE_FLOWCONTROL == CONSOLE_FLOWCONTROL_RTS + buffered_serial_obj.set_flow_control( + SerialBase::RTS, STDIO_UART_RTS, NC + ); +#elif CONSOLE_FLOWCONTROL == CONSOLE_FLOWCONTROL_CTS + buffered_serial_obj.set_flow_control( + SerialBase::CTS, NC, STDIO_UART_CTS + ); +#elif CONSOLE_FLOWCONTROL == CONSOLE_FLOWCONTROL_RTSCTS + buffered_serial_obj.set_flow_control( + SerialBase::RTSCTS, STDIO_UART_RTS, STDIO_UART_CTS + ); +#endif + GREENTEA_SETUP(12, "serial_comms"); + test_serial_sync(); // The result of this test suite is reported by the host side. + GREENTEA_TESTSUITE_RESULT(0); // Fail on any error. +} + +#endif // !DEVICE_SERIAL From b063b41bbd95b91474f40183969956ffb07b4667 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 22 Jun 2021 13:02:53 +0200 Subject: [PATCH 58/65] Update uart fpga common tests to check also for serial_tx_empty() --- .../TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp b/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp index 3719f035447..f4b872465b2 100644 --- a/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp +++ b/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp @@ -211,10 +211,12 @@ static void uart_test_common(int baudrate, int data_bits, SerialParity parity, i checksum += tx_val; serial_putc(&serial, tx_val); us_timestamp_t end_ts = ticker_read_us(us_ticker) + 2 * packet_tx_time; - while (tester.rx_get_count() != reps && ticker_read_us(us_ticker) <= end_ts) { + while ((!serial_tx_empty(&serial) || tester.rx_get_count() != reps) && ticker_read_us(us_ticker) <= end_ts) { // Wait (no longer than twice the time of one packet transfer) for + // the DUT to send all buffered data to the bus and for // the FPGA to receive data and update the byte counter. } + TEST_ASSERT_EQUAL(1, serial_tx_empty(&serial)); TEST_ASSERT_EQUAL_UINT32(reps, tester.rx_get_count()); TEST_ASSERT_EQUAL(0, tester.rx_get_parity_errors()); TEST_ASSERT_EQUAL(0, tester.rx_get_stop_errors()); @@ -265,10 +267,12 @@ static void uart_test_common(int baudrate, int data_bits, SerialParity parity, i serial_irq_set(&serial, TxIrq, 0); core_util_critical_section_exit(); us_timestamp_t end_ts = ticker_read_us(us_ticker) + 2 * packet_tx_time; - while (ticker_read_us(us_ticker) <= end_ts) { - // Wait twice the time of one packet transfer for the FPGA - // to receive and process data. + while (!serial_tx_empty(&serial) && ticker_read_us(us_ticker) <= end_ts) { + // Wait (no longer than twice the time of one packet transfer) for + // the DUT to send all buffered data to the bus and for + // the FPGA to receive and process data. }; + TEST_ASSERT_EQUAL(1, serial_tx_empty(&serial)); tester.rx_stop(); TEST_ASSERT_EQUAL_UINT32(2 * PUTC_REPS, tester.rx_get_count()); TEST_ASSERT_EQUAL(0, tester.rx_get_parity_errors()); From b99ff36b334749e6650714baee48a7fad22240e3 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 22 Jun 2021 13:06:07 +0200 Subject: [PATCH 59/65] Round up packet transmission time to avoid test failures caused by 1us delay --- hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp b/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp index f4b872465b2..8d0322b438f 100644 --- a/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp +++ b/hal/tests/TESTS/mbed_hal_fpga_ci_test_shield/uart/main.cpp @@ -123,7 +123,7 @@ static void uart_test_common(int baudrate, int data_bits, SerialParity parity, i // start_bit + data_bits + parity_bit + stop_bits int packet_bits = 1 + data_bits + stop_bits + (parity == ParityNone ? 0 : 1); - us_timestamp_t packet_tx_time = 1000000 * packet_bits / baudrate; + us_timestamp_t packet_tx_time = (1000000 * packet_bits / baudrate) + 0.5; const ticker_data_t *const us_ticker = get_us_ticker_data(); bool use_flow_control = (cts != NC && rts != NC) ? true : false; From ac2f4ffa3cb7cf7beb62837f901e289940f12a23 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 08:42:40 +0200 Subject: [PATCH 60/65] Fix build for TARGET_EFM32GG --- .../TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_leuart.h | 1 + .../TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_usart.h | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_leuart.h b/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_leuart.h index c8a33cc3a7e..a1971e9cd11 100644 --- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_leuart.h +++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_leuart.h @@ -246,6 +246,7 @@ typedef struct { #define _LEUART_STATUS_RXDATAV_MASK 0x20UL /**< Bit mask for LEUART_RXDATAV */ #define _LEUART_STATUS_RXDATAV_DEFAULT 0x00000000UL /**< Mode DEFAULT for LEUART_STATUS */ #define LEUART_STATUS_RXDATAV_DEFAULT (_LEUART_STATUS_RXDATAV_DEFAULT << 5) /**< Shifted mode DEFAULT for LEUART_STATUS */ +#define LEUART_STATUS_TXIDLE (0x1UL << 6) /**< TX Idle */ /* Bit fields for LEUART CLKDIV */ #define _LEUART_CLKDIV_RESETVALUE 0x00000000UL /**< Default value for LEUART_CLKDIV */ diff --git a/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_usart.h b/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_usart.h index 0cf8b999dc9..c4bb95e39b2 100644 --- a/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_usart.h +++ b/targets/TARGET_Silicon_Labs/TARGET_EFM32/TARGET_EFM32GG/device/efm32gg_usart.h @@ -471,6 +471,11 @@ typedef struct { #define _USART_STATUS_RXFULLRIGHT_MASK 0x1000UL /**< Bit mask for USART_RXFULLRIGHT */ #define _USART_STATUS_RXFULLRIGHT_DEFAULT 0x00000000UL /**< Mode DEFAULT for USART_STATUS */ #define USART_STATUS_RXFULLRIGHT_DEFAULT (_USART_STATUS_RXFULLRIGHT_DEFAULT << 12) /**< Shifted mode DEFAULT for USART_STATUS */ +#define USART_STATUS_TXIDLE (0x1UL << 13) /**< TX Idle */ +#define _USART_STATUS_TXIDLE_SHIFT 13 /**< Shift value for USART_TXIDLE */ +#define _USART_STATUS_TXIDLE_MASK 0x2000UL /**< Bit mask for USART_TXIDLE */ +#define _USART_STATUS_TXIDLE_DEFAULT 0x00000001UL /**< Mode DEFAULT for USART_STATUS */ +#define USART_STATUS_TXIDLE_DEFAULT (_USART_STATUS_TXIDLE_DEFAULT << 13) /**< Shifted mode DEFAULT for USART_STATUS */ /* Bit fields for USART CLKDIV */ #define _USART_CLKDIV_RESETVALUE 0x00000000UL /**< Default value for USART_CLKDIV */ From dfa17d1a1bf9cb1268806fb09fa288239641c169 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 08:45:19 +0200 Subject: [PATCH 61/65] Fix build for EV_COG_AD3029LZ --- .../TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c b/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c index 11684b11b3d..29c4689b286 100755 --- a/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c +++ b/targets/TARGET_Analog_Devices/TARGET_ADUCM302X/TARGET_ADUCM3029/api/serial_api.c @@ -265,7 +265,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { bool bAvailable = false; - adi_uart_IsTxComplete(hDevice[obj->index], &bAvailable); + adi_uart_IsTxComplete(hDevice, &bAvailable); return bAvailable; } From 5f8a564d41e846ab9847b1d9437fb49f3ec9dfc9 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 08:48:19 +0200 Subject: [PATCH 62/65] Fix build for MIMXRT1050_EVK --- .../TARGET_MIMXRT1050/TARGET_EVK/serial_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c index b6a4fe1967b..6c622855adb 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1050/TARGET_EVK/serial_api.c @@ -268,6 +268,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { + uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); } From a5664902fd432faf7c947906ba8a6515b7a35496 Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 08:50:16 +0200 Subject: [PATCH 63/65] Fix build for MIMXRT1170_EVK --- .../TARGET_MIMXRT1170/TARGET_EVK/serial_api.c | 1 + 1 file changed, 1 insertion(+) diff --git a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c index 7c803e2a3f1..618979f6f15 100644 --- a/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c +++ b/targets/TARGET_NXP/TARGET_MCUXpresso_MCUS/TARGET_MIMXRT1170/TARGET_EVK/serial_api.c @@ -268,6 +268,7 @@ int serial_writable(serial_t *obj) int serial_tx_empty(serial_t *obj) { + uint32_t status_flags = LPUART_GetStatusFlags(uart_addrs[obj->index]); return ((status_flags & kLPUART_TxDataRegEmptyFlag) && (status_flags & kLPUART_TransmissionCompleteFlag)); } From b5c1eef28f6ab52c10cd9f76ea7ca5eb0b64960b Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 08:56:12 +0200 Subject: [PATCH 64/65] Fix build for S5JS100 --- targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c index d687bf78616..53235ef8775 100644 --- a/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c +++ b/targets/TARGET_Samsung/TARGET_SIDK_S5JS100/serial_pl011_api.c @@ -234,7 +234,7 @@ static int pl011_serial_writable(void *obj) return !(p_PL011_UART->FR & (1u << 5)); } -static int pl011_serial_serial_tx_empty(void *obj) +static int pl011_serial_tx_empty(void *obj) { struct serial_s *priv = (struct serial_s *)obj; S5JS100_UART_TypeDef *p_PL011_UART = UART_PTR(priv->uart); From 2b00cf6d45fbcee860e647593e84cb57ceca0d8f Mon Sep 17 00:00:00 2001 From: pennam Date: Tue, 17 Aug 2021 09:40:27 +0200 Subject: [PATCH 65/65] Add implementation for TARGET_FVP_MPS2, TARGET_CM3DS_MPS2 and TARGET_MPS2 --- targets/TARGET_ARM_FM/TARGET_FVP_MPS2/serial_api.c | 5 +++++ targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/serial_api.c | 5 +++++ targets/TARGET_ARM_SSG/TARGET_MPS2/serial_api.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/targets/TARGET_ARM_FM/TARGET_FVP_MPS2/serial_api.c b/targets/TARGET_ARM_FM/TARGET_FVP_MPS2/serial_api.c index 296b383816c..8ac3233c4af 100644 --- a/targets/TARGET_ARM_FM/TARGET_FVP_MPS2/serial_api.c +++ b/targets/TARGET_ARM_FM/TARGET_FVP_MPS2/serial_api.c @@ -361,6 +361,11 @@ int serial_writable(serial_t *obj) return !(obj->uart->STATE & 0x1); } +int serial_tx_empty(serial_t *obj) +{ + return !(obj->uart->STATE & 0x1); +} + void serial_clear(serial_t *obj) { obj->uart->DATA = 0x00; diff --git a/targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/serial_api.c b/targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/serial_api.c index 466e70599c2..7f9ae372b81 100644 --- a/targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/serial_api.c +++ b/targets/TARGET_ARM_SSG/TARGET_CM3DS_MPS2/serial_api.c @@ -355,6 +355,11 @@ int serial_writable(serial_t *obj) return arm_uart_tx_ready(obj->uart); } +int serial_tx_empty(serial_t *obj) +{ + return arm_uart_tx_ready(obj->uart); +} + void serial_clear(serial_t *obj) { (void)arm_uart_write(obj->uart, 0x00); diff --git a/targets/TARGET_ARM_SSG/TARGET_MPS2/serial_api.c b/targets/TARGET_ARM_SSG/TARGET_MPS2/serial_api.c index 6cf18c98c5b..8cf37bdf624 100644 --- a/targets/TARGET_ARM_SSG/TARGET_MPS2/serial_api.c +++ b/targets/TARGET_ARM_SSG/TARGET_MPS2/serial_api.c @@ -354,6 +354,10 @@ int serial_writable(serial_t *obj) { return obj->uart->STATE & 0x1; } +int serial_tx_empty(serial_t *obj) { + return obj->uart->STATE & 0x1; +} + void serial_clear(serial_t *obj) { obj->uart->DATA = 0x00; }