summaryrefslogtreecommitdiff
path: root/components/drivers/include
diff options
context:
space:
mode:
authorGuEe-GUI <[email protected]>2026-05-09 13:30:10 +0800
committerRbb666 <[email protected]>2026-05-11 14:09:04 +0800
commit46b90df24764133ab0629072bc7d63bee35d024f (patch)
tree58ed5b974020ae5700f2b040044f5c3d34d4a84f /components/drivers/include
parentecf2409904bc3b2c081de7c98042d38bfc6eb95d (diff)
[dm][rpmsg] support Remote Processor Messaging (RPMSG)
Signed-off-by: GuEe-GUI <[email protected]>
Diffstat (limited to 'components/drivers/include')
-rwxr-xr-xcomponents/drivers/include/drivers/rpmsg.h142
-rw-r--r--components/drivers/include/rtdevice.h4
2 files changed, 146 insertions, 0 deletions
diff --git a/components/drivers/include/drivers/rpmsg.h b/components/drivers/include/drivers/rpmsg.h
new file mode 100755
index 0000000000..e44dfc7537
--- /dev/null
+++ b/components/drivers/include/drivers/rpmsg.h
@@ -0,0 +1,142 @@
+/*
+ * Copyright (c) 2006-2023, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2023-02-25 GuEe-GUI the first version
+ */
+
+#ifndef __RPMSG_H__
+#define __RPMSG_H__
+
+#include <rthw.h>
+#include <rtthread.h>
+
+#include <drivers/core/dm.h>
+#include <drivers/core/driver.h>
+#include <drivers/byteorder.h>
+
+#define RT_DEVICE_CTRL_RPMSG_CREATE_EPT (RT_DEVICE_CTRL_BASE(Char) + 'R' + 1)
+#define RT_DEVICE_CTRL_RPMSG_DESTROY_EPT (RT_DEVICE_CTRL_BASE(Char) + 'R' + 2)
+#define RT_DEVICE_CTRL_RPMSG_DATA_OVERWRITE (RT_DEVICE_CTRL_BASE(Char) + 'R' + 3)
+
+struct rt_rpmsg_device_id
+{
+#define RT_RPMSG_NAME_SIZE 32
+ char name[RT_RPMSG_NAME_SIZE];
+
+ const void *data;
+};
+
+struct rt_rpmsg_ops;
+struct rt_rpmsg_endpoint;
+struct rt_rpmsg_endpoint_info;
+
+struct rt_rpmsg_device
+{
+ struct rt_device parent;
+
+ struct rt_rpmsg_device_id id;
+ rt_list_t ept_nodes;
+ struct rt_spinlock lock;
+
+ const struct rt_rpmsg_ops *ops;
+ void *priv;
+};
+
+struct rt_rpmsg_driver
+{
+ struct rt_driver parent;
+
+ const struct rt_rpmsg_device_id *ids;
+
+ rt_err_t (*probe)(struct rt_rpmsg_device *rdev);
+ rt_err_t (*remove)(struct rt_rpmsg_device *rdev);
+ rt_err_t (*rx_callback)(struct rt_rpmsg_device *rdev,
+ rt_uint32_t src, void *data, rt_size_t len);
+};
+
+typedef rt_err_t (*rt_rpmsg_rx_callback)(struct rt_rpmsg_device *rdev,
+ rt_uint32_t src, void *data, rt_size_t len);
+
+struct rt_rpmsg_ops
+{
+ rt_err_t (*create_endpoint)(struct rt_rpmsg_device *, struct rt_rpmsg_endpoint *,
+ struct rt_rpmsg_endpoint_info *info);
+ rt_err_t (*destroy_endpoint)(struct rt_rpmsg_device *, struct rt_rpmsg_endpoint *);
+ rt_err_t (*send)(struct rt_rpmsg_device *, rt_uint32_t src, rt_uint32_t dst,
+ const void *data, rt_size_t len, rt_int32_t timeout);
+};
+
+struct rt_rpmsg_endpoint_info
+{
+ char name[RT_RPMSG_NAME_SIZE];
+
+#define RT_RPMSG_ADDR_ANY 0xffffffff
+ rt_uint32_t src;
+ rt_uint32_t dst;
+};
+
+struct rt_rpmsg_endpoint
+{
+ rt_list_t list;
+ struct rt_rpmsg_device *rdev;
+
+ struct rt_rpmsg_endpoint_info info;
+ rt_rpmsg_rx_callback rx_callback;
+
+ struct rt_spinlock lock;
+ void *sysdata;
+ void *priv;
+};
+
+enum rt_rpmsg_ns_flags
+{
+ RT_RPMSG_NS_CREATE = 0,
+ RT_RPMSG_NS_DESTROY = 1,
+};
+
+rt_packed(struct rt_rpmsg_ns_msg
+{
+ char name[RT_RPMSG_NAME_SIZE];
+
+#define RT_RPMSG_NS_ADDR 0x35 /* 0x35 -> 53 */
+ rt_uint32_t addr;
+ rt_uint32_t flags;
+});
+
+enum
+{
+ RT_RPMSG_MODE_MASTER,
+ RT_RPMSG_MODE_SLAVE,
+
+ RT_RPMSG_MODE_MAX,
+};
+
+rt_uint32_t rt_rpmsg_mode(void);
+
+struct rt_rpmsg_endpoint *rt_rpmsg_create_endpoint(struct rt_rpmsg_device *,
+ struct rt_rpmsg_endpoint_info *info, rt_rpmsg_rx_callback rx_cb);
+rt_err_t rt_rpmsg_destroy_endpoint(struct rt_rpmsg_device *,
+ struct rt_rpmsg_endpoint *);
+struct rt_rpmsg_endpoint *rt_rpmsg_find_endpoint(struct rt_rpmsg_device *,
+ struct rt_rpmsg_endpoint_info *info);
+
+rt_err_t rt_rpmsg_send(struct rt_rpmsg_endpoint *,
+ const void *data, rt_size_t len);
+rt_err_t rt_rpmsg_sendto(struct rt_rpmsg_endpoint *, rt_uint32_t dst,
+ const void *data, rt_size_t len);
+
+rt_err_t rt_rpmsg_send_wait(struct rt_rpmsg_endpoint *,
+ const void *data, rt_size_t len, rt_int32_t timeout);
+rt_err_t rt_rpmsg_sendto_wait(struct rt_rpmsg_endpoint *, rt_uint32_t dst,
+ const void *data, rt_size_t len, rt_int32_t timeout);
+
+rt_err_t rt_rpmsg_driver_register(struct rt_rpmsg_driver *rdrv);
+rt_err_t rt_rpmsg_device_register(struct rt_rpmsg_device *rdev);
+
+#define RT_RPMSG_DRIVER_EXPORT(driver) RT_DRIVER_EXPORT(driver, rpmsg, BUILIN)
+
+#endif /* __RPMSG_H__ */
diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h
index d83311bcf9..3d5aa23c44 100644
--- a/components/drivers/include/rtdevice.h
+++ b/components/drivers/include/rtdevice.h
@@ -79,6 +79,10 @@ extern "C" {
#include "drivers/hwspinlock.h"
#endif /* RT_USING_HWSPINLOCK */
+#ifdef RT_USING_RPMSG
+#include "drivers/rpmsg.h"
+#endif /* RT_USING_RPMSG */
+
#ifdef RT_USING_BLK
#include "drivers/blk.h"
#endif /* RT_USING_BLK */