RPMsg


RPMsg is a protocol enabling inter-processor communication inside multi-core processors.

Background

Modern SoCs usually employ heterogeneous processors in Asymmetric multiprocessing configurations, each of which may be running a different instance of an Operating system. Typically, SoCs have a central multi-core processor running a high-level OS, such as Linux, in a Symmetric multiprocessing configuration, and additional remote processors running various flavors of a Real-time operating system. These remote processors are often used to offload CPU-intensive tasks from the main application processor, or to access hardware blocks otherwise inaccessible by the central processor. RPMsg facilitates communication between the various processors in the system, by providing means of sending inter-processor messages back and forth.

Implementations

RPMsg is present in the Linux kernel, has been demonstrated in Zephyr (operating system), FreeRTOS, Cadence XOS, ThreadX, QNX and is also available as a stand-alone component for microcontroller-based systems. Most of the RPMsg implementations are developed as open-source.

History

RPMsg was developed for the Linux kernel by Ohad Ben-Cohen of and was merged to Linux 3.4 on 20 May 2012. It was first used by Google, in Android [Ice Cream Sandwich], on the Galaxy Nexus phone, to enable offloading of cpu-intensive multimedia tasks on the OMAP4: from the ARM Cortex-A9 cores, running the Linux Kernel, to the ARM Cortex-M3 cores, running the TI-RTOS OS. Several semiconductor companies have since added support for RPMsg, including Texas Instruments, STMicroelectronics, Xilinx, NXP Semiconductors, Renesas Electronics and Nordic Semiconductor.

User-space access

RPMsg provides a basic framework for sending framed messages between heterogenous processors, but a higher level driver is required to expose RPMsg functionality to user space in a useful way. Some of these drivers are mainlined in the Linux kernel, others are provided in a SoC vendor's kernel fork, and yet others are available out of tree.
Driver NameDescriptionKernel ForkOfficial website
imx_rpmsg_ttyExposes an RPMsg endpoint as a virtual TTY at /dev/ttyRPMSGx. Can be used wherever a serial-like connection is desirable.linux-imx
rpmsg_charExposes an RPMsg endpoint as a character device at/dev/rpmsgX, allowing a userspace applications to send and receive raw RPMsg packets via standard file I/O operations.mainlineN/A
rpmsg_ctrlExposes a control interface at /dev/rpmsg_ctrlX that allows RPMsg endpoints to be created by user-space applications.mainlineN/A
rpmsg-netExposes an RPMsg endpoint as a virtual Ethernet network interface named rpmsgX. Can be used to connect the two CPUs using at layer 2 and above.out of tree
rpmsg-sysfsExposes rpmsg bus control primitives to userspace via sysfs.out of tree