Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions components/drivers/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ rsource "led/Kconfig"
rsource "input/Kconfig"
rsource "mailbox/Kconfig"
rsource "hwspinlock/Kconfig"
rsource "rpmsg/Kconfig"
rsource "phye/Kconfig"
rsource "ata/Kconfig"
rsource "nvme/Kconfig"
Expand Down
142 changes: 142 additions & 0 deletions components/drivers/include/drivers/rpmsg.h
Original file line number Diff line number Diff line change
@@ -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__ */
4 changes: 4 additions & 0 deletions components/drivers/include/rtdevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,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 */
Expand Down
26 changes: 26 additions & 0 deletions components/drivers/rpmsg/Kconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
menuconfig RT_USING_RPMSG
bool "Using Remote Processor Messaging (RPMSG)"
select RT_USING_DEVICE_IPC
select RT_USING_SYSTEM_WORKQUEUE
default n

config RT_RPMSG_CHAR_MSG_MAX
int "Char device message receive max"
depends on RT_USING_RPMSG
default 64

config RT_RPMSG_CHAR_MSG_SIZE_MAX
int "Char device message size max"
depends on RT_USING_RPMSG
default 256

config RT_RPMSG_RT_THREAD_VIRTIO
bool "RT-Thread common VirtIO RPMSG"
depends on RT_USING_RPMSG
depends on RT_USING_MBOX
select RT_USING_SLAB
default y

if RT_USING_RPMSG
osource "$(SOC_DM_RPMSG_DIR)/Kconfig"
endif
18 changes: 18 additions & 0 deletions components/drivers/rpmsg/SConscript
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from building import *

group = []

if not GetDepend(['RT_USING_RPMSG']):
Return('group')

cwd = GetCurrentDir()
CPPPATH = [cwd + '/../include']

src = ['rpmsg.c', 'rpmsg_char.c', 'rpmsg_ns.c']

if GetDepend(['RT_RPMSG_RT_THREAD_VIRTIO']):
src += ['rpmsg-rt-thread-virtio.c']

group = DefineGroup('DeviceDrivers', src, depend = [''], CPPPATH = CPPPATH)

Return('group')
Loading
Loading