110 lines
4.0 KiB
Markdown
110 lines
4.0 KiB
Markdown
# RPMsg Design Document
|
|
RPMsg is a framework to allow communication between two processors.
|
|
RPMsg implementation in OpenAMP library is based on virtio. It complies
|
|
the RPMsg Linux kernel implementation. It defines the handshaking on
|
|
setting up and tearing down the communication between applicaitons
|
|
running on two processors.
|
|
|
|
## RPMsg User API Flow Chats
|
|
### RPMsg Static Endpoint
|
|

|
|
### Binding Endpoint Dynamically with Name Service
|
|

|
|
### Creating Endpoint Dynamically with Name Service
|
|

|
|
|
|
## RPMsg User APIs
|
|
* RPMsg virtio master to initialize the shared buffers pool(RPMsg virtio slave
|
|
doesn't need to use this API):
|
|
```
|
|
void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool,
|
|
void *shbuf, size_t size)
|
|
```
|
|
* Initialize RPMsg virtio device:
|
|
```
|
|
int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev,
|
|
struct virtio_device *vdev,
|
|
rpmsg_ns_bind_cb ns_bind_cb,
|
|
struct metal_io_region *shm_io,
|
|
struct rpmsg_virtio_shm_pool *shpool)
|
|
```
|
|
* Deinitialize RPMsg virtio device:
|
|
```
|
|
void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)`
|
|
```
|
|
* Get RPMsg device from RPMsg virtio device:
|
|
```
|
|
struct rpmsg_device *rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev)
|
|
```
|
|
* Create RPMsg endpoint:
|
|
```
|
|
int rpmsg_create_ept(struct rpmsg_endpoint *ept,
|
|
struct rpmsg_device *rdev,
|
|
const char *name, uint32_t src, uint32_t dest,
|
|
rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb)
|
|
```
|
|
* Destroy RPMsg endpoint:
|
|
```
|
|
void rpmsg_destroy_ept(struct rpsmg_endpoint *ept)
|
|
```
|
|
* Check if the local RPMsg endpoint is binded to the remote, and ready to send
|
|
message:
|
|
```
|
|
int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept)
|
|
```
|
|
* Send message with RPMsg endpoint default binding:
|
|
```
|
|
int rpmsg_send(struct rpmsg_endpoint *ept, const void *data, int len)
|
|
```
|
|
* Send message with RPMsg endpoint, specify destination address:
|
|
```
|
|
int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len,
|
|
uint32_t dst)
|
|
```
|
|
* Send message with RPMsg endpoint using explicit source and destination
|
|
addresses:
|
|
```
|
|
int rpmsg_send_offchannel(struct rpmsg_endpoint *ept,
|
|
uint32_t src, uint32_t dst,
|
|
const void *data, int len)
|
|
```
|
|
* Try to send message with RPMsg endpoint default binding, if no buffer
|
|
available, returns:
|
|
```
|
|
int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data,
|
|
int len)
|
|
```
|
|
* Try to send message with RPMsg endpoint, specify destination address,
|
|
if no buffer available, returns:
|
|
```
|
|
int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len,
|
|
uint32_t dst)
|
|
```
|
|
* Try to send message with RPMsg endpoint using explicit source and destination
|
|
addresses, if no buffer available, returns:
|
|
```
|
|
int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept,
|
|
uint32_t src, uint32_t dst,
|
|
const void *data, int len)`
|
|
```
|
|
## RPMsg User Defined Callbacks
|
|
* RPMsg endpoint message received callback:
|
|
```
|
|
int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data,
|
|
size_t len, uint32_t src, void *priv)
|
|
```
|
|
* RPMsg name service binding callback. If user defines such callback, when
|
|
there is a name service announcement arrives, if there is no registered
|
|
endpoint found to bind to this name service, it will call this callback.
|
|
If this callback is not defined, it will drop this name service.:
|
|
```
|
|
void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev,
|
|
const char *name, uint32_t dest)
|
|
```
|
|
* RPMsg endpoint name service unbind callback. If user defines such callback,
|
|
when there is name service destroy arrives, it will call this callback to
|
|
notify the user application about the remote has destroyed the service.:
|
|
```
|
|
void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept)
|
|
```
|