/* * Copyright (c) 2018 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_SHELL_UART_H_ #define ZEPHYR_INCLUDE_SHELL_UART_H_ #include #include #include #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 /* ZEPHYR_INCLUDE_SHELL_UART_H_ */