前面我已经把PetaLinux成功安装到了Ubuntu虚拟机当中了,接下来就要实际操作,将PetaLinux移植到我们自己的硬件平台当中去。

step1:硬件描述文件

有两种PetaLinux工程建立的方法,一种是下载官方开发板的BSP包并安装,一种就是针对自己的硬件平台去剪裁Linux功能以适应自己的需求。

第一种,比较简单,官方提供了完整的demo和已经预编译好的各种文件。

比如说我们从网上下载了Avnet-Digilent-ZedBoard-v2015.4-final.bsp,我们直接执行下面的命令就可以安装这个BSP包了。安装完成后,PetaLinux工程就安装在了Avnet-Digilent-ZedBoard-v2015.4-final文件夹下面。可以选择自己重新编译,或者直接使用预编译好的文件直接拷贝到SD卡中,马上就能够在ZedBoard上运行PetaLinux了。

petalinux-create -t project -s ./Avnet-Digilent-ZedBoard-v2015.4-final.bsp

第二种,根据我们自行设计的硬件平台去创建PetaLinux工程。这就稍微复杂一些了,需要进行各种配置,我也是尝试了各种配置方法,最终获得了一个基本上满足我需求的结果。

选用的芯片是ZYNQ系列的芯片,我们将会在内部的ARM硬核上去跑Linux。

首先,为了让PetaLinux正常的运行,需要分配一些硬件外设资源给PetaLinux,文档ug1144中也说明了PetaLinux中对Zynq-7000系列FPGA硬件资源的需求。若用到了MicroBlaze或者Zynq Ultrascal+ MPSoC的话,自己查看文档说明吧。

1.TTC模块(必须) #如果多个TTC都使用了的话,Linux内核将会使用第一个TTC模块。
2.外部32MB存储空间(必须)
3.UART模块(可选,控制台打印信息用) #如果用UART IP模块的话,如AXI UART,需要确保中断信号有连接到PS
4.非易失存储器(可选) #如QSPI Flash,SD/MMC
5.以太网接口(可选) #若果用Ethernet IP模块或外部PHY的话,需要确保中断信号连接道PS

知道这些后,我们在Vivado中设计硬件平台时需要预留好上述模块就可以了。Vivado设计,综合,实现后,我们在Vivado中使用“Export Hardware”输出PetaLinux需要的硬件描述文件。

输出的文件都在“/<vivado project>/<project name>.sdk/<top module name>_hw_platform_0”文件夹下。

如果我们使用的是Windows版本的Vivado,我们就需要把“***_hw_platform_0”这个文件夹拖到Linux虚拟机当中去。如果使用Linux版本的Vivado,之后直接定位到这个文件夹就可以了。

step2:创建PetaLinux工程

接下来就能够根据这些硬件描述文件,来创建基于我们自己的硬件平台的PetaLinux工程了。

首先,创建一个PetaLinux工程目录。执行命令:

#创建工程,针对Zynq芯片,工程名称ifc_petalinux
petalinux-create --type project --template zynq --name ifc_petalinux

创建成功后,在ifc_petalinux目录下将包含2个文件夹和一个文件,如下所示。

接着,我们来引用刚才输出的硬件描述文件。执行命令:

petalinux-config --get-hw-description=/home/xilinx-arm/PetaLinux/ifc_v1_0/ifc_hw_description/IFC_TOP_wrapper_hw_platform_0

因为是空工程,我们会进入一个配置界面。在里面我们可以配置一些系统参数,主要的配置包括:启动方式,启动存储器分区表,启动文件名称等等。

这里我们仅需要修改两个启动方式选项即可。boot和kernel的存储位置,都选到QSPI Flash即可。配置如下:

#Subsystem AUTO Hardware Settings --->
# Advanced bootable images storage Settings --->
# boot image settings --->
# image storage media ---> choose primary flash
# kernel image settings --->
# image storage media ---> choose primary flash

这里要说明一下,因为我自己的板子上包含了QSPI Flash、eMMC、USB,而没有SD卡、以太网。

所以非常尴尬,不能通过简单的SD卡复制文件去进行系统boot,必须通过JTAG下载BOOT.bin和image.ub文件。非常非常的e'xin!!下载两个文件就要下载好久,这也导致我每次尝试都花费大量时间在下载Flash上。

所以在这里,建议大家一定要在设计板子的时候尽量留好SD卡的位置,或者就算留上几个测试点飞线出来也好,对开发来说肯定会提供很多方便。

回到正题,配置完成后,按ESC并选择YES保存配置。系统就自动进行配置了,配置成功的打印信息如下:

为了方便我们之后复制和修改文件,执行命令:

chmod -R 777 ../ifc_petalinux/

step3:内核配置

因为硬件平台没有SD卡和网口,尴尬的我很难复制文件。想了个办法,就是通过U盘去复制文件,所以我需要把USB配置一下,让系统能够识别出U盘,并进行读写操作。而且以后可能用到USB摄像头,就顺便把这个功能也打开吧。参考网址:http://www.wiki.xilinx.com/Zynq+Linux+USB+Device+Driver

配置kernel,执行命令:

petalinux-config -c kernel

打开了kernel的配置界面,

USB的配置如下:

#Device Drivers --->
# USB support --->
# <*> Support for Host-side USB
# <*> OTG support
# <*> EHCI HCD (USB 2.0) support
# <*> USB Mass Storage support
# <*> ChipIdea Highspeed Dual Role Controller
# <*> ChipIdea host controller
# <*> ChipIdea device controller
# USB Physical Layer drivers --->
# <*> NOP USB Transceiver Driver ####!!!在2015.4中不用打开这个
# <*> USB Gadget Support
# <M> USB Gadget Drivers
# <M> USB functions configurable through configfs
# [*] Mass storage

上面都是按照OTG功能来配置的,但我暂时没有OTG的转接线,没法调试不敢确认是否能用,所以我们最后在设备树中只开启host功能。

其实除了“NOP USB Transceiver Driver”是默认没有打开,剩下都是默认打开的,我最终根据自己的配置并没有打开这个选项!!!

USB摄像头配置如下:

#Device Drivers --->
# Multimedia Support --->
# Media USB Adapter --->
# <*>USB Video Class (UVC) (also UVC Input Event Support) #打开
# USB Support --->
# < >USB 2.0 OTG FSM Implementation #关闭

配置完成后,ESC并保存。

step4:设备树配置

我设计的板子是参考ZYBO开发板的,usb phy上有一个reset引脚连接到了PS的MIO46管脚上。

需要在设备树中告诉系统。

设备树文件都在目录 ./subsystems/linux/configs/device-tree 底下

首先修改pcw.dtsi文件:(在最下面的问题二中,解决了usb reset的问题。按照解决方法配置好后,就不用修改pcw.dtsi文件了,它能够自动生成!)

gedit subsystems/linux/configs/device-tree/pcw.dtsi
#在&usb0上增加一行usb-reset = <&gpio0 46 0>;
#最后如下:
&usb0 {
dr_mode = "host";
phy_type = "ulpi";
status = "okay";
usb-reset = <&gpio0 46 0>;
};

接着修改system-top.dts文件:

gedit subsystems/linux/configs/device-tree/system-top.dts
#可以看到里面基本是空的
#在里面增加以下内容
&qspi {
flash0: flash@0 {
compatible = "micron,n25q128a11";
};
};
/{
usb_phy0: usb_phy@0 {
compatible="ulpi-phy"; ###假如前面的kernel配置中打开了“NOP USB Transceiver Driver”,需要配置为compatible="usb-nop-xceiv";
#phy-cells = <0>;
reg = <0xe0002000 0x1000>;
view-port=<0x170>;
reset-gpios = <&gpio0 46 1>;
drv-vbus;
};
};
&usb0 {
status = "okay";
dr_mode = "host";
usb-phy = <&usb_phy0>;
};

其中QSPI Flash我用到型号是N25Q128A11EF740E,所以要在这个设备树中说明。而USB配置为host模式,并打开VBUS电源。

step5:编译和下载程序

终于,配置完成了,接下来就可以愉快的编译了,执行命令:

petalinux-build

编译成功log:

最终在./images/linux文件夹下,就能够找到我们需要的各种文件了。

我们需要的四个文件是:

zynq_fsbl.elf           #FSBL可执行文件
IFC_TOP_wrapper.bit #FPGA配置bit文件
u-boot.elf #SSBL可执行文件
image.ub #linux镜像文件

由于我没有在Linux虚拟机中安装Vivado,所以我没有办法使用“petalinux-package”命令。

因此我将这四个文件拖到Windows中进行处理,

在Windows中打开Xilinx SDK,选择 Xilinx Tools->Create Boot Image,可以参考一下官方手册,

分别按顺序加入 zynq_fsbl.elf--->IFC_TOP_wrapper.bit--->u-boot.elf 三个文件。点击 Create Image 按钮,生成BOOT.bin文件。

因为我的系统中没有SD卡,而且一开始就配置为了QSPI FLASH启动的方式,在Xilinx SDK中选择 Xilinx Tools->Program Flash。

Image File选择刚才生成的BOOT.bin文件,Flash Type选择qspi_single,Offset填写0,点击Program按钮。烧录完成后,我们的FSBL,bit,SSBL就成功下载到QSPI Flash中去了,我们就已经可以实现u-boot的启动了,但是还不能引导kernel。

接下来烧录image.ub文件,因为Image File只能选择.bin或者.mcs文件,所以需要把image.ub重新命名为image.ub.bin,好像有点粗暴。。。

然后Offset需要填写偏移地址,这个地址可以通过petalinux-config配置,或者可以通过system-config.dtsi文件查看。内容如下:

&qspi {
#address-cells = <1>;
#size-cells = <0>;
flash0: flash@0 {
compatible = "micron,n25q128";
reg = <0x0>;
#address-cells = <1>;
#size-cells = <1>;
spi-max-frequency = <50000000>;
partition@0x00000000 {
label = "boot";
reg = <0x00000000 0x00500000>;
};
partition@0x00500000 {
label = "bootenv";
reg = <0x00500000 0x00020000>;
};
partition@0x00520000 {
label = "kernel";
reg = <0x00520000 0x00a80000>;
};
partition@0x00fa0000 {
label = "spare";
reg = <0x00fa0000 0x00000000>;
};
};
};

可以看到kernel的偏移地址是0x00520000,所以Offset就填写这个数值。点击Program烧录。

最终,我们通过跳线方式将板子的启动方式配置为QSPI Flash,上电,启动~~~~

我们的PetaLinux就成功运行了~~~~哈哈哈哈

运行后插入了USB Hub和U盘,成功挂载!之后传输文件或者更新BOOT.bin和image.ub就可以用U盘复制了,JTAG下载flash的方式实在是太慢了!

Log打印没有截图,有空了copy一下。先留个位置。

log信息

需要做PetaLinux版本控制时,需要备份如下几个文件夹内的所有文件:

• "<plnx-proj-root>/.petalinux"
• "<plnx-proj-root>/build/"
• "<plnx-proj-root>/images/"

需要注意的问题:

1.假如在FPGA中用到了VDMA模块,在编译时会提示有错误出现。

原因是VDMA的中断编号有错误,我的处理方法是在pl.dtsi设备树文件中,把每个VDMA模块里的MM2S,S2MM通道的interrupt=-1那两行直接删除,这样就能够成功编译了。但是有什么影响我就不知道了。以后再研究吧。

2.在petalinux-config配置完成后,提示类似No USB reset found, No ethernet reset found类似的警告。

一直以为是设备树的问题,最后发现原来是在Vivado中Zynq系统配置时,没有设置Reset对应的MIO管脚。配置好后就不需要修改pcw.dtsi文件了。如下图,配置了USB的Reset为MIO46。

配置这个后,当调用 petalinux-config --get-hw-description=/*** 命令时,就会自动在pcw.dtsi文件中生成“usb-reset = <&gpio0 46 0>;”这段描述了。

3.USB HOST模式,USB PHY的CPEN不使能电源,导致不能向外供电

由于我使用的是2015.4的PetaLinux,这个bug已经被修复了。在之前的版本会出现这个现象,大致原因就是就算配置设备树成host模式,系统仍然按otg方式配置了USB。

问题描述的网址:

https://forums.xilinx.com/t5/Embedded-Linux/Petalinux-2015-2-1-usb-not-working/td-p/654349

http://zedboard.org/content/using-petalinux-configure-zedboard%EF%BC%8C-usb-otg-can-not-work解决方法就是在petalinux中安装一个app,每次启动时候运行脚本强制打开USB。也可以手动打开,针对usb0,执行命令:devmem 0xe0002170 32 0x600a0067

补丁网址:https://forums.xilinx.com/xlnx/attachments/xlnx/ELINUX/14090/1/force_usb_power.tar.gz

app的安装方法参考ug1144,执行的命令大致包括:

mkdir ./components/apps/force_usb_power
#复制force_usb_power.sh, Kconfig, Makefile, README四个文件到文件夹下
petalinux-config -c rootfs
#进入Applications ---> 使能force_usb_power应用
petalinux-build -c /rootfs/force_usb_power
petalinux-build -c /rootfs/force_usb_power
petalinux-build -x package
#得到了打了补丁的image.ub文件

【Xilinx-Petalinux学习】-02-建立PetaLinux工程的更多相关文章

  1. STM8建立IAR工程

    STM8是意法半导体公司出的增强型八位单片机,性能比51单片机强大,而且价格便宜,在商业应用中很受欢迎 在STM8的开发工程中主要有两种开发工具链.第一是使用IAR开发环境,第二十使用cosmic+s ...

  2. Android Testing学习02 HelloTesting 项目建立与执行

    Android Testing学习02 HelloTesting 项目建立与执行 Android测试,分为待测试的项目和测试项目,这两个项目会生成两个独立的apk,但是内部,它们会共享同一个进程. 下 ...

  3. Xilinx 学习笔记1---新建工程和创建源代码文件

    最近终于有空可以记录一些之前学习的内容,本博客系列记录笔者Xilinx ISE学习之旅,当然现在Vivado是学习热门,一步一步来.搞定 ISE,Vivado上手也会很快. 1.安装软件 软件部分的下 ...

  4. JavaScript学习02 基础语法

    JavaScript学习02 基础语法 JavaScript中很多基础内容和Java中大体上基本一样,所以不需要再单独重复讲了,包括: 各种算术运算符.比较运算符.逻辑运算符: if else语句.s ...

  5. 创芯Xilinx Microblaze 学习系列第一集

    创芯Xilinx Microblaze 学习系列第一集 Xilinx ISE Design Suite 13.2 The MicroBlaze™ embedded processor soft cor ...

  6. 重新使用Eclipse建立安卓工程遇到的问题

    很早之前用过Eclipse建立安卓工程,很久没用了,最近打算用Eclipse开发安卓程序,我是用谷歌提供的Eclipse集成环境建立的安卓工程,发现有了一些变化,而且遇到一点问题,这几天不断学习,终于 ...

  7. 关于建立Android工程R文件丢失的问题

    今天开始学习Android了,好久没打开eclipse,建立Android工程老是报错,于是手残的把appcompat-v7给删了,然后建立工程以后重新出来的appcompat-v7有个小叉号,百度了 ...

  8. 特征工程学习01-sklearn单机特征工程

    特征工程学习01-sklearn单机特征工程 小书匠 kindle  0.数据的导入 from sklearn.datasets import load_iris  #导入IRIS数据集  iris= ...

  9. Xilinx约束学习笔记(一)—— 约束方法学

    <Xilinx约束学习笔记>为自己阅读 Xilinx 官方 UG903 文档后的学习笔记,大多数为翻译得来,方便大家学习. 1 约束方法学 1.1 组织约束文件 Xilinx 建议将时序约 ...

  10. Java虚拟机JVM学习02 类的加载概述

    Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...

随机推荐

  1. Linux系统编程读书笔记

    文件I/O模型 Linux的哲学思想,一切皆文件,这也是Linux文件操作的方便之处.系统调用不会分配缓冲区用以返回信息给调用者.所以必须提前分配大小合适的缓冲区并将缓冲区指针传递给系统调用. 1.o ...

  2. magento模板中XML与phtml关系 [四]

    layout\catalogserch.xml 中声明的 as="topSearch" 被templ\page\html\header.phtml调用输出 echo $this-& ...

  3. C# Excel嵌入到Winform

    本文讲的这个技术是把Excel表格嵌入到自己开发程序的Form窗体中进行操作,给客户一个不用切换窗口的操作界面,似乎更好.这在VC中用OLE技术很容易实现,但是在C#中方法就不一样啦.下面将就此进行阐 ...

  4. 扩展欧几里得 POJ 1061

    感觉这道题目的数据好水啊...我的代码我都觉得姿势特别奇怪...竟然还过了... 好吧,原来不是姿势奇怪,而是逆元需要用的时候是余数也需要的时候,这里的余数是不需要的,所以就AC了 就说一下碰到的问题 ...

  5. gen_create_syn.sql

    set echo off feedback off verify off pagesize 0 linesize 120 ---变量从 sqlplus 的 call代码 传递过来 . -- 1 表示连 ...

  6. GridView 编辑,更新,删除 等操作~~

    protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { GridView1. ...

  7. 进程waitpid()的用法

    代码分析: /* waitpid.c */ #include <sys/types.h> #include <sys/wait.h> #include <unistd.h ...

  8. PHP :Call to undefined function mysql_connect()

    今天配置apache ,php,mysql 的时候,一直报(Call to undefined function mysql_connect()),PHP一直连接不上数据库,从网上查,答案也都是千篇一 ...

  9. 定制化jQuery

    毋庸置疑,jQuery很强大,很方便,但是......越来越臃肿,怎么办?,jquery只基于模块化开发的,可以通过工具定制jquery,选择你需要的模块即可. 下面这个网站可以帮你完成定制 http ...

  10. A标签中通过href和onclick传递的this对象

    在blog的后台管理中允许为一个分类添加一个地址,但是不好添加onclick事件.想传递当前对象给一个函数,于是就将这个URL写成"Javascript:shoControlSidebar( ...