df7750f63a
Introduce a backend for the Shell subsystem using a RPMsg endpoint. This is useful for tooling & testing a remote processor from linux. Signed-off-by: Pieter De Gendt <pieter.degendt@basalte.be>
88 lines
2 KiB
C
88 lines
2 KiB
C
/*
|
|
* Copyright (c) 2024 Basalte bv
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#ifndef SHELL_RPMSG_H__
|
|
#define SHELL_RPMSG_H__
|
|
|
|
#include <zephyr/kernel.h>
|
|
#include <zephyr/shell/shell.h>
|
|
#include <openamp/rpmsg.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
extern const struct shell_transport_api shell_rpmsg_transport_api;
|
|
|
|
/** RPMsg received message placeholder */
|
|
struct shell_rpmsg_rx {
|
|
/** Pointer to the data held by RPMsg endpoint */
|
|
void *data;
|
|
/** The length of the data */
|
|
size_t len;
|
|
};
|
|
|
|
/** RPMsg-based shell transport. */
|
|
struct shell_rpmsg {
|
|
/** Handler function registered by shell. */
|
|
shell_transport_handler_t shell_handler;
|
|
|
|
/** Context registered by shell. */
|
|
void *shell_context;
|
|
|
|
/** Indicator if we are ready to read/write */
|
|
bool ready;
|
|
|
|
/** Setting for blocking mode */
|
|
bool blocking;
|
|
|
|
/** RPMsg endpoint */
|
|
struct rpmsg_endpoint ept;
|
|
|
|
/** Queue for received data. */
|
|
struct k_msgq rx_q;
|
|
|
|
/** Buffer for received messages */
|
|
struct shell_rpmsg_rx rx_buf[CONFIG_SHELL_RPMSG_MAX_RX];
|
|
|
|
/** The current rx message */
|
|
struct shell_rpmsg_rx rx_cur;
|
|
|
|
/** The number of bytes consumed from rx_cur */
|
|
size_t rx_consumed;
|
|
};
|
|
|
|
#define SHELL_RPMSG_DEFINE(_name) \
|
|
static struct shell_rpmsg _name##_shell_rpmsg; \
|
|
struct shell_transport _name = { \
|
|
.api = &shell_rpmsg_transport_api, \
|
|
.ctx = (struct shell_rpmsg *)&_name##_shell_rpmsg, \
|
|
}
|
|
|
|
/**
|
|
* @brief Initialize the Shell backend using the provided @p rpmsg_dev device.
|
|
*
|
|
* @param rpmsg_dev A pointer to an RPMsg device
|
|
* @return 0 on success or a negative value on error
|
|
*/
|
|
int shell_backend_rpmsg_init_transport(struct rpmsg_device *rpmsg_dev);
|
|
|
|
/**
|
|
* @brief This function provides pointer to shell RPMsg backend instance.
|
|
*
|
|
* Function returns pointer to the shell RPMsg 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_rpmsg_get_ptr(void);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* SHELL_RPMSG_H__ */
|