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.
97 lines
2.4 KiB
97 lines
2.4 KiB
/* |
|
* Copyright (c) 2021 Nordic Semiconductor ASA |
|
* |
|
* SPDX-License-Identifier: Apache-2.0 |
|
*/ |
|
|
|
#include <zephyr/kernel.h> |
|
#include <zephyr/ipc/ipc_service.h> |
|
#include <zephyr/logging/log_link.h> |
|
#include <zephyr/logging/log_multidomain_helper.h> |
|
#include <zephyr/logging/log_core.h> |
|
#include <zephyr/logging/log.h> |
|
|
|
LOG_MODULE_REGISTER(link_ipc); |
|
|
|
struct log_link_ipc_service { |
|
struct ipc_ept ept; |
|
struct log_multidomain_link link_remote; |
|
}; |
|
|
|
static void bound_cb(void *priv) |
|
{ |
|
struct log_multidomain_link *link_remote = priv; |
|
|
|
log_multidomain_link_on_started(link_remote, 0); |
|
} |
|
|
|
static void error_cb(const char *message, void *priv) |
|
{ |
|
struct log_multidomain_link *link_remote = priv; |
|
|
|
log_multidomain_link_on_error(link_remote, -EIO); |
|
} |
|
|
|
static void recv_cb(const void *data, size_t len, void *priv) |
|
{ |
|
struct log_multidomain_link *link_remote = priv; |
|
|
|
log_multidomain_link_on_recv_cb(link_remote, data, len); |
|
} |
|
|
|
static int link_ipc_service_send(struct log_multidomain_link *link_remote, |
|
void *data, size_t len) |
|
{ |
|
struct log_link_ipc_service *link_ipc_service = |
|
CONTAINER_OF(link_remote, struct log_link_ipc_service, link_remote); |
|
|
|
return ipc_service_send(&link_ipc_service->ept, data, len); |
|
} |
|
|
|
static int link_ipc_service_init(struct log_multidomain_link *link_remote) |
|
{ |
|
struct log_link_ipc_service *link_ipc_service = |
|
CONTAINER_OF(link_remote, struct log_link_ipc_service, link_remote); |
|
static struct ipc_ept_cfg ept_cfg = { |
|
.name = "logging", |
|
.prio = 0, |
|
.cb = { |
|
.bound = bound_cb, |
|
.received = recv_cb, |
|
.error = error_cb, |
|
}, |
|
}; |
|
const struct device *ipc_instance = DEVICE_DT_GET(DT_CHOSEN(zephyr_log_ipc)); |
|
int err; |
|
|
|
ept_cfg.priv = (void *)link_remote; |
|
err = ipc_service_open_instance(ipc_instance); |
|
if (err < 0 && err != -EALREADY) { |
|
__ASSERT(0, "ipc_service_open_instance() failure (err:%d)\n", err); |
|
return err; |
|
} |
|
|
|
err = ipc_service_register_endpoint(ipc_instance, &link_ipc_service->ept, &ept_cfg); |
|
|
|
return err; |
|
} |
|
|
|
struct log_multidomain_link_transport_api log_link_ipc_service_transport_api = { |
|
.init = link_ipc_service_init, |
|
.send = link_ipc_service_send |
|
}; |
|
|
|
static struct log_link_ipc_service link_ipc_service_data = { |
|
.link_remote = { |
|
.transport_api = &log_link_ipc_service_transport_api |
|
} |
|
}; |
|
|
|
LOG_LINK_DEF(link_ipc_service, log_multidomain_link_api, |
|
CONFIG_LOG_LINK_IPC_SERVICE_BUFFER_SIZE, |
|
&link_ipc_service_data.link_remote); |
|
|
|
const struct log_link *log_link_ipc_get_link(void) |
|
{ |
|
return &link_ipc_service; |
|
}
|
|
|