/* * Copyright (c) 2021 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include 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; }