ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法

ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法

  • ZYNQ UltraScale+ MPSoC与ZYNQ 7000架构比较
    • 目标
  • 一. 创建Linux
    • 1、修改kernel
    • 2、修改设备树
    • 编译&下载
  • 二、创建ThreadX工程
    • 1、ThreadX系统移植
    • ThreadX工程
  • 加载并启动RPU0
    • 加载RPU0代码
    • 启动RPU0
    • 关闭RPU0
  • 结束

ZYNQ UltraScale+ MPSoC与ZYNQ 7000架构比较

处理器 架构
ZYNQ 7000 双核ARM-Cortex A9 CPU
ZYNQ UltraScale+ MPSoC 四核ARM-Cortex A53 CPU、双核Cortex-R5 RPU、Mali-400 GPU(一个Geometry核,两个像素核)、PL逻辑以及视频编解码器Codec核

目标

  • A53上运行Linux ;
  • 在RPU0核也就是R5F的第一个核上运行ThreadX;
  • 系统启动后,Linux 加载RPU0并运行。

一. 创建Linux

在之前的文章中,介绍了使用Xilinx的git 库上的通用Linux源码编译了一个支持AMP的Linux,运行的FreeRTOS,本文也可以按照上面自己编译一个Linux,也可以取个巧通过PetaLinux生成Linux。本文计时通过PetaLinux完成Linux系统的生成的。

需要注意的两点:

1、修改kernel

我们需要Linux支持AMP,就需要在配置petalinux-config -c kernel的时候添加amp的支持。

[*] Enable loadable module support  --->

Device Drivers  --->
    Remoteproc drivers  --->
        [*] Support for Remote Processor subsystem
        <*>   ZynqMP_r5 remoteproc support

Rpmsg drivers  --->
    <*> RPMSG device interface

2、修改设备树

我们需要在设备树中,预留给RPU的RAM空间这里可以参考这里,因为这里仅仅开启了RPU0, 所以只用设置RPU0的部分。

注意:!!
需要注意的是APU以RPU不能同时访问同一个外设,此工程中RPU0访问的外设有UART0, IIC0,因为此工程使用的是黑金的ZU3EG,PS端仅仅接了uart0接口,所以APU端就通过ssh去访问系统,同时在设备树中禁止UART0、IIC0。
修改project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 如下

/include/ "system-conf.dtsi"
/ {
    reserved-memory {
        #address-cells = <2>;
        #size-cells = <2>;
        ranges;
        rproc_0_reserved: rproc@3ed00000 {
            no-map;
            reg = <0x0 0x3ed00000 0x0 0x1000000>;
        };
    };
  
    power-domains {
        pd_r5_0: pd_r5_0 {
            #power-domain-cells = <0x0>;
            pd-id = <0x7>;
        };

        pd_tcm_0_a: pd_tcm_0_a {
            #power-domain-cells = <0x0>;
            pd-id = <0xf>;
        };
        pd_tcm_0_b: pd_tcm_0_b {
            #power-domain-cells = <0x0>;
            pd-id = <0x10>;
        };
    };
  
    amba {/*您需要将固件内存指定为“mmio-sram”。*/
        r5_0_tcm_a: tcm@ffe00000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE00000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_a>;
        };
        r5_0_tcm_b: tcm@ffe20000 {
            compatible = "mmio-sram";
            reg = <0 0xFFE20000 0x0 0x10000>;
            pd-handle = <&pd_tcm_0_b>;
        };
        elf_ddr_0: ddr@3ed00000 {
            compatible = "mmio-sram";
            reg = <0 0x3ed00000 0x0 0x40000>;
        };
        test_r50: zynqmp_r5_rproc@0 {
            compatible = "xlnx,zynqmp-r5-remoteproc-1.0";
            reg = <0x0 0xff9a0100 0 0x100>, <0x0 0xff9a0000 0 0x100>;
            reg-names = "rpu_base","rpu_glbl_base";
            dma-ranges;
            core_conf = "split0";
            srams = <&r5_0_tcm_a &r5_0_tcm_b &elf_ddr_0>;
            pd-handle = <&pd_r5_0>;
            interrupt-parent = <&gic>;
            interrupts = <0 29 4>;
  
        } ; 
    };
};

&i2c1 {
	clock-frequency = <400000>;
	status = "disabled";
};

&uart0 {
    status = "disabled";
};

&i2c0 {
/*	clock-frequency = <400000>;*/
	status = "disabled";
};

/* SD */
&sdhci1 {
	disable-wp;
	no-1-8-v;
};
/* USB */
&dwc3_0 {
	status = "okay";
	dr_mode = "host";
};

编译&下载

通过petalinux-config -build 后,我们将系统通过jtag下载到板子上,当然也可以根据需求使用SD卡启动,这个需要在config中设置root filesystem type 为SD卡,此工程使用默认的INITRAMFS

petalinux-boot --jtag --u-boot --fpga

二、创建ThreadX工程

1、ThreadX系统移植

关于ThreadX的系统移植部分,可以参考这里,与ZYNQ7000的套路一样,但是需要注意的是,需要在库如tx库、nxd库、fx库中都要开启浮点fpv的支持:
在Properities->Settings->C/C++ Build->Miscellaneous中添加 -mfloat-abi=hard -mfpu=vfpv3-d16

别的套路都相同了,这里不再做介绍。

ThreadX工程

这个工程中就访问了IIC上的温度传感器:参考黑金手册 ZYNQ MPSoC 开发平台 VITIS 应用教程第六章即可。
ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法_第1张图片

注意的是在ld Available Memory Regions中,psu_r5_ddr_0_MEM_0的基地址和大小一定要与设备树中设置的一样:
ZYNQ UltraScale+ MPSoC Linux + ThreadX AMP玩法_第2张图片

加载并启动RPU0

启动好Linux后,我们在文件系统的\lib 下创建firmware文件夹,然后通过scp 将threadx.elf文件拷贝到\lib\firmware 文件夹。

加载RPU0代码

通过ssh 执行:

echo threadx.elf> /sys/class/remoteproc/remoteproc0/firmware

启动RPU0

echo start > /sys/class/remoteproc/remoteproc0/state

剩下的就是在串口中happy的查看温度信息了.

关闭RPU0

echo stop > /sys/class/remoteproc/remoteproc0/state

结束

你可能感兴趣的:(ThreadX,ZYNQ,ThreadX,AMP)