243 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			243 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| 
								 | 
							
								# open-amp
							 | 
						||
| 
								 | 
							
								This repository is the home for the Open Asymmetric Multi Processing (OpenAMP)
							 | 
						||
| 
								 | 
							
								framework project. The OpenAMP framework provides software components that
							 | 
						||
| 
								 | 
							
								enable development of software applications for Asymmetric Multiprocessing
							 | 
						||
| 
								 | 
							
								(AMP) systems. The framework provides the following key capabilities.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								1. Provides Life Cycle Management, and Inter Processor Communication
							 | 
						||
| 
								 | 
							
								   capabilities for management of remote compute resources and their associated
							 | 
						||
| 
								 | 
							
								   software contexts.
							 | 
						||
| 
								 | 
							
								2. Provides a stand alone library usable with RTOS and Baremetal software
							 | 
						||
| 
								 | 
							
								   environments
							 | 
						||
| 
								 | 
							
								3. Compatibility with upstream Linux remoteproc and rpmsg components
							 | 
						||
| 
								 | 
							
								4. Following AMP configurations supported
							 | 
						||
| 
								 | 
							
									a. Linux master/Generic(Baremetal) remote
							 | 
						||
| 
								 | 
							
									b. Generic(Baremetal) master/Linux remote
							 | 
						||
| 
								 | 
							
								5. Proxy infrastructure and supplied demos showcase ability of proxy on master
							 | 
						||
| 
								 | 
							
								   to handle printf, scanf, open, close, read, write calls from Bare metal
							 | 
						||
| 
								 | 
							
								   based remote contexts.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## OpenAMP Source Structure
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								|- lib/
							 | 
						||
| 
								 | 
							
								|  |- common/     # common helper functions
							 | 
						||
| 
								 | 
							
								|  |- virtio/     # virtio implementation
							 | 
						||
| 
								 | 
							
								|  |- rpmsg/      # rpmsg implementation
							 | 
						||
| 
								 | 
							
								|  |- remoteproc/ # remoteproc implementation
							 | 
						||
| 
								 | 
							
								|  |  |- drivers  # remoteproc drivers
							 | 
						||
| 
								 | 
							
								|  |- proxy/      # implement one processor access device on the
							 | 
						||
| 
								 | 
							
								|  |              # other processor with file operations
							 | 
						||
| 
								 | 
							
								|- apps/        # demonstration/testing applications
							 | 
						||
| 
								 | 
							
								|  |- machine/  # common files for machine can be shared by applications
							 | 
						||
| 
								 | 
							
								|               # It is up to each app to decide whether to use these files.
							 | 
						||
| 
								 | 
							
								|  |- system/   # common files for system can be shared by applications
							 | 
						||
| 
								 | 
							
								|               # It is up to each app to decide whether to use these files.
							 | 
						||
| 
								 | 
							
								|- obsolete     # It is used to build libs which may also required when
							 | 
						||
| 
								 | 
							
								|               # building the apps. It will be removed in future since
							 | 
						||
| 
								 | 
							
								|               # user can specify which libs to use when compiling the apps.
							 | 
						||
| 
								 | 
							
								|- cmake        # CMake files
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								OpenAMP library libopen_amp is composed of the following directories in `lib/`:
							 | 
						||
| 
								 | 
							
								*   `common/`
							 | 
						||
| 
								 | 
							
								*   `virtio/`
							 | 
						||
| 
								 | 
							
								*   `rpmsg/`
							 | 
						||
| 
								 | 
							
								*   `remoteproc/`
							 | 
						||
| 
								 | 
							
								*   `proxy/`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								OpenAMP system/machine support has been moved to libmetal, the system/machine
							 | 
						||
| 
								 | 
							
								layer in the `apps/` directory is for system application initialization, and
							 | 
						||
| 
								 | 
							
								resource table definition.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### libmetal APIs used in OpenAMP
							 | 
						||
| 
								 | 
							
								Here are the libmetal APIs used by OpenAMP, if you want to port OpenAMP for your
							 | 
						||
| 
								 | 
							
								system, you will need to implement the following libmetal APIs in the libmetal's
							 | 
						||
| 
								 | 
							
								`lib/system/<SYS>` directory:
							 | 
						||
| 
								 | 
							
								* alloc, for memory allocation and memory free
							 | 
						||
| 
								 | 
							
								* cache, for flushing cache and invalidating cache
							 | 
						||
| 
								 | 
							
								* io, for memory mapping. OpenAMP required memory mapping in order to access
							 | 
						||
| 
								 | 
							
								  vrings and carved out memory.
							 | 
						||
| 
								 | 
							
								* irq, for IRQ handler registration, IRQ disable/enable and global IRQ handling.
							 | 
						||
| 
								 | 
							
								* mutex
							 | 
						||
| 
								 | 
							
								* shmem (For RTOS, you can usually use the implementation from
							 | 
						||
| 
								 | 
							
								  `lib/system/generic/`)
							 | 
						||
| 
								 | 
							
								* sleep, at the moment, OpenAMP only requires microseconds sleep as when OpenAMP
							 | 
						||
| 
								 | 
							
								  fails to get a buffer to send messages, it will call this function to sleep and
							 | 
						||
| 
								 | 
							
								  then try again.
							 | 
						||
| 
								 | 
							
								* time, for timestamp
							 | 
						||
| 
								 | 
							
								* init, for libmetal initialization.
							 | 
						||
| 
								 | 
							
								* atomic
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Please refer to `lib/system/generic` when you port libmetal for your system.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you a different compiler to GNU gcc, please refer to `lib/compiler/gcc/` to
							 | 
						||
| 
								 | 
							
								port libmetal for your compiler. At the moment, OpenAMP needs the atomic
							 | 
						||
| 
								 | 
							
								operations defined in `lib/compiler/gcc/atomic.h`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## OpenAMP Compilation
							 | 
						||
| 
								 | 
							
								OpenAMP uses CMake for library and demonstration application compilation.
							 | 
						||
| 
								 | 
							
								OpenAMP requires libmetal library. For now, you will need to download and
							 | 
						||
| 
								 | 
							
								compile libmetal library separately before you compiling OpenAMP library.
							 | 
						||
| 
								 | 
							
								In future, we will try to make libmetal as a submodule to OpenAMP to make this
							 | 
						||
| 
								 | 
							
								flow easier.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Example to compile OpenAMP for Zephyr
							 | 
						||
| 
								 | 
							
								You can compile OpenAMP library for Zephyr.
							 | 
						||
| 
								 | 
							
								As OpenAMP uses libmetal, please refer to libmetal README to build libmetal
							 | 
						||
| 
								 | 
							
								for Zephyr before building OpenAMP library for Zephyr.
							 | 
						||
| 
								 | 
							
								As Zephyr uses CMake, we build OpenAMP library as a target of Zephyr CMake
							 | 
						||
| 
								 | 
							
								project. Here is how to build libmetal for Zephyr:
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								    $ export ZEPHRY_GCC_VARIANT=zephyr
							 | 
						||
| 
								 | 
							
								    $ export ZEPHRY_SDK_INSTALL_DIR=<where Zephyr SDK is installed>
							 | 
						||
| 
								 | 
							
								    $ source <git_clone_zephyr_project_source_root>/zephyr-env.sh
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    $ cmake <OpenAMP_source_root> \
							 | 
						||
| 
								 | 
							
								      -DWITH_ZEPHYR=on -DBOARD=qemu_cortex_m3 \
							 | 
						||
| 
								 | 
							
								      -DCMAKE_INCLUDE_PATH="<libmetal_zephyr_build_dir>/lib/include" \
							 | 
						||
| 
								 | 
							
								      -DCMAKE_LIBRARY_PATH="<libmetal_zephyr_build_dir>/lib" \
							 | 
						||
| 
								 | 
							
								    $ make VERBOSE=1 all
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Example to compile OpenAMP for communication between Linux processes:
							 | 
						||
| 
								 | 
							
								* Install libsysfs devel and libhugetlbfs devel packages on your Linux host.
							 | 
						||
| 
								 | 
							
								* build libmetal library on your host as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								        $ mkdir -p build-libmetal
							 | 
						||
| 
								 | 
							
								        $ cd build-libmetal
							 | 
						||
| 
								 | 
							
								        $ cmake <libmetal_source>
							 | 
						||
| 
								 | 
							
								        $ make VERBOSE=1 DESTDIR=<libmetal_install> install
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* build OpenAMP library on your host as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $ mkdir -p build-openamp
							 | 
						||
| 
								 | 
							
								        $ cd build-openamp
							 | 
						||
| 
								 | 
							
								        $ cmake <openamp_source> -DCMAKE_INCLUDE_PATH=<libmetal_built_include_dir> \
							 | 
						||
| 
								 | 
							
								              -DCMAKE_LIBRARY_PATH=<libmetal_built_lib_dir> [-DWITH_APPS=ON]
							 | 
						||
| 
								 | 
							
								        $ make VERBOSE=1 DESTDIR=$(pwd) install
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The OpenAMP library will be generated to `build/usr/local/lib` directory,
							 | 
						||
| 
								 | 
							
								headers will be generated to `build/usr/local/include` directory, and the
							 | 
						||
| 
								 | 
							
								applications executable will be generated to `build/usr/local/bin`
							 | 
						||
| 
								 | 
							
								directory.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* cmake option `-DWITH_APPS=ON` is to build the demonstration applications.
							 | 
						||
| 
								 | 
							
								* If you have used `-DWITH_APPS=ON` to build the demos, you can try them on
							 | 
						||
| 
								 | 
							
								  your Linux host as follows:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								    # Start echo test server to wait for message to echo
							 | 
						||
| 
								 | 
							
								    $ sudo LD_LIBRARY_PATH=<openamp_built>/usr/local/lib:<libmetal_built>/usr/local/lib \
							 | 
						||
| 
								 | 
							
								       build/usr/local/bin/rpmsg-echo-shared
							 | 
						||
| 
								 | 
							
								    # Run echo test to send message to echo test server
							 | 
						||
| 
								 | 
							
								    $ sudo LD_LIBRARY_PATH=<openamp_built>/usr/local/lib:<libmetal_built>/usr/local/lib \
							 | 
						||
| 
								 | 
							
								       build/usr/local/bin/rpmsg-echo-ping-shared 1
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								###  Example to compile Zynq UltraScale+ MPSoC R5 generic(baremetal) remote:
							 | 
						||
| 
								 | 
							
								* build libmetal library on your host as follows:
							 | 
						||
| 
								 | 
							
								  * Create your on cmake toolchain file to compile libmetal for your generic
							 | 
						||
| 
								 | 
							
								    (baremetal) platform. Here is the example of the toolchain file:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								        set (CMAKE_SYSTEM_PROCESSOR "arm"              CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (MACHINE "zynqmp_r5" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        set (CROSS_PREFIX           "armr5-none-eabi-" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (CMAKE_C_FLAGS          "-mfloat-abi=soft -mcpu=cortex-r5 -Wall -Werror -Wextra \
							 | 
						||
| 
								 | 
							
								           -flto -Os -I/ws/xsdk/r5_0_bsp/psu_cortexr5_0/include" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_AR  "gcc-ar" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_C_ARCHIVE_FINISH   true)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        include (cross-generic-gcc)
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * Compile libmetal library:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								        $ mkdir -p build-libmetal
							 | 
						||
| 
								 | 
							
								        $ cd build-libmetal
							 | 
						||
| 
								 | 
							
								        $ cmake <libmetal_source> -DCMAKE_TOOLCHAIN_FILE=<toolchain_file>
							 | 
						||
| 
								 | 
							
								        $ make VERBOSE=1 DESTDIR=<libmetal_install> install
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								* build OpenAMP library on your host as follows:
							 | 
						||
| 
								 | 
							
								  * Create your on cmake toolchain file to compile openamp for your generic
							 | 
						||
| 
								 | 
							
								    (baremetal) platform. Here is the example of the toolchain file:
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								        set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (MACHINE                "zynqmp_r5" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (CROSS_PREFIX           "armr5-none-eabi-" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (CMAKE_C_FLAGS          "-mfloat-abi=soft -mcpu=cortex-r5 -Os -flto \
							 | 
						||
| 
								 | 
							
								          -I/ws/libmetal-r5-generic/usr/local/include \
							 | 
						||
| 
								 | 
							
								          -I/ws/xsdk/r5_0_bsp/psu_cortexr5_0/include" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (CMAKE_ASM_FLAGS        "-mfloat-abi=soft -mcpu=cortex-r5" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        set (PLATFORM_LIB_DEPS      "-lxil -lc -lm" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_AR  "gcc-ar" CACHE STRING "")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> qcs <TARGET> <LINK_FLAGS> <OBJECTS>")
							 | 
						||
| 
								 | 
							
								        SET(CMAKE_C_ARCHIVE_FINISH   true)
							 | 
						||
| 
								 | 
							
								        set (CMAKE_FIND_ROOT_PATH /ws/libmetal-r5-generic/usr/local/lib \
							 | 
						||
| 
								 | 
							
								            /ws/xsdk/r5_bsp/psu_cortexr5_0/lib )
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        include (cross_generic_gcc)
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  * We use cmake `find_path` and `find_library` to check if libmetal includes
							 | 
						||
| 
								 | 
							
								    and libmetal library is in the includes and library search paths. However,
							 | 
						||
| 
								 | 
							
								    for non-linux system, it doesn't work with `CMAKE_INCLUDE_PATH` and
							 | 
						||
| 
								 | 
							
								    `CMAKE_LIBRARY_PATH` variables, and thus, we need to specify those paths
							 | 
						||
| 
								 | 
							
								    in the toolchain file with `CMAKE_C_FLAGS` and `CMAKE_FIND_ROOT_PATH`.
							 | 
						||
| 
								 | 
							
								* Compile the OpenAMP library:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								    $ mkdir -p build-openamp
							 | 
						||
| 
								 | 
							
								    $ cd build-openamp
							 | 
						||
| 
								 | 
							
								    $ cmake <openamp_source> -DCMAKE_TOOLCHAIN_FILE=<toolchain_file>
							 | 
						||
| 
								 | 
							
								    $ make VERBOSE=1 DESTDIR=$(pwd) install
							 | 
						||
| 
								 | 
							
								    ```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								The OpenAMP library will be generated to `build/usr/local/lib` directory,
							 | 
						||
| 
								 | 
							
								headers will be generated to `build/usr/local/include` directory, and the
							 | 
						||
| 
								 | 
							
								applications executable will be generated to `build/usr/local/bin`
							 | 
						||
| 
								 | 
							
								directory.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								### Example to compile OpenAMP Linux Userspace for Zynq UltraScale+ MPSoC
							 | 
						||
| 
								 | 
							
								We can use yocto to build the OpenAMP Linux userspace library and application.
							 | 
						||
| 
								 | 
							
								open-amp and libmetal recipes are in this yocto layer:
							 | 
						||
| 
								 | 
							
								https://github.com/OpenAMP/meta-openamp
							 | 
						||
| 
								 | 
							
								* Add the `meta-openamp` layer to your layers in your yocto build project's `bblayers.conf` file.
							 | 
						||
| 
								 | 
							
								* Add `libmetal` and `open-amp` to your packages list. E.g. add `libmetal` and `open-amp` to the
							 | 
						||
| 
								 | 
							
								  `IMAGE_INSTALL_append` in the `local.conf` file.
							 | 
						||
| 
								 | 
							
								* You can also add OpenAMP demos Linux applications packages to your yocto packages list. OpenAMP
							 | 
						||
| 
								 | 
							
								  demo examples recipes are also in `meta-openamp`:
							 | 
						||
| 
								 | 
							
								  https://github.com/OpenAMP/meta-openamp/tree/master/recipes-openamp/openamp-examples
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								In order to user OpenAMP(RPMsg) in Linux userspace, you will need to have put the IPI device,
							 | 
						||
| 
								 | 
							
								  vring memory and shared buffer memory to your Linux kernel device tree. The device tree example
							 | 
						||
| 
								 | 
							
								  can be found here:
							 | 
						||
| 
								 | 
							
								  https://github.com/OpenAMP/open-amp/blob/master/apps/machine/zynqmp/openamp-linux-userspace.dtsi
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Supported System and Machines
							 | 
						||
| 
								 | 
							
								For now, it supports:
							 | 
						||
| 
								 | 
							
								* Zynq generic slave
							 | 
						||
| 
								 | 
							
								* Zynq UltraScale+ MPSoC R5 generic slave
							 | 
						||
| 
								 | 
							
								* Linux host OpenAMP between Linux userspace processes
							 | 
						||
| 
								 | 
							
								* Linux userspace OpenAMP RPMsg master
							 | 
						||
| 
								 | 
							
								* Linux userspace OpenAMP RPMsg slave
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Known Limitations:
							 | 
						||
| 
								 | 
							
								1. In case of OpenAMP on Linux userspace for inter processors communication,
							 | 
						||
| 
								 | 
							
								   it only supports static vrings and shared buffers.
							 | 
						||
| 
								 | 
							
								2. `sudo` is required to run the OpenAMP demos between Linux processes, as
							 | 
						||
| 
								 | 
							
								   it doesn't work on some systems if you are normal users.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								For using the framework please refer to the wiki of the OpenAMP repo.
							 | 
						||
| 
								 | 
							
								Subscribe to the open-amp mailing list at https://groups.google.com/group/open-amp.
							 |