Zedboard & Zynq 图像采集 视频开发 (四) Linux 系统搭建&Frame Buffer设计
前面说到Zynq采集到视频数据,通过AXI4总线传输到DDR,这样PS就可以对视频数据进行操作了。Zynq内部集成Cortex-A9 ARM 双核,PL部分的硬件模块可以作为ARM的外设,这样对于产品的开发提供了很大的灵活性。有这么强大的ARM,当然要跑Linux,在Zynq上跑Linux已经不是什么神秘新鲜的事儿了,神马环境搭建,怎么编译UBOOT,怎么编译内核,设备树等,网上都有大片的教程,我
前面说到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行
- /*
- * Physical Memory map
- */
- #define PHYS_SDRAM_1_SIZE (512 * 1024 * 1024)
2. 修改device-tree,将ddr部分修改如下
- ps7_ddr_0: memory@0 {
- device_type = "memory";
- reg = < 0x0 0x1C000000 >;
- };
bootargs修改如下:
- 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使用了
更多推荐
所有评论(0)