【Zynq】PetaLinux 2019.2裸机配置OpenAMP
OpenAMP 开源的核间通讯框架,这里运行 FreeRTOS(裸机) 与 Linux 通讯。
官方参考地址:Libmetal and OpenAMP User Guide、openamp
第三方参考:Zynq7000 OPENAMP 实验
PetaLinux 设置
配置 rootfs
1
petalinux-config -c rootfs
启用相关组件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Filesystem 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端测试例程地址
保存退出
配置设备树
编辑
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
的内存地址上保存退出
配置内核
1
petalinux-config -c kernel
1
2
3
4[*] Enable loadable module support --->
Device Drivers --->
Remoteproc drivers --->
<M> Support ZYNQ remoteproc保存退出
配置cpu最大数量
1
petalinux-config
1
2
3
4DTG 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
保存退出
编译系统
1
petalinux-build
启动系统
1
2
3
4
5# 预构建镜像
petalinux-package --prebuilt --force
# 通过JTAG启动
petalinux-boot --jtag --prebuilt 3以下命令是在板卡的 linux 中运行的
检查运行的cpu数量
1
cat /proc/cpuinfo
如果输出只有一个
processor
就是设置一个核心运行成功了检查内存地址
1
cat /proc/iomem
可以看到我们在设备树里标记保留的内存没有显示在其中,就是保留成功了
检查启动日志
1
2
3
4# 内存保留
dmesg | grep reserved
# remoteproc,没有输出就是对的
dmesg | grep zynq_remoteproc运行官方提供的例程(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 闪烁)
打开 Vitis 2021.2,根据上面 Vivado 2021.2 导出的 XSA 文件创建 Platform
处理器选择 1
不勾选创建 boot
编译 Platform
在 Platform 的 spr 里找到 GPIO 的例程导入
在 GPIO 的工程里找到 lscript.ld 文件
修改
ps7_ddr_0
Base Address 为0x3e000000
,Size 为0x400000
删除
ps7_ram_0
和ps7_ram_1
(切换到 Source 删除)在 GPIO 的工程的
ARM v7 gcc compiler
里的Symbols
里添加宏定义-DUSE_AMP=1
打开 GPIO 的工程的 .c 文件
找到
Output_Pin = 10;
改为Output_Pin = 0;
编译工程
通过调试器运行,观察板卡现象,闪烁16次后自动停止并保持常亮
使板卡启动 Linux
将编译出的 elf 文件上传到板卡的
/lib/firmware
路径下默认密码是
root
1
scp .\xgpiops_polled_example_1\Debug\xgpiops_polled_example_1.elf root@192.168.2.32:/lib/firmware
在板卡的 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
测试 AXI-GPIO 输入中断、LED控制输出
创建 PL 新工程
创建 PS Platform
Processor选择:
ps7_cortexa9_1
创建应用程序
编辑
lscript.ld
- 修改
ps7_ddr_0
基地址为0x1e000000
, Size为0x400000
- 修改
编译应用程序
将编译出的 elf 文件发送到板卡中
1
scp xgpio_intr_tapp_example_1.elf root@192.168.2.32:/lib/firmware/
找到 bitstream 文件,转换为 bin 文件并发送到板卡中
1
2
3bootgen -image Full_Bitstream.bif -arch zynq -process_bitstream bin
scp system_wrapper.bit.bin root@192.168.2.32:/lib/firmware/在板卡 Linux 中使用命令烧写 比特流 和 固件
先烧写 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再烧写 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 后功能正常
查看运行效果是否和 Vitis 中烧写的相同
【Zynq】PetaLinux 2019.2裸机配置OpenAMP