blob: 6e3e29b8289388109358e1cd769998f9cf82407c [file] [log] [blame]
/*
* Copyright (c) 2018 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#ifndef SHELL_UART_H__
#define SHELL_UART_H__
#include <shell/shell.h>
#include <sys/ring_buffer.h>
#include <sys/atomic.h>
#include "mgmt/mcumgr/smp_shell.h"
#ifdef __cplusplus
extern "C" {
#endif
extern const struct shell_transport_api shell_uart_transport_api;
/** @brief Shell UART transport instance control block (RW data). */
struct shell_uart_ctrl_blk {
const struct device *dev;
shell_transport_handler_t handler;
void *context;
atomic_t tx_busy;
bool blocking_tx;
#ifdef CONFIG_MCUMGR_SMP_SHELL
struct smp_shell_data smp;
#endif /* CONFIG_MCUMGR_SMP_SHELL */
};
#ifdef CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVEN
#define UART_SHELL_TX_RINGBUF_DECLARE(_name, _size) \
RING_BUF_DECLARE(_name##_tx_ringbuf, _size)
#define UART_SHELL_TX_BUF_DECLARE(_name) \
uint8_t _name##_txbuf[SHELL_UART_TX_BUF_SIZE]
#define UART_SHELL_RX_TIMER_DECLARE(_name) /* Empty */
#define UART_SHELL_TX_RINGBUF_PTR(_name) (&_name##_tx_ringbuf)
#define UART_SHELL_RX_TIMER_PTR(_name) NULL
#else /* CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVEN */
#define UART_SHELL_TX_RINGBUF_DECLARE(_name, _size) /* Empty */
#define UART_SHELL_TX_BUF_DECLARE(_name) /* Empty */
#define UART_SHELL_RX_TIMER_DECLARE(_name) static struct k_timer _name##_timer
#define UART_SHELL_TX_RINGBUF_PTR(_name) NULL
#define UART_SHELL_RX_TIMER_PTR(_name) (&_name##_timer)
#endif /* CONFIG_SHELL_BACKEND_SERIAL_INTERRUPT_DRIVEN */
/** @brief Shell UART transport instance structure. */
struct shell_uart {
struct shell_uart_ctrl_blk *ctrl_blk;
struct k_timer *timer;
struct ring_buf *tx_ringbuf;
struct ring_buf *rx_ringbuf;
};
/** @brief Macro for creating shell UART transport instance. */
#define SHELL_UART_DEFINE(_name, _tx_ringbuf_size, _rx_ringbuf_size) \
static struct shell_uart_ctrl_blk _name##_ctrl_blk; \
UART_SHELL_RX_TIMER_DECLARE(_name); \
UART_SHELL_TX_RINGBUF_DECLARE(_name, _tx_ringbuf_size); \
RING_BUF_DECLARE(_name##_rx_ringbuf, _rx_ringbuf_size); \
static const struct shell_uart _name##_shell_uart = { \
.ctrl_blk = &_name##_ctrl_blk, \
.timer = UART_SHELL_RX_TIMER_PTR(_name), \
.tx_ringbuf = UART_SHELL_TX_RINGBUF_PTR(_name), \
.rx_ringbuf = &_name##_rx_ringbuf, \
}; \
struct shell_transport _name = { \
.api = &shell_uart_transport_api, \
.ctx = (struct shell_uart *)&_name##_shell_uart \
}
/**
* @brief This function provides pointer to 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);
#ifdef __cplusplus
}
#endif
#endif /* SHELL_UART_H__ */