zephyr/include/zephyr/shell/shell_uart.h
Yong Cong Sin b8008c4727 shell: shell_uart: improve macro compatibility with previous version
The `SHELL_UART_DEFINE` macro was previously
`SHELL_UART_DEFINE(_name, _tx_ringbuf_size, _rx_ringbuf_size)`,
before it got removed in #63967 and then reinstated in #66218 as
`SHELL_UART_DEFINE(_name)`.

However its current form isn't compatible with previous Zephyr
version, and would cause compilation error when an application
migrates from to v3.6, let's modify it to accept variable
arguments for now.

Added documentation for this public API and updated the
migration guide accordingly.

Signed-off-by: Yong Cong Sin <ycsin@meta.com>
2024-01-18 10:52:08 +01:00

119 lines
3.5 KiB
C

/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef SHELL_UART_H__
#define SHELL_UART_H__
#include <zephyr/drivers/serial/uart_async_rx.h>
#include <zephyr/mgmt/mcumgr/transport/smp_shell.h>
#include <zephyr/shell/shell.h>
#ifdef __cplusplus
extern "C" {
#endif
extern const struct shell_transport_api shell_uart_transport_api;
#ifndef CONFIG_SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE
#define CONFIG_SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE 0
#endif
#ifndef CONFIG_SHELL_BACKEND_SERIAL_TX_RING_BUFFER_SIZE
#define CONFIG_SHELL_BACKEND_SERIAL_TX_RING_BUFFER_SIZE 0
#endif
#ifndef CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_COUNT
#define CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_COUNT 0
#endif
#ifndef CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_SIZE
#define CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_SIZE 0
#endif
#define ASYNC_RX_BUF_SIZE (CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_COUNT * \
(CONFIG_SHELL_BACKEND_SERIAL_ASYNC_RX_BUFFER_SIZE + \
UART_ASYNC_RX_BUF_OVERHEAD))
struct shell_uart_common {
const struct device *dev;
shell_transport_handler_t handler;
void *context;
bool blocking_tx;
#ifdef CONFIG_MCUMGR_TRANSPORT_SHELL
struct smp_shell_data smp;
#endif /* CONFIG_MCUMGR_TRANSPORT_SHELL */
};
struct shell_uart_int_driven {
struct shell_uart_common common;
struct ring_buf tx_ringbuf;
struct ring_buf rx_ringbuf;
uint8_t tx_buf[CONFIG_SHELL_BACKEND_SERIAL_TX_RING_BUFFER_SIZE];
uint8_t rx_buf[CONFIG_SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE];
struct k_timer dtr_timer;
atomic_t tx_busy;
};
struct shell_uart_async {
struct shell_uart_common common;
struct k_sem tx_sem;
struct uart_async_rx async_rx;
struct uart_async_rx_config async_rx_config;
atomic_t pending_rx_req;
uint8_t rx_data[ASYNC_RX_BUF_SIZE];
};
struct shell_uart_polling {
struct shell_uart_common common;
struct ring_buf rx_ringbuf;
uint8_t rx_buf[CONFIG_SHELL_BACKEND_SERIAL_RX_RING_BUFFER_SIZE];
struct k_timer rx_timer;
};
#ifdef CONFIG_SHELL_BACKEND_SERIAL_API_POLLING
#define SHELL_UART_STRUCT struct shell_uart_polling
#elif defined(CONFIG_SHELL_BACKEND_SERIAL_API_ASYNC)
#define SHELL_UART_STRUCT struct shell_uart_async
#else
#define SHELL_UART_STRUCT struct shell_uart_int_driven
#endif
/**
* @brief Macro for creating shell UART transport instance named @p _name
*
* @note Additional arguments are accepted (but ignored) for compatibility with
* previous Zephyr version, it will be removed in future release.
*/
#define SHELL_UART_DEFINE(_name, ...) \
static SHELL_UART_STRUCT _name##_shell_uart; \
struct shell_transport _name = { \
.api = &shell_uart_transport_api, \
.ctx = (struct shell_telnet *)&_name##_shell_uart, \
}
/**
* @brief This function provides pointer to the shell UART backend instance.
*
* Function returns pointer to the shell UART instance. This instance can be
* next used with shell_execute_cmd function in order to test commands behavior.
*
* @returns Pointer to the shell instance.
*/
const struct shell *shell_backend_uart_get_ptr(void);
/**
* @brief This function provides pointer to the smp shell data of the UART shell transport.
*
* @returns Pointer to the smp shell data.
*/
struct smp_shell_data *shell_uart_smp_shell_data_get_ptr(void);
#ifdef __cplusplus
}
#endif
#endif /* SHELL_UART_H__ */