Petalinux 通过PL接收图片数据,ADMA或VDMA写入PS USB3.0U盘
工具版本:
Ubuntu18.04.2
Unified2020.01
Petalinux2020.01
Qt5.13.2
安装过程详见以前的博客。
1、工程如下图
2、PS设置 对于此工程,仅仅需要配置SD卡,DP接口、USB接口和UART1接口。
3、ADMA设置(同VDMA),需要注意的是with of buffer length register 这个参数的设置,这个参数的大小直接影响一次dma的数据长度
4、配置数据产生模块switch_dat_gen,一张图片行长4096,列数4096,行间隔64个pclk,帧间隔8192个pclk,然后通dat2axis模块将数据有类似cameralink信号转换成axis信号,输入adma。
5、两个GPIO模块是控制switch_dat_gen模块的start信号,每一个start信号的上升沿,开始产生一帧图像。
6、生成xsa文件,导入petalinux。
7、生成petalinux工程以及sysroot
petalinux-create --type project --template zynqMP --name u3_adma
petalinux-config -c kernel
(cma 256MB)
petalinux-config -c rootfs
(选中mali qt qt5 qt-extended x11(这个可以在dp接口的显示器上看到图像))
petalinux-build
在用户的设备树中修改
/include/ “system-conf.dtsi”
/ {
reserved-memory {
#address-cells = <2>;
#size-cells = <2>;
ranges;
reserved: [email protected] {
compatible = “shared-dma-pool”;
no-map;
reg = <0x0 0x50000000 0x0 0x10000000>;
};
};
[email protected] {
compatible = “xlnx,reserved-memory”;
memory-region = <&reserved>;
};
};
&axi_dma_0 {
status = “disabled”;
};
&axi_dma_1 {
status = “disabled”;
};
&sdhci0 {
no-1-8-v;
broken-cd;
disable-wp;
};
&dwc3_0 {
dr_mode = “host”;
snps,usb3_lpm_capable;
phy-names = “usb3-phy”;
phys = <&lane2 4 0 0 26000000>;
maximum-speed = “super-speed”;
};
&dwc3_1 {
dr_mode = “host”;
snps,usb3_lpm_capable;
phy-names = “usb3-phy”;
phys = <&lane3 4 1 0 26000000>;
maximum-speed = “super-speed”;
};
重新运行petalinux-build
petalinux-build --sdk
petalinux-package --sysroot
生成BOOT.bin和image.ub
petalinux-package --boot --fsbl zynqmp_fsbl.elf --u-boot u-boot.elf --pmufw pmufw.elf --fpga system.bit
将BOOT.bin、image.ub和boot.scr复制到SD的FAT32分区
插入板卡,上电。
8、启动时,可以看到 DDR的保留区域
插入USB3.0的U盘
9、配置好QT的环境后,(用新版本的原因时,qt5.13后,IMAGE支持灰度图16位的读写)
10、将编译后的程序复制到U盘,上电后,将U盘挂载到mnt目录下
11、运行程序
12、得到图片
看到打印信息,生成图片需要170ms,从DDR保留地址读数据到内核地址需要227ms,U盘存储不稳定,平均在100ms之间,这个和在linux和windos下测试这个U盘的读写带宽大致是一样的,由此可知,如果按照这个UIO DMA模式来操作数据,时间大部分浪费在保存区域到内核区域的搬移上。
13、数据流向
PL------>Reserve MEM-------->Kernel MEM-------->U盘(推测)
14、鉴于中间时间过长,准备使用官方推荐的dma驱动。
15、欢迎讨论