Zedboard & Zynq 图像采集 视频开发 (四) Linux 系统搭建&Frame Buffer设计

前面说到Zynq采集到视频数据,通过AXI4总线传输到DDR,这样PS就可以对视频数据进行操作了。

Zynq内部集成Cortex-A9 ARM 双核,PL部分的硬件模块可以作为ARM的外设,这样对于产品的开发提供了很大的灵活性。

有这么强大的ARM,当然要跑Linux,在Zynq上跑Linux已经不是什么神秘新鲜的事儿了,神马环境搭建,怎么编译UBOOT,怎么编译内核,设备树等,网上都有大片的教程,我这里就不再说了,如果有神马问题,可以加我QQ(707200828),当然我也不是神马大神,只是抱着有问题大家互相讨论的态度而已。


闲话少说,本文的主要内容是介绍一下在Zynq跑Linux的前提下,如果PL有数据要传送到DDR或者PS要将产生的数据传送给PL即DMA传输方式,涉及到DDR内存分配问题,这样的设计应该从何下手,当然这种情况不一定都是用在视频图像方面。

一般人都会有的想法,而且我也曾经有过的想法就是在Linux应用程序中调用malloc,动态申请一块内存,然后通知PL,让其把数据传送到这块内存中,乍一看,貌似很有道理,但是稍微想一下就会明白,这样是行不通的(笔者的意思是不在对这块内存再做其他处理,比如反映射等的情况下),为啥捏,这是因为Linux中的内存地址都是经过内存映射的,是虚拟地址,并不是真正的物理地址,而PL传输数据到DDR ,是需要知道传送的物理地址的,这样便不能直接使用malloc返回的内存地址作为DMA传输的源和目的地址(而且通常情况下,经过映射之后的地址都会超出实际DDR的物理地址)

当然还有人会说,能不能把malloc返回的内存地址进行反映射得到物理地址呢,笔者也试图寻找办法实现这个目的,但由于修为还不够,所以还没有找到办法。但是有一点,我觉得(强调:是我觉得,可能是不对的),在内核中进行内存的申请有可能可以实现动态内存的DMA传输,对于这一点,笔者还会继续研究下去。


笔者认为比较好可行的方案就是,把DDR进行分块,前半块分给Linux用,后半块分给PL部分用以及PS与PL数据交互用。我现在工作中使用到的海思的3516系列视频芯片就是这种结构,一片DDR内存,只有低64MB分给Linux使用,剩余的高位空间则是用于视频编码,处理,数据交互使用。

目前我的DDR分区是这样的,Zedboard一共有512MB内存,前448MB分给Linux使用,后64MB分给PL使用。文件系统使用的是ext4 sd卡上面的文件系统,而不是ramdisk。

具体操作步骤:

1. 修改UBOOT,我用的UBOOT是u-boot-digilent-2012.04-digilent-13.01,进入到目录

打开文件zynq_zed.h,在第99行

[plain]  view plain copy
  1. /*  
  2.  * Physical Memory map  
  3.  */  
  4. #define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024)  
这里定义DDR的物理大小,将宏#define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024) 修改为#define PHYS_SDRAM_1_SIZE (448* 1024 * 1024)


2. 修改device-tree,将ddr部分修改如下


[plain]  view plain copy
  1. ps7_ddr_0: memory@0 {  
  2.     device_type = "memory";  
  3.     reg = < 0x0 0x1C000000 >;  
  4. };  

bootargs修改如下:



[plain]  view plain copy
  1. bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk mem=448M rootfstype=ext4 rootwait devtmpfs.mount=0";  

3. 内核,文件系统不需要修改


上面都做完以后,把生成文件都拷到sd卡,启动Zedboard,在终端输入 top命令

计算一下,Linux使用的内存就是448MB,剩下的64MB就可以分给PL使用了


你可能感兴趣的:(FPGA)