blob: e424a1857680be61d465daf02c1e70f4423b1da3 [file] [log] [blame]
/*
* 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__ */