RPMsg,VirtIO和remoteproc是Linux上提供的通信方法,OpenAMP是在裸机或者各种RTOS里面提供的,在Vivado不用说就是FreeRTOS了,实际通信机制,可以不经由内核用户空间.
如何写一套OpenAMP程序:
- 准备固件资源表(Firmware Resource Table).
- 创建Remoteproc结构.
- 定义RPMsg回调函数.
- 创建RPMsg Virtio设备.
- 创建RPMsg端点,并绑定回调函数.
- 使用rpmsg_send发送数据.
- 各种发送接收生生不息.
不管学什么,我都习惯先体验下功能再学,但是我并没有指定的开发板,但是难不倒我的,不过第一步是启动Vivado,毕竟需要修改他的工程并生成合适的SDK,找到自己最接近的硬件开始,比如我选ZC702,比如他4个LED位置与我是不一样的,也要在xdc约束中修改,他所用内存与我不同,也要修改,就连器件他是7020我是7010也要修改.
根据手册创建例子,并根据手册上说的,决定是否使用WITH_PROXY.
由于我们用的是双A9,因此也要添加定义-DUSE_AMP=1.
最后我还修改了一下ld文件,毕竟我内存没那么大.
先把创建一份以BSP为样本的,然后继续修改.
petalinux-create -t project --template zynq -n tl-7010
cp ~/Downloads/xilinx-zc702-2018.3/hardware/xilinx-zc702-2018.3/xilinx-zc702-2018.3.sdk/system.hdf .
petalinux-config --get-hw-description=.
然后进入后创建一个app.
taterli@taterli-VirtualBox:~/tl-7010/components$ mkdir apps
taterli@taterli-VirtualBox:~/tl-7010/components$ cd apps/
taterli@taterli-VirtualBox:~/tl-7010/components/apps$
taterli@taterli-VirtualBox:~/tl-7010/components/apps$ petalinux-create -t apps --template install -n echo-test --enable
INFO: Create apps: echo-test
INFO: New apps successfully created in /home/taterli/tl-7010/project-spec/meta-user/recipes-apps/echo-test
INFO: Enabling created component...
INFO: sourcing bitbake
把编译的elf复制到配方目录里.
taterli@taterli-VirtualBox:~/tl-7010/project-spec/meta-user/recipes-apps/echo-test/files$ cp ~/Downloads/xilinx-zc702-2018.3/hardware/xilinx-zc702-2018.3/xilinx-zc702-2018.3.sdk/echo-test/Debug/echo-test.elf .
返回到上级目录修改配方配置bb文件,参考修改.
#
# This file is the echo-test recipe.
#
SUMMARY = "Simple echo-test application"
SECTION = "PETALINUX/apps"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
SRC_URI = "file://echo-test.elf \
"
S = "${WORKDIR}"
INSANE_SKIP_${PN} = "arch"
do_install() {
install -d ${D}/lib/firmware
install -m 0644 ${S}/echo-test.elf ${D}/lib/firmware/echo-test.elf
}
FILES_${PN} = "/lib/firmware/echo-test.elf"
打开rpmsg支持:
petalinux-config -c kernel
Device Drivers --->
Remoteproc drivers --->
<M> Support ZYNQ remoteproc
打包rootfs上的支持.
petalinux-config -c rootfs
Filesystem Packages --->
-> Petalinux Package Groups
-> packagegroup-petalinux-openamp
如果并不想自己编译更多例子也可以直接在rootfs配置中包含.
Filesystem Packages --->
misc --->
openamp-fw-echo-testd --->
[*] openamp-fw-echo-testd
openamp-fw-mat-muld --->
[*] openamp-fw-mat-muld
openamp-fw-rpc-demo --->
[*] openamp-fw-rpc-demo
BSP包含了简单的例子.
路径:/home/taterli/Downloads/xilinx-zc702-2018.3/project-spec/meta-user/recipes-bsp/device-tree/files/openamp.dtsi
我们乞丐板只有512M内存,因此也要稍微修改.
/ {
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
rproc_0_reserved: rproc@1e000000 {
no-map;
reg = <0x1e000000 0x01000000>;
};
};
amba {
elf_ddr_0: ddr@0 {
compatible = "mmio-sram";
reg = <0x1e000000 0x400000>;
};
};
remoteproc0: remoteproc@0 {
compatible = "xlnx,zynq_remoteproc";
firmware = "firmware";
vring0 = <15>;
vring1 = <14>;
srams = <&elf_ddr_0>;
};
};
万事俱备,开始构建:
petalinux-build
吐槽:真心只有这个时候能体验到多核CPU的威力,平时全都是打酱油,特别是Vivado综合时候根本就喂不饱CPU.
在5950X的加持下,不到2分钟就完成了编译,编译结果在image/linux目录内,至于怎么下载应该不用多说吧,然后执行测试一下.
modprobe zynq_remoteproc
echo echo-test.elf > /sys/class/remoteproc/remoteproc0/firmware
echo start > /sys/class/remoteproc/remoteproc0/state
modprobe rpmsg_user_dev_driver
echo_test
测试结果:
打扰下,请问你那边接受一些openamp的定制化外包吗?如有意麻烦联系13914933054,谢谢
@mingwei_huang 现在还需要定制化的外包么?随时可以联系。
@mingwei_huang 联系18500132412,WX同号