You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.8 KiB
95 lines
2.8 KiB
/* |
|
* 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 <ring_buffer.h> |
|
#include <sys/atomic.h> |
|
#ifdef CONFIG_MCUMGR_SMP_SHELL |
|
#include "mgmt/smp_shell.h" |
|
#endif |
|
|
|
#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 { |
|
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) \ |
|
u8_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__ */
|
|
|