UART async adapter

UART async adapter library works as an interface between interrupt-driven API of a UART device and software that is using the asynchronous API interface.

Note

The current implementation is experimental.

Overview

Zephyr provides the following three different ways to access a UART peripheral:

  • Pooling API

  • Interrupt-driven API

  • Asynchronous API

While most of the UART drivers provide all three APIs, some drivers still do not provide the asynchronous UART API. An example of such a driver is USB CDC ACM. The UART async adapter library is initialized with a UART device and communicates with it using the interrupt-driven API, providing an asynchronous API for the application.

This removes the need to implement two ways of interfacing with UART devices in software. When using the UART async adapter library, the software only needs to implement interaction with a UART device using the asynchronous API and just initialize the adapter for the ones that do not support it.

Requirements

To use the library, you need to enable the CONFIG_UART_ASYNC_API and CONFIG_UART_INTERRUPT_DRIVEN Kconfig options.

Configuration

Use the CONFIG_UART_ASYNC_ADAPTER Kconfig option to enable the library in the build system.

Usage

See the following code snippet to learn how to use this library:

#include <uart_async_adapter.h>

...
/* Get the UART device we want to use */
static const struct device *uart = DEVICE_DT_GET([UART node identifier]);

/* Create UART async adapter instance */
UART_ASYNC_ADAPTER_INST_DEFINE(async_adapter);

/* UART initialization (called before any UART usage) */
static int uart_init(void)
{
    if (!uart_test_async_api(uart)) {
            /* Implement API adapter */
            uart_async_adapter_init(async_adapter, uart);
            uart = async_adapter;
    }
    /* Continue initialization using asynchronous API on uart device */
    (...)
}

Note

When using the library in the way shown in the code snippet, it is totally transparent to the application.

If the selected UART device provides the asynchronous API, the adapter is not initialized. If the selected UART device does not provide the asynchronous API, the adapter is initialized to use such a device and a direct pointer to the device is replaced by the adapter.

Samples using the library

The following nRF Connect SDK sample use this library:

Limitations

Using this library adds code and performance overhead over direct usage of UART asynchronous API provided by the driver. For UART drivers that only provide the interrupt-driven API, consider using it directly in the application. The library allows using UART devices with different APIs with only one API in the application, speeding up the development process.

Dependencies

This module may use Logging.

API documentation

Header file: include/uart_async_adapter.h
Source files: subsys/uart_async_adapter/
UART async adapter