diff --git a/subsys/logging/CMakeLists.txt b/subsys/logging/CMakeLists.txt index 3591f345281..d5fe5e83bf6 100644 --- a/subsys/logging/CMakeLists.txt +++ b/subsys/logging/CMakeLists.txt @@ -70,7 +70,6 @@ if(NOT CONFIG_LOG_MODE_MINIMAL) log_multidomain_link.c ) - endif() else() zephyr_sources(log_minimal.c) diff --git a/subsys/logging/backends/CMakeLists.txt b/subsys/logging/backends/CMakeLists.txt index 149e3f53c2f..31ba0f4da47 100644 --- a/subsys/logging/backends/CMakeLists.txt +++ b/subsys/logging/backends/CMakeLists.txt @@ -69,3 +69,8 @@ zephyr_sources_ifdef( CONFIG_LOG_MULTIDOMAIN_BACKEND log_multidomain_backend.c ) + +zephyr_sources_ifdef( + CONFIG_LOG_BACKEND_IPC_SERVICE + log_backend_ipc_service.c +) diff --git a/subsys/logging/backends/Kconfig.multidomain b/subsys/logging/backends/Kconfig.multidomain index 8f6dc2565aa..c14ea3ffa7a 100644 --- a/subsys/logging/backends/Kconfig.multidomain +++ b/subsys/logging/backends/Kconfig.multidomain @@ -5,3 +5,7 @@ config LOG_MULTIDOMAIN_BACKEND bool select LOG_TIMESTAMP_64BIT select LOG_MSG_APPEND_RO_STRING_LOC + +config LOG_BACKEND_IPC_SERVICE + bool "IPC service backend" + select LOG_MULTIDOMAIN_BACKEND diff --git a/subsys/logging/backends/log_backend_ipc_service.c b/subsys/logging/backends/log_backend_ipc_service.c new file mode 100644 index 00000000000..4b4fbb5999b --- /dev/null +++ b/subsys/logging/backends/log_backend_ipc_service.c @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2021 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include +#include +#include + +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);