Skip to content

Commit 8c6a9ee

Browse files
bjarki-andreasenfabiobaltieri
authored andcommitted
modem: backend: uart: Implement transmit idle event
Make async and interrupt driven UART backends notify transmit idle when transmit is idle. Signed-off-by: Bjarki Arge Andreasen <[email protected]>
1 parent 516af3c commit 8c6a9ee

File tree

4 files changed

+13
-0
lines changed

4 files changed

+13
-0
lines changed

include/zephyr/modem/backend/uart.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ struct modem_backend_uart {
4343
const struct device *uart;
4444
struct modem_pipe pipe;
4545
struct k_work receive_ready_work;
46+
struct k_work transmit_idle_work;
4647

4748
union {
4849
struct modem_backend_uart_isr isr;

subsys/modem/backends/modem_backend_uart.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,14 @@ static void modem_backend_uart_receive_ready_handler(struct k_work *item)
2222
modem_pipe_notify_receive_ready(&backend->pipe);
2323
}
2424

25+
static void modem_backend_uart_transmit_idle_handler(struct k_work *item)
26+
{
27+
struct modem_backend_uart *backend =
28+
CONTAINER_OF(item, struct modem_backend_uart, transmit_idle_work);
29+
30+
modem_pipe_notify_transmit_idle(&backend->pipe);
31+
}
32+
2533
struct modem_pipe *modem_backend_uart_init(struct modem_backend_uart *backend,
2634
const struct modem_backend_uart_config *config)
2735
{
@@ -35,6 +43,7 @@ struct modem_pipe *modem_backend_uart_init(struct modem_backend_uart *backend,
3543
memset(backend, 0x00, sizeof(*backend));
3644
backend->uart = config->uart;
3745
k_work_init(&backend->receive_ready_work, modem_backend_uart_receive_ready_handler);
46+
k_work_init(&backend->transmit_idle_work, modem_backend_uart_transmit_idle_handler);
3847

3948
#ifdef CONFIG_MODEM_BACKEND_UART_ASYNC
4049
if (modem_backend_uart_async_is_supported(backend)) {

subsys/modem/backends/modem_backend_uart_async.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,15 @@ static void modem_backend_uart_async_event_handler(const struct device *dev,
4444
case UART_TX_DONE:
4545
atomic_clear_bit(&backend->async.state,
4646
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
47+
k_work_submit(&backend->transmit_idle_work);
4748

4849
break;
4950

5051
case UART_TX_ABORTED:
5152
LOG_WRN("Transmit aborted");
5253
atomic_clear_bit(&backend->async.state,
5354
MODEM_BACKEND_UART_ASYNC_STATE_TRANSMITTING_BIT);
55+
k_work_submit(&backend->transmit_idle_work);
5456

5557
break;
5658

subsys/modem/backends/modem_backend_uart_isr.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ static void modem_backend_uart_isr_irq_handler_transmit_ready(struct modem_backe
5656

5757
if (ring_buf_is_empty(&backend->isr.transmit_rb) == true) {
5858
uart_irq_tx_disable(backend->uart);
59+
k_work_submit(&backend->transmit_idle_work);
5960
return;
6061
}
6162

0 commit comments

Comments
 (0)