Page tree
Skip to end of metadata
Go to start of metadata

Linux RPMsg framework 是在virtio framework上实现的一个消息传递机制,可以和远端处理器通信。它基于virtio vrings通过共享内存向远程CPU发送消息或从远程CPU接收消息。

vrings不是单向的,一个vring专用于发送到远程处理器的消息,另一个vring用于从远程处理器接收的消息。此外,可以在内存中创建共享缓冲区给本地和远端处理器来使用。

Mailbox framework将用于在共享缓冲区中等待新消息时通知核心。

基于这些框架,RPMsg框架实现了基于通道的通信。这些通道由文本名称标识,并具有本地(srouce)RPMsg地址和远程(destionation)RPMsg地址。

在远端处理器,还必须实现RPMSG框架。有几种解决方案,我们建议使用OpenAMP

OpenAMP wiki文档 

https://github.com/OpenAMP/open-amp/wiki/RPMsg-Messaging-Protocol

https://github.com/OpenAMP/open-amp/wiki/RPMsg-Communication-Flow


系统结构


  • remoteproc: remoteproc framework允许不同的平台/体系结构控制(打开电源,加载固件,关闭电源)远端处理器。该框架还为支持rpmsg协议的远程处理器添加了rpmsg virtio设备。更多详细介绍可以参考Linux remoteproc framework文档。
  • rpmsg: 一种基于virti的消息总线,允许内核驱动程序与系统上可用的远程处理器通信。它提供了消息传递基础结构,便于客户端驱动程序编写有线协议消息。然后,如果需要,客户机驱动程序可以依次公开适当的用户空间接口。
  • rpmsg_client_driver客户端驱动程序,它实现与远端处理器关联的服务。当远端处理器使用“新服务声明”RPMsg消息请求相关联服务时,RPMsg框架将探测此驱动程序。


RPMsg定义

要实现Rpmsg客户端,需要理解channel和endpoint概念,以便更好地理解框架。

  • RPMsg channel:

RPMsg客户端与主处理器和远端处理器之间的通信信道相关联。这个RPMsg客户端由注册在RPMsg框架中的文本服务名称标识。当注册的本地服务名称与公布的远程服务之间发现匹配时,将建立通信通道。

  • RPMsg endpoint:

RPMsg endpoint通过RPMsg通道提供逻辑连接。一个RPMsg endpoint具有唯一的源地址和相关的回调函数,允许用户在同一个通道上绑定多个端点。当客户端驱动程序使用本地地址创建endpoint时,所有具有与endpoint本地地址相同的目标地址的入站消息都将被路由到该endpoint。请注意,每个通道都有一个默认endpoint,这使得应用程序无需创建新endpoint就可以进行通信。


Linux kernel RPMsg文档中有用户API的描述

https://www.kernel.org/doc/Documentation/rpmsg.txt

  • No labels