logging: Add ipc_service log backend
Added backend that sends messages over ipc_service. It uses log_backend_remote and will talk to log_link_ipc_service based on log_link_remote. Signed-off-by: Krzysztof Chruscinski <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
parent
6c785b5677
commit
b01867812e
4 changed files with 99 additions and 1 deletions
|
@ -70,7 +70,6 @@ if(NOT CONFIG_LOG_MODE_MINIMAL)
|
||||||
log_multidomain_link.c
|
log_multidomain_link.c
|
||||||
)
|
)
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
else()
|
else()
|
||||||
zephyr_sources(log_minimal.c)
|
zephyr_sources(log_minimal.c)
|
||||||
|
|
|
@ -69,3 +69,8 @@ zephyr_sources_ifdef(
|
||||||
CONFIG_LOG_MULTIDOMAIN_BACKEND
|
CONFIG_LOG_MULTIDOMAIN_BACKEND
|
||||||
log_multidomain_backend.c
|
log_multidomain_backend.c
|
||||||
)
|
)
|
||||||
|
|
||||||
|
zephyr_sources_ifdef(
|
||||||
|
CONFIG_LOG_BACKEND_IPC_SERVICE
|
||||||
|
log_backend_ipc_service.c
|
||||||
|
)
|
||||||
|
|
|
@ -5,3 +5,7 @@ config LOG_MULTIDOMAIN_BACKEND
|
||||||
bool
|
bool
|
||||||
select LOG_TIMESTAMP_64BIT
|
select LOG_TIMESTAMP_64BIT
|
||||||
select LOG_MSG_APPEND_RO_STRING_LOC
|
select LOG_MSG_APPEND_RO_STRING_LOC
|
||||||
|
|
||||||
|
config LOG_BACKEND_IPC_SERVICE
|
||||||
|
bool "IPC service backend"
|
||||||
|
select LOG_MULTIDOMAIN_BACKEND
|
||||||
|
|
90
subsys/logging/backends/log_backend_ipc_service.c
Normal file
90
subsys/logging/backends/log_backend_ipc_service.c
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* 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_multidomain_helper.h>
|
||||||
|
#include <zephyr/logging/log_backend.h>
|
||||||
|
#include <zephyr/logging/log_ctrl.h>
|
||||||
|
|
||||||
|
struct log_backend_ipc_service {
|
||||||
|
struct ipc_ept ept;
|
||||||
|
struct log_multidomain_backend backend_remote;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void bound_cb(void *priv)
|
||||||
|
{
|
||||||
|
struct log_multidomain_backend *backend_remote = priv;
|
||||||
|
|
||||||
|
log_multidomain_backend_on_started(backend_remote, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void error_cb(const char *message, void *priv)
|
||||||
|
{
|
||||||
|
struct log_multidomain_backend *backend_remote = priv;
|
||||||
|
|
||||||
|
log_multidomain_backend_on_error(backend_remote, -EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void recv_cb(const void *data, size_t len, void *priv)
|
||||||
|
{
|
||||||
|
struct log_multidomain_backend *backend_remote = priv;
|
||||||
|
|
||||||
|
log_multidomain_backend_on_recv_cb(backend_remote, data, len);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int backend_ipc_service_send(struct log_multidomain_backend *backend_remote,
|
||||||
|
void *data, size_t len)
|
||||||
|
{
|
||||||
|
struct log_backend_ipc_service *backend_ipc_service =
|
||||||
|
CONTAINER_OF(backend_remote, struct log_backend_ipc_service, backend_remote);
|
||||||
|
int err = ipc_service_send(&backend_ipc_service->ept, data, len);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int backend_ipc_service_init(struct log_multidomain_backend *backend_remote)
|
||||||
|
{
|
||||||
|
struct log_backend_ipc_service *backend_ipc_service =
|
||||||
|
CONTAINER_OF(backend_remote, struct log_backend_ipc_service, backend_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 *)backend_remote;
|
||||||
|
err = ipc_service_open_instance(ipc_instance);
|
||||||
|
if (err < 0 && err != -EALREADY) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
err = ipc_service_register_endpoint(ipc_instance, &backend_ipc_service->ept, &ept_cfg);
|
||||||
|
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct log_multidomain_backend_transport_api log_backend_ipc_service_transport_api = {
|
||||||
|
.init = backend_ipc_service_init,
|
||||||
|
.send = backend_ipc_service_send
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct log_backend_ipc_service backend_ipc_service_data = {
|
||||||
|
.backend_remote = {
|
||||||
|
.transport_api = &log_backend_ipc_service_transport_api
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
LOG_BACKEND_DEFINE(backend_ipc_service,
|
||||||
|
log_multidomain_backend_api,
|
||||||
|
true,
|
||||||
|
&backend_ipc_service_data.backend_remote);
|
Loading…
Add table
Add a link
Reference in a new issue