| /* |
| * 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 <ipc/ipc_service_backend.h> |
| |
| #include <logging/log.h> |
| #include <sys/util_macro.h> |
| #include <zephyr.h> |
| #include <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; |
| } |
| |
| const static struct ipc_service_backend backend_ops = { |
| .send = send, |
| .register_endpoint = register_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) |