非petallinux操作的xilinx zynqmp openamp核间通信框架搭建核测试(APU :linux2021 + rpu1(裸机))

不使用petallinux构建apu核rpu之间的核间通信

一:首先需要在RPU中创建openamp裸机程序:居于openamp框架实现rpmag通信

打开vitis平台将xsa导入并创建平台工程,然后再平台工程中找到platform.spr文件并打开,可以看到平台添加的cpu核支持包:

首先需要在平台下面对应的芯片中,打开board support支持包(modify BSP setting),选中里面的lib库metallib,amplib库(注意图片截取的是1.6和2.4版本,实际opentest工程是用1.7openamp/2.4libmetal)

上述步骤操作完成后,

在芯片bsp下面的system.mss描述中出现下述lib描述添加:

BEGIN LIBRARY

 PARAMETER LIBRARY_NAME = openamp

 PARAMETER LIBRARY_VER = 1.7

 PARAMETER PROC_INSTANCE = psu_cortexr5_1

END

BEGIN LIBRARY

 PARAMETER LIBRARY_NAME = libmetal

 PARAMETER LIBRARY_VER = 2.4

 PARAMETER PROC_INSTANCE = psu_cortexr5_1

END

然后编译platform平台工程。

完成编译后,开始创建application程序,在vitis工具中file->new->application创建openamp的测试程序:选中r50,选中opentest工程创建即可。

二:内核设备树修改如下:

linux 内核设备树描述: 参考链接
//https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1896251596/OpenAMP+2021.1

/dts-v1/;
#include <dt-bindings/power/xilinx-zynqmp-power.h>
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
#include <dt-bindings/phy/phy.h>

/ {
    chosen {
        bootargs = "earlycon";
        stdout-path = "serial0:115200n8";
    };
    
    aliases {
        i2c0 = &i2c0;
        i2c1 = &i2c1;
        spi0 = &qspi;
        mmc0 = &sdhci0;
        serial0 = &uart0;
        serial1 = &uart1;
        ethernet0 = &gem1;
        // rtc0 = &rtc0;
        // nvmem0 = &eeprom;
    };
    
    memory@0 {
        device_type = "memory";
        reg = <0x00000000 0x00000000 0x00000000 0x7FF00000>, <0x00000008 0x00000000 0x00000001 0x80000000>;
    };

    gem_clk: psgrt_gem_clock {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <125000000>;
    };

    usb_clk: psgrt_usb_clock {
        compatible = "fixed-clock";
        #clock-cells = <0>;
        clock-frequency = <100000000>;
    };
    
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        
        global_reserved: global_reserved@0 {
            no-map;
            reg = <0x0 0x0 0x0 0x00800000>;            
        };

        rpu0vdev0vring0: rpu0vdev0vring0@800000 {
            no-map;
            reg = <0x0 0x00800000 0x0 0x100000>;
        };
        rpu0vdev0vring1: rpu0vdev0vring1@900000 {
            no-map;
            reg = <0x0 0x00900000 0x0 0x100000>;
        };        
        rpu0vdev0buffer: rpu0vdev0buffer@A00000 {
            no-map;
            reg = <0x0 0xA00000 0x0 0x200000>;
        };
        rpu0load: rpu0load@1000000 {
            no-map;
            reg = <0x0 0x01000000 0x0 0x800000>;
        };

        rpu1vdev0vring0: rpu1vdev0vring0@C00000 {
            no-map;
            reg = <0x0 0x00C00000 0x0 0x100000>;
        };
        rpu1vdev0vring1: rpu1vdev0vring1@D00000 {
            no-map;
            reg = <0x0 0x00D00000 0x0 0x100000>;
        };
        rpu1vdev0buffer: rpu1vdev0buffer@E00000 {
            no-map;
            reg = <0x0 0x00E00000 0x0 0x200000>;
        };
        rpu1load: rpu1load@1800000 {
            no-map;
	    reg = <0x0 0x30000000 0x0 0x8000000>;
        };

    };  

    tcm_0a: tcm_0a@ffe00000 {
        no-map;
        reg = <0x0 0xffe00000 0x0 0x10000>;
	phandle = <0x40>;
        status = "okay";
        compatible = "mmio-sram";
        power-domain = <&zynqmp_firmware PD_TCM_0_A>;
    };
 
    tcm_0b: tcm_0b@ffe20000 {
        no-map;
        reg = <0x0 0xffe20000 0x0 0x10000>;
		phandle = <0x41>;
        status = "okay";
        compatible = "mmio-sram";
        power-domain = <&zynqmp_firmware PD_TCM_0_B>;
    };
 
    tcm_1a: tcm_1a@ffe90000 {
        no-map;
        reg = <0x0 0xffe90000 0x0 0x10000>;
        phandle = <0x42>;
        status = "okay";
        compatible = "mmio-sram";
        power-domain = <&zynqmp_firmware PD_TCM_1_A>;
    };
 
    tcm_1b: tcm_1b@ffeb0000 {
        no-map;
        reg = <0x0 0xffeb0000 0x0 0x10000>;
        phandle = <0x43>;
        status = "okay";
        compatible = "mmio-sram";
        power-domain = <&zynqmp_firmware PD_TCM_1_B>;
    }; 
 
    zynqmp_ipi1 {
        compatible = "xlnx,zynqmp-ipi-mailbox";
        interrupt-parent = <&gic>;
        interrupts = <0 29 4>;
        xlnx,ipi-id = <7>;
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;
 
        /* APU<->RPU0 IPI mailbox controller */
        ipi_mailbox_rpu0: mailbox@ff990600 {
            reg = <0xff990600 0x20>,
                  <0xff990620 0x20>,
                  <0xff9900c0 0x20>,
                  <0xff9900e0 0x20>;
            reg-names = "local_request_region",
                    "local_response_region",
                    "remote_request_region",
                    "remote_response_region";
            #mbox-cells = <1>;
            xlnx,ipi-id = <1>;
        };
 
    };
 
    zynqmp_ipi2 {
        compatible = "xlnx,zynqmp-ipi-mailbox";
        interrupt-parent = <&gic>;
        interrupts = <0 30 4>;
        xlnx,ipi-id = <8>;
        #address-cells = <1>;
        #size-cells = <1>;
        ranges;
  
        /* APU<->RPU1 IPI mailbox controller */
        ipi_mailbox_rpu1: mailbox@ff990640 {
            reg = <0xff3f0b00 0x20>,
                  <0xff3f0b20 0x20>,
                  <0xff3f0940 0x20>,
                  <0xff3f0960 0x20>;
            reg-names = "local_request_region",
                    "local_response_region",
                    "remote_request_region",
                    "remote_response_region";
            #mbox-cells = <1>;
            xlnx,ipi-id = <2>;
        };
    };

    rf5ss: rf5ss@ff9a0000 {        
        status = "disable";
        compatible = "xlnx,zynqmp-r5-remoteproc";
        xlnx,cluster-mode = <1>;
        ranges;
        reg = <0x0 0xFF9A0000 0x0 0x10000>;

        #address-cells = <0x2>;
        #size-cells = <0x2>;
        // power-domain = <PD_RPU>;// 5.10版本
        power-domain = <&zynqmp_firmware PD_RPU>;// 5.15版本
     
        r5f_0: r5@0 {
            compatible = "xilinx,r5f";
            #address-cells = <2>;
            #size-cells = <2>;
            ranges;

            sram = <&tcm_0a>, <&tcm_0b>;
            memory-region = <&rpu0load>, <&rpu0vdev0buffer>, <&rpu0vdev0vring0>, <&rpu0vdev0vring1>;
            // power-domain = <PD_RPU_0>;// 5.10版本
            power-domain = <&zynqmp_firmware PD_RPU_0>;// 5.15版本
            mboxes = <&ipi_mailbox_rpu0 0>, <&ipi_mailbox_rpu0 1>;
            mbox-names = "tx", "rx";
			interrupt-parent = <&gic>;
       	 	interrupts = <0 29 4>;
       		xlnx,ipi-id = <7>;
        }; 
 
        r5f_1: r5@1 {
            compatible = "xilinx,r5f";
            #address-cells = <2>;
            #size-cells = <2>;
            ranges;
            sram = <&tcm_1a>, <&tcm_1b>,<&rshare_2_reserved>;
			memory-region = <&rpu1load>, <&rpu1vdev0buffer>, <&rpu1vdev0vring0>, <&rpu1vdev0vring1>;


                // power-domain = <PD_RPU_1>;// 5.10版本
            power-domain = <&zynqmp_firmware PD_RPU_1>;// 5.15版本
            mboxes = <&ipi_mailbox_rpu1 0>, <&ipi_mailbox_rpu1 1>;
            mbox-names = "tx", "rx";
			interrupt-parent = <&gic>;
       	 	interrupts = <0 30 4>;
       		xlnx,ipi-id = <8>;

        };

    };
};

三:根据上述设备树更改opentest工程适配:
1:更改rsc_table.c

#define RING_TX  0x800000//FW_RSC_U32_ADDR_ANY 对应设备树的rpu0vdev0vring0

#define RING_RX  0x900000//FW_RSC_U32_ADDR_ANY 对应设备树的rpu0vdev0vring1

2:更改platfoem_init.c的 共享地址:

  #define SHARED_MEM_PA  0xa00000UL  对应设备树中的rpu0vdev0buffer

3:更改platfoem_init.h的文件的ipi中断通道,如果默认是ch7就不需要更改:

#define IPI_CHN_BITMASK      0x0f000001 /* IPI channel bit mask for IPI from/to 

这个通道的mask需要更改为中断通道

并且修改rpmsg_echo.c产生的节点数:ECHO_NUM_EPTS  2 (默认为1)

4:在opentest的工程中lscript.ld修改resource_table核固件加载地址,以及bss

地址为固件加载地址的某一部分区域并且不能超出加载地址,属于预留部分存放这个table

.resource_table 0x30700000 : {   //指定放置在rpu0load中的某一个位置

. = ALIGN(4);

*(.resource_table)

} >  psu_r5_ddr_text_1_MEM_0

注意:以上所有地址在设备树中均有描述并且不能冲突!!!

四:内核配置和启动rpu固件

在内核需要开启rpmsg_char,rpmsg_core,rpmsg_bus驱动

CONFIG_REMOTEPROC=y

CONFIG_REMOTEPROC_CDEV=y

CONFIG_ZYNQMP_R5_REMOTEPROC=y

CONFIG_IPI_MAILBOX=y

# end of Remoteproc drivers

#

# Rpmsg drivers

#

CONFIG_RPMSG=y

CONFIG_RPMSG_CHAR=y

# CONFIG_RPMSG_QCOM_GLINK_RPM is not set

CONFIG_RPMSG_VIRTIO=y

# end of Rpmsg drivers

编译好内核和设备树,下载到板子,会有remoteproc节点产生,为加载rpu固件做准备:

使用echo opentest.elf > /sys/class/remoteproc/remoteproc0/firmware  加载固件到rpu0

使用echo start > /sys/class/remoteproc/remoteproc0/state  开启固件运行

如果运行程序后,没有出现下述类似log,此时/sys/bus/rpmsg/devices下只能看到:

就没办法通信,引起此问题:

1:可能是设备树配置不对,

2:或者上述地址修改部分不正确

3:设备树中ipi中断和ipi_mailbox地址设置不对等。

 virtio_rpmsg_bus virtio0: creating channel rpmsg-openamp-demo-channel addr 0x400
[   71.000069] virtio_rpmsg_bus virtio0: creating channel rpmsg-openamp-demo-channel1 addr 0x401

正确运行rpu后,在/sys/bus/rpmsg/devices下会产生节点,并且此时加载 modprobe rpmsg_char.ko才能在/dev下面看到rpmsg_ctrl节点。(因为内核配置已经设置为CONFIG_RPMSG_CHAR=y,所以不需要重新执行modprobe rpmsg_char.ko。并且需要更改apu测试程序echo_test关于modprobe rpmsg_char部分注释掉即可)

注意:如果rpu没有正确加载open_test,并创建endpoint节点的话。Apu直接加载modprobe rpmsg_char.ko也不会在在/dev下面看到rpmsg_ctrl节点

所以rpmsg的使用必须由rpu先正常创建rpmsg通道。

成功运行rpu程序后:可以在/sys/bus/rpmsg/devices下面看到节点信息:

运行apu的echo_test可以通信:

测试rpu1:

根据上述设备树和步骤修改rpu1的通信会有下述问题,可能是ipi_mailbox配置不对引发的。:

如果配置了rpu1中一下mboxes等属性后,rpu加载启动固件会引起ipi死机,导致挂掉:

如果按上图将设备树中配置的remoteproc。不注册rpu1的mailbox属性是可以运行到

但是此时没有办法中断通知apu创建channel通道,导致不能通信

排查确认:rpu1在设备树中配置的ipi_mailbox通道地址设置有问题需要更改为以下描述:
ipi_mailbox_rpu2: mailbox@ff990780 {    //内核源码中找到
            reg = <0xff990780 0x20>,
                  <0xff9907a0 0x20>,
                  <0xff9907c0 0x20>,
                  <0xff9905a0 0x20>;
            reg-names = "local_request_region",
            "local_response_region",
            "remote_request_region",
            "remote_response_region";
            #mbox-cells = <1>;
            xlnx,ipi-id = <2>;
          };

就可以配置rpu1工作了:

参考链接:

Echo_test.c下载

meta-openamp/recipes-openamp/rpmsg-examples/rpmsg-echo-test/echo_test.c at rel-v2019.1 · Xilinx/meta-openamp · GitHub

OpenAMP 2021.1 - Xilinx Wiki - Confluence (atlassian.net)

Loading FreeRTOS RPU firmware on VCK190 using remoteproc driver - Xilinx Wiki - Confluence (atlassian.net)

Debugging an OpenAMP Application • Libmetal and OpenAMP User Guide (UG1186) • 阅读器 • AMD 自适应计算文档门户 (xilinx.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/147011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Umeyama 算法之源码阅读与测试

Title: Umeyama 算法之源码阅读与测试 文章目录 前言I. Eigen 中 Umeyama 算法源码1. Eigen/src/Geometry/Umeyama.h 源码2. 代码测试 II. PCL 中 Umeyama 算法源码III. evo 中 Umeyama 算法源码1. evo/core/geometry.py 源码2. 代码测试 总结参考文献 [相关博文介绍] - 矩阵乘…

Python中的Random模块详解:生成随机数与高级应用

大家好&#xff0c;我是涛哥&#xff0c;今天为大家分享 Python中的Random模块详解&#xff0c;文章2800字&#xff0c;阅读大约10分钟&#xff0c;大家enjoy~~ 在Python编程中&#xff0c;随机数生成是许多应用的基础之一。random模块为我们提供了生成伪随机数的丰富工具&…

Vue dev-tools的安装

安装 Vue 开发者工具&#xff0c;装插件调试Vue应用 1.通过谷歌应用商店来进行安装&#xff08;国外网站&#xff09; 2.极简插件&#xff1a; 搜索 Vue -> 下载解压 -> 浏览器扩展模式打开&#xff0c;开发者模式 -> 将解压的CRX文件拖拽安装 -> 插件详情 &…

CSS特效010:文字颜色渐变的流光效果

查看专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS相关的库、…

学【Java多态】-- 写高质量代码

多态的实现条件 在java中要实现&#xff0c;必须要满足如下几个条件&#xff0c;缺一不可。 1.必须在继承体系下2.子类必须要对父类中的方法进行重写3.通过父类的引用调用冲写的方法。 想要真正的学好多态需要去学习一些前置知识&#xff0c;那我们直接开始吧&#xff01; …

LeetCode - 27. 移除元素 (C语言,快慢指针,配图)

思路一&#xff1a;新开辟一个数组&#xff0c;空间复杂度O(N) 因为本题要求是空间复杂度O(1),所以这里只是列出思路1的思路和配图&#xff0c;并没有具体的实现代码&#xff0c;想必这对大家一定很简单。 思路二&#xff1a;使用快慢指针&#xff0c;空间复杂度O(1)&#xff0…

Python编程-----网络通信

一.统一资源定位器URL 专为标识Internet网上资源位置而设的一种编址方式 ,URL一般由以下几个部分组成&#xff1a; 传输协议://主机IP地址(或域名地址)[:端口号]/资源所在路径和文件名 •传输协议是指访问该资源所使用的访问协议&#xff1b; •主机IP地址&#xff08;或域名…

WxJava微信公众号开发

文章目录 公众号的分类服务器配置一、WxJava介绍二、代码实现1.引入依赖2.添加微信公众号配置3.配置WxMpService1&#xff09;WxMpProperties2&#xff09;WxMpConfiguration3&#xff09;AbstractHandler4&#xff09;MsgHandler 4.接收消息Controller5.发送模板消息6.生成带参…

【CASS精品教程】打开cass提示base.dcl未找到文件的解决办法

打开cass 7.1时提示base.dcl未找到文件的解决办法。 文章目录 一、问题描述二、解决办法 一、问题描述 系统上安装了cad2006cass7.1&#xff0c;cass软件可以正常打开&#xff0c;但是在使用屏幕菜单绘制地图时&#xff0c;选择一个工具&#xff0c;提示base.dcl未找到文件&am…

从0到0.01入门 Webpack| 002.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CloudCompare 二次开发(21)——点云平面拟合

目录 一、概述二、代码集成三、结果展示本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、概述 由CloudCompare——点云平面拟合一文的实际操作知:CloudCompare软件中的已经集成了点云平面拟合功能,但是无法输出平面的标准方程。因此,本文在原有算法的基础上进行修改,…

C++二分查找算法:最大为 N 的数字组合

涉及知识点 二分查找 数学 题目 给定一个按 非递减顺序 排列的数字数组 digits 。你可以用任意次数 digits[i] 来写的数字。例如&#xff0c;如果 digits [‘1’,‘3’,‘5’]&#xff0c;我们可以写数字&#xff0c;如 ‘13’, ‘551’, 和 ‘1351315’。 返回 可以生成的…

Activiti工作流学习笔记(四)——工作流引擎中责任链模式的建立与应用原理

原创/朱季谦 本文需要一定责任链模式的基础与Activiti工作流知识&#xff0c;主要分成三部分讲解&#xff1a; 一、简单理解责任链模式概念二、Activiti工作流里责任链模式的建立三、Activiti工作流里责任链模式的应用 一、简单理解责任链模式概念 网上关于责任链模式的介绍…

科技驱动固定资产管理变革:RFID技术的前沿应用

在当今激烈竞争的商业环境中&#xff0c;企业固定资产管理面临挑战&#xff0c;而RFID技术正以其独特特性和功能性彻底改变资产管理方式。本文将深入探讨RFID技术在固定资产管理中的革命性作用&#xff0c;并解析其应用带来的创新和便利。 RFID技术概述&#xff1a; RFID系统作…

C/C++轻量级并发TCP服务器框架Zinx-框架开发002: 定义通道抽象类

文章目录 2 类图设计3 时序图数据输入处理&#xff1a;输出数据处理总流程 4 主要实现的功能4.1 kernel类&#xff1a;基于epoll调度所有通道4.2 通道抽象类&#xff1a;4.3 标准输入通道子类4.4 标准输出通道子类4.5 kernel和通道类的调用 5 代码设计5.1 框架头文件5.2 框架实…

20.2 设备树中的 platform 驱动编写

一、设备树下的 platform 驱动 platform 驱动框架分为总线、设备和驱动&#xff0c;总线不需要我们去管理&#xff0c;这个是 Linux 内核提供。在有了设备树的前提下&#xff0c;我们只需要实现 platform_driver 即可。 1. 修改 pinctrl-stm32.c 文件 先复习一下 pinctrl 子系…

从申请服务器到Docker部署Java项目至最后运行完结

目录 1.申请服务器篇 2.配置安全组篇 3.Docker安装篇 4.代码编写打包篇 目录结构 Maven Controller DockerFile 开始打包 5.所需文件上传及镜像构建篇 上传准备 上传jar包及DockerFile文件 指令构建 验证 6.镜像启动服务验证篇 启动镜像 使用云服务器地址进行…

一文讲清生产质量场景的数据分析思路及案例实战

今天&#xff0c;顺着制造业数据分析这个大主题&#xff0c;我们来讲讲质量管理数据分析。   说起质量管理&#xff0c;就是对所生产的产品质量进行管理&#xff0c;其最终目的就是保证客户收到的产品质量&#xff0c;提高客户满意度&#xff0c;减少退货和维修的数量。质量管…

QGIS之十六过滤器选择要素导出

效果 步骤 1、准备数据 下面这份数据是中国范围内的市级行政区划范围 2、打开表格 3、选择要素 方法1 从图上能看到选中的图形 方法2 4、导出

[文件读取]GoCD 任意文件读取漏洞 (CVE-2021-43287)

1.1漏洞描述 漏洞编号CVE-2021-43287漏洞类型文件读取漏洞等级⭐⭐漏洞环境VULFOCUS攻击方式 描述: GoCD 一款先进的持续集成和发布管理系统,由ThoughtWorks开发。&#xff08;不要和Google的编程语言Go混淆了&#xff01;&#xff09;其前身为CruiseControl,是ThoughtWorks在…