【Zynq】PetaLinux 2019.2裸机配置OpenAMP

OpenAMP 开源的核间通讯框架,这里运行 FreeRTOS(裸机) 与 Linux 通讯。

官方参考地址:Libmetal and OpenAMP User Guideopenamp

第三方参考:Zynq7000 OPENAMP 实验

PetaLinux 设置

  1. 配置 rootfs

    1
    petalinux-config -c rootfs

    启用相关组件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Filesystem Packages--->
    misc --->
    sysfsutils --->
    [*] libsysfs
    openamp-fw-echo-testd --->
    [*] openamp-fw-echo-testd
    openamp-fw-mat-muld --->
    [*] openamp-fw-mat-muld
    openamp-fw-rpc-demo --->
    [*] openamp-fw-rpc-demo
    libs --->
    libmetal--->
    [*] libmetal
    Petalinux Package Groups --->
    packagegroup-petalinux-openamp --->
    [*] packagegroup-petalinux-openamp

    相关Linux端测试例程地址

    保存退出

  2. 配置设备树

    编辑 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi,添加如下内容

    固件地址:992MB 偏移处,长度 4MB

    共享内存地址:1000MB 偏移处,长度 1MB

    如果使用大于 2019.2 版本,则需要添加 interrupt-parent = <&intc>;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    / {
    reserved-memory {
    #address-cells = <1>;
    #size-cells = <1>;
    ranges;
    rproc_0_reserved: rproc@3e000000 {
    no-map;
    reg = <0x3e000000 0x400000>;
    };
    rproc_0_dma: rproc@3e800000 {
    no-map;
    compatible = "shared-dma-pool";
    reg = <0x3e800000 0x100000>;
    };
    };
    remoteproc0: remoteproc@0 {
    compatible = "xlnx,zynq_remoteproc";
    firmware = "firmware";
    vring0 = <15>;
    vring1 = <14>;
    memory-region = <&rproc_0_reserved>, <&rproc_0_dma>;
    };
    };

    若是需要 MIN0 的 LED 灯就再添加以下内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    / {
    leds {
    compatible = "gpio-leds";
    heartbeat_led {
    label = "heartbeat";
    gpios = <&gpio0 0 1>;
    linux,default-trigger = "heartbeat";
    };
    };
    };

    根据手册,DDR的内存范围是:0x0010_0000~0x3FFF_FFFF,也就是最大一个G

    后面一块OCM的内存范围是:0xFFFC_0000 ~ 0xFFFF_FFFF

    CPU1的启动地址是放在 0xFFFFFFF0 的内存地址上

    保存退出

  3. 配置内核

    1
    petalinux-config -c kernel
    1
    2
    3
    4
    [*] Enable loadable module support  --->
    Device Drivers --->
    Remoteproc drivers --->
    <M> Support ZYNQ remoteproc

    保存退出

  4. 配置cpu最大数量

    1
    petalinux-config
    1
    2
    3
    4
    DTG Settings  --->
    Kernel Bootargs --->
    [ ] generate boot args automatically
    (console=ttyPS0,115200 earlycon root=/dev/ram0 rw maxcpus=1 clk_ingore_unused) user set kernel bootargs

    防止cpu1的外设不运行增加一个 clk_ingore_unused

    保存退出

  5. 编译系统

    1
    petalinux-build
  6. 启动系统

    1
    2
    3
    4
    5
    # 预构建镜像
    petalinux-package --prebuilt --force

    # 通过JTAG启动
    petalinux-boot --jtag --prebuilt 3

    以下命令是在板卡的 linux 中运行的

    1. 检查运行的cpu数量

      1
      cat /proc/cpuinfo

      如果输出只有一个 processor 就是设置一个核心运行成功了

    2. 检查内存地址

      1
      cat /proc/iomem

      可以看到我们在设备树里标记保留的内存没有显示在其中,就是保留成功了

    3. 检查启动日志

      1
      2
      3
      4
      # 内存保留
      dmesg | grep reserved
      # remoteproc,没有输出就是对的
      dmesg | grep zynq_remoteproc
    4. 运行官方提供的例程(echo_test)

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      # 挂载内核模块
      modprobe zynq_remoteproc

      # 查看官方提供的例程
      ls /lib/firmware

      # 烧写固件,固件存放在 /lib/firmware 路径下
      # 烧写的固件最终会到达设备树中 rproc_0_reserved 保留的内存区域
      echo image_echo_test > /sys/class/remoteproc/remoteproc0/firmware

      # 启动运行固件
      echo start > /sys/class/remoteproc/remoteproc0/state

      # 运行测试
      echo_test

      # 停止运行固件
      echo stop > /sys/class/remoteproc/remoteproc0/state

测试 PS 程序运行(PS MIO0 LED 闪烁)

  1. 打开 Vitis 2021.2,根据上面 Vivado 2021.2 导出的 XSA 文件创建 Platform

    处理器选择 1

    不勾选创建 boot

  2. 编译 Platform

  3. 在 Platform 的 spr 里找到 GPIO 的例程导入

  4. 在 GPIO 的工程里找到 lscript.ld 文件

    修改 ps7_ddr_0 Base Address 为 0x3e000000,Size 为 0x400000

    删除 ps7_ram_0ps7_ram_1 (切换到 Source 删除)

  5. 在 GPIO 的工程的 ARM v7 gcc compiler 里的 Symbols 里添加宏定义 -DUSE_AMP=1

  6. 打开 GPIO 的工程的 .c 文件

    找到 Output_Pin = 10; 改为 Output_Pin = 0;

  7. 编译工程

  8. 通过调试器运行,观察板卡现象,闪烁16次后自动停止并保持常亮

  9. 使板卡启动 Linux

  10. 将编译出的 elf 文件上传到板卡的 /lib/firmware 路径下

    默认密码是 root

    1
    scp .\xgpiops_polled_example_1\Debug\xgpiops_polled_example_1.elf root@192.168.2.32:/lib/firmware
  11. 在板卡的 Linux 上操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 挂载内核模块
    modprobe zynq_remoteproc

    # 烧写固件,固件存放在 /lib/firmware 路径下
    # 烧写的固件最终会到达设备树中 rproc_0_reserved 保留的内存区域
    # 烧写成功没有任何的返回值
    echo xgpiops_polled_example_1.elf > /sys/class/remoteproc/remoteproc0/firmware

    # 启动运行固件
    echo start > /sys/class/remoteproc/remoteproc0/state

    # 停止运行固件
    echo stop > /sys/class/remoteproc/remoteproc0/state

    内存remap问题解决

测试 AXI-GPIO 输入中断、LED控制输出

  1. 创建 PL 新工程

  2. 创建 PS Platform

    Processor选择:ps7_cortexa9_1

  3. 创建应用程序

    1. 编辑 lscript.ld

      • 修改 ps7_ddr_0 基地址为 0x1e000000, Size为 0x400000
  4. 编译应用程序

  5. 将编译出的 elf 文件发送到板卡中

    1
    scp xgpio_intr_tapp_example_1.elf root@192.168.2.32:/lib/firmware/
  6. 找到 bitstream 文件,转换为 bin 文件并发送到板卡中

    1
    2
    3
    bootgen -image Full_Bitstream.bif -arch zynq -process_bitstream bin

    scp system_wrapper.bit.bin root@192.168.2.32:/lib/firmware/
  7. 在板卡 Linux 中使用命令烧写 比特流 和 固件

    1. 先烧写 Bitstream

      1
      2
      3
      4
      5
      # 设置标志位
      echo 0 > /sys/class/fpga_manager/fpga0/flags

      # 烧写
      echo system_wrapper.bit.bin > /sys/class/fpga_manager/fpga0/firmware
    2. 再烧写 Firmware

      1
      2
      3
      4
      5
      # 烧写
      echo xgpio_intr_tapp_example_1.elf > /sys/class/remoteproc/remoteproc0/firmware

      # 启动运行固件
      echo start > /sys/class/remoteproc/remoteproc0/state

      启动不了…换到 2019.2 后功能正常

  8. 查看运行效果是否和 Vitis 中烧写的相同

【Zynq】PetaLinux 2019.2裸机配置OpenAMP

https://biteax.com/b5029c9.html

作者

石志超

发布于

2022-04-26

更新于

2023-09-27

许可协议