blob: fb927c6bfa70f1770b9f9931826a38322fdb16de [file] [log] [blame]
/*
* Copyright (c) 2021, Carlo Caione <ccaione@baylibre.com>
*
* SPDX-License-Identifier: Apache-2.0
*
* Simple backend that adds an offset (defined into the DT) to whatever it is
* passed in input as IPC message.
*/
#include <zephyr/ipc/ipc_service_backend.h>
#include <zephyr/logging/log.h>
#include <zephyr/sys/util_macro.h>
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#define DT_DRV_COMPAT ipc_service_backend
struct backend_data_t {
const struct ipc_ept_cfg *cfg;
};
struct backend_config_t {
unsigned int offset;
};
static int send(const struct device *instance, void *token,
const void *p_data, size_t len)
{
const struct backend_config_t *config;
struct backend_data_t *data;
uint8_t *msg;
config = instance->config;
data = instance->data;
msg = (uint8_t *) p_data;
*msg += config->offset;
data->cfg->cb.received(msg, sizeof(*msg), data->cfg->priv);
return 0;
}
static int register_ept(const struct device *instance,
void **token,
const struct ipc_ept_cfg *cfg)
{
struct backend_data_t *data = instance->data;
data->cfg = cfg;
return 0;
}
static int deregister_ept(const struct device *instance, void *token)
{
struct backend_data_t *data = instance->data;
data->cfg = NULL;
return 0;
}
const static struct ipc_service_backend backend_ops = {
.send = send,
.register_endpoint = register_ept,
.deregister_endpoint = deregister_ept,
};
static int backend_init(const struct device *dev)
{
ARG_UNUSED(dev);
/* Nothing to do */
return 0;
}
#define DEFINE_BACKEND_DEVICE(i) \
static struct backend_config_t backend_config_##i = { \
.offset = DT_INST_PROP(i, offset), \
}; \
\
static struct backend_data_t backend_data_##i; \
\
DEVICE_DT_INST_DEFINE(i, \
&backend_init, \
NULL, \
&backend_data_##i, \
&backend_config_##i, \
POST_KERNEL, \
CONFIG_IPC_SERVICE_REG_BACKEND_PRIORITY, \
&backend_ops);
DT_INST_FOREACH_STATUS_OKAY(DEFINE_BACKEND_DEVICE)