前言
自己原来做ARM方向的,都是飞思卡尔或者TI的平台,这次由于项目原因使用了ZYNQ,由于功能需要,PS和PL之间需要使用较快的通信。所以使用了DMA进行通信。那么故事就这么开始了。
平台
硬件平台:ZYNQ zc106
petalinux 版本2022.X? 不记得了。
Linux 5.19? 也不记得了。
开发步骤
首先主要block design。这个没啥东西,网上也有很多。
搬运一个
转载FPGA入门
侵删
具体过程没啥说的。我只是记录一下我中间碰到的问题。
- 上手ZYNQ不太习惯,build没有package。
- 由于我的工程里面dma驱动在内核加载时就已经起来了,没有配置成模块形式。这就带来一个问题,如果在内核启动时,bit文件没有加载,那么肯定会挂。查了一下相关的说法FPGA加载分两种,一种是直接写入boot.img文件中,第二种可以在Linux启动之后,对fpga进行烧写。在这里除非是将驱动编译为模块,不然还是关闭FPGA MANAGER,将bit文件写入boot.img中。
- 然而没想到 我他娘的还是被烧写方式坑了。在我的文件系统中/lib/firmware下还是存在一个bit文件。驱动在启动时加载正常,但是加载了文件系统之后,我对dma进行操作就出错。查了半天发现fpga在文件系统加载后又被烧写了一次。怒删bit文件之后解决了该问题。
- 至此DMA没啥太大问题了。可以通过网上的dma字符设备的方式进行操作。
- 然而主要要和FPGA进行通信,最好DMA SRC与DST的地址明确不改动。我们指定了0x40000000作为发送地址,0x50000000作为接收地址。网上的字符设备的驱动可能不太符合我们的应用场景。(现在想想好像也问题不大,只要PL端在读取之前获取一下地址,PL不知道好不好做,但是PL写的话,ARM就不一定好操作了,不过总能解决)。
- 另外一个问题,由于CMA起始地址与我们配置的读写地址不一致,好像会导致DMA错误,状态寄存器为0x40。DMA DECODE ERROR。表示地址错误。修改成对应地址之后该问题解决。
至此DMA没啥太大问题,不过通过这次的问题,也对ZYNQ有了一些了解。主要还是平台不一样,而且多了对PL的操作。
在另外说一句,petalinux操作过程中,特别容易把Linux源码给我删除了,特别不方便。调试太麻烦了。我的解决方案是从githunb上下载最新的petalinux的代码,解压到本地。在petalinux-config中将linux的源码设置为从本地路径获取,并将路径指向源码,方便了很多。不删除源码,一些打印信息也都能保存下来。
就这样吧。争取把PL也弄懂。
另外上传一下代码。
https://download.csdn.net/download/spark550/85652503
应用层代码,小赚一下积分,1分。不动态调分,这个机制挺纱x笔的。