Zephyr API Documentation  3.0.0
A Scalable Open Source RTOS
3.0.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
mbox.h
Go to the documentation of this file.
1
7/*
8 * Copyright (c) 2021 Carlo Caione <ccaione@baylibre.com>
9 *
10 * SPDX-License-Identifier: Apache-2.0
11 */
12
13#ifndef ZEPHYR_INCLUDE_DRIVERS_MBOX_H_
14#define ZEPHYR_INCLUDE_DRIVERS_MBOX_H_
15
69#include <kernel.h>
70#include <device.h>
71
72#ifdef __cplusplus
73extern "C" {
74#endif
75
79struct mbox_msg {
81 const void *data;
82
84 size_t size;
85};
86
94 const struct device *dev;
95
98};
99
124#define MBOX_DT_CHANNEL_GET(node_id, name) \
125 { \
126 .dev = DEVICE_DT_GET(MBOX_DT_CTLR_BY_NAME(node_id, name)), \
127 .id = MBOX_DT_CHANNEL_ID_BY_NAME(node_id, name), \
128 }
129
157#define MBOX_DT_CTLR_BY_NAME(node_id, name) \
158 DT_PHANDLE_BY_NAME(node_id, mboxes, name)
159
194#define MBOX_DT_CHANNEL_ID_BY_NAME(node_id, name) \
195 DT_PHA_BY_NAME_OR(node_id, mboxes, name, channel, 0)
196
214typedef void (*mbox_callback_t)(const struct device *dev, uint32_t channel,
215 void *user_data, struct mbox_msg *data);
216
230typedef int (*mbox_send_t)(const struct device *dev, uint32_t channel,
231 const struct mbox_msg *msg);
232
240typedef int (*mbox_mtu_get_t)(const struct device *dev);
241
257typedef int (*mbox_register_callback_t)(const struct device *dev,
258 uint32_t channel,
260 void *user_data);
261
275typedef int (*mbox_set_enabled_t)(const struct device *dev, uint32_t channel, bool enable);
276
284typedef uint32_t (*mbox_max_channels_get_t)(const struct device *dev);
285
286__subsystem struct mbox_driver_api {
292};
293
306static inline void mbox_init_channel(struct mbox_channel *channel, const struct device *dev,
307 uint32_t ch_id)
308{
309 channel->dev = dev;
310 channel->id = ch_id;
311}
312
332__syscall int mbox_send(const struct mbox_channel *channel, const struct mbox_msg *msg);
333
334static inline int z_impl_mbox_send(const struct mbox_channel *channel, const struct mbox_msg *msg)
335{
336 const struct mbox_driver_api *api =
337 (const struct mbox_driver_api *)channel->dev->api;
338
339 if (api->send == NULL) {
340 return -ENOSYS;
341 }
342
343 return api->send(channel->dev, channel->id, msg);
344}
345
360static inline int mbox_register_callback(const struct mbox_channel *channel,
362 void *user_data)
363{
364 const struct mbox_driver_api *api =
365 (const struct mbox_driver_api *)channel->dev->api;
366
367 if (api->register_callback == NULL) {
368 return -ENOSYS;
369 }
370
371 return api->register_callback(channel->dev, channel->id, cb, user_data);
372}
373
393__syscall int mbox_mtu_get(const struct device *dev);
394
395static inline int z_impl_mbox_mtu_get(const struct device *dev)
396{
397 const struct mbox_driver_api *api =
398 (const struct mbox_driver_api *)dev->api;
399
400 if (api->mtu_get == NULL) {
401 return -ENOSYS;
402 }
403
404 return api->mtu_get(dev);
405}
406
430__syscall int mbox_set_enabled(const struct mbox_channel *channel, bool enable);
431
432static inline int z_impl_mbox_set_enabled(const struct mbox_channel *channel, bool enable)
433{
434 const struct mbox_driver_api *api =
435 (const struct mbox_driver_api *)channel->dev->api;
436
437 if (api->set_enabled == NULL) {
438 return -ENOSYS;
439 }
440
441 return api->set_enabled(channel->dev, channel->id, enable);
442}
443
454__syscall uint32_t mbox_max_channels_get(const struct device *dev);
455
456static inline uint32_t z_impl_mbox_max_channels_get(const struct device *dev)
457{
458 const struct mbox_driver_api *api =
459 (const struct mbox_driver_api *)dev->api;
460
461 if (api->max_channels_get == NULL) {
462 return -ENOSYS;
463 }
464
465 return api->max_channels_get(dev);
466}
467
468#ifdef __cplusplus
469}
470#endif
471
476#include <syscalls/mbox.h>
477
478#endif /* ZEPHYR_INCLUDE_DRIVERS_MBOX_H_ */
int(* mbox_register_callback_t)(const struct device *dev, uint32_t channel, mbox_callback_t cb, void *user_data)
Callback API upon registration.
Definition: mbox.h:257
int mbox_send(const struct mbox_channel *channel, const struct mbox_msg *msg)
Try to send a message over the MBOX device.
int(* mbox_send_t)(const struct device *dev, uint32_t channel, const struct mbox_msg *msg)
Callback API to send MBOX messages.
Definition: mbox.h:230
void(* mbox_callback_t)(const struct device *dev, uint32_t channel, void *user_data, struct mbox_msg *data)
Callback API for incoming MBOX messages.
Definition: mbox.h:214
int mbox_set_enabled(const struct mbox_channel *channel, bool enable)
Enable (disable) interrupts and callbacks for inbound channels.
int(* mbox_mtu_get_t)(const struct device *dev)
Callback API to get maximum data size.
Definition: mbox.h:240
static void mbox_init_channel(struct mbox_channel *channel, const struct device *dev, uint32_t ch_id)
Initialize a channel struct.
Definition: mbox.h:306
int mbox_mtu_get(const struct device *dev)
Return the maximum number of bytes possible in an outbound message.
int(* mbox_set_enabled_t)(const struct device *dev, uint32_t channel, bool enable)
Callback API upon enablement of interrupts.
Definition: mbox.h:275
uint32_t(* mbox_max_channels_get_t)(const struct device *dev)
Callback API to get maximum number of channels.
Definition: mbox.h:284
static int mbox_register_callback(const struct mbox_channel *channel, mbox_callback_t cb, void *user_data)
Register a callback function on a channel for incoming messages.
Definition: mbox.h:360
uint32_t mbox_max_channels_get(const struct device *dev)
Return the maximum number of channels.
#define ENOSYS
Definition: errno.h:83
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
Runtime device structure (in ROM) per driver instance.
Definition: device.h:450
const void * api
Definition: device.h:456
Provides a type to hold an MBOX channel.
Definition: mbox.h:92
uint32_t id
Definition: mbox.h:97
const struct device * dev
Definition: mbox.h:94
Definition: mbox.h:286
mbox_send_t send
Definition: mbox.h:287
mbox_mtu_get_t mtu_get
Definition: mbox.h:289
mbox_max_channels_get_t max_channels_get
Definition: mbox.h:290
mbox_register_callback_t register_callback
Definition: mbox.h:288
mbox_set_enabled_t set_enabled
Definition: mbox.h:291
Message struct (to hold data and its size).
Definition: mbox.h:79
size_t size
Definition: mbox.h:84
const void * data
Definition: mbox.h:81
static fdata_t data[2]
Definition: test_fifo_contexts.c:15
static void msg(uint64_t c64)
Definition: main.c:17
static const intptr_t user_data[5]
Definition: main.c:590