本帖最后由 正点原子运营 于 2020-11-23 11:16 编辑
1)实验平台:正点原子领航者ZYNQ开发板
2)平台购买地址:https://item.taobao.com/item.htm?&id=606160108761
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-301505-1-1.html
4)对正点原子FPGA感兴趣的同学可以加群讨论:712557122
5)关注正点原子公众号,获取最新资料更新
第五章Petalinux设计流程实战
PetaLinux工具提供了在Xilinx处理系统上自定义、构建和部署嵌入式Linux解决方案所需的一切。该解决方案旨在提高设计生产力,可与Xilinx硬件设计工具一起使用,以简化针对Zynq-7000 SoC的Linux系统的开发。本章我们以使用Petalinux定制Linux系统为例,实战Petalinux的设计流程,看下Petalinux如何简化Linux系统的开发。
1.1 Petalinux的设计流程概述通常PetaLinux工具遵循顺序设计流程模型,如下表所示: 表16.3.3.1 设计流程表
从上表可以看到,使用Vivado搭建好硬件平台后,通过几个命令就完成了Linux系统的定制,极其方便。 需要说明的是以上设计流程不是按部就班的每一步都执行一遍,可以根据使用场景有选择的执行。一般的设计流程如下: 1. 通过Vivado创建硬件平台,得到hdf硬件描述文件; 2. 运行 source <petalinux安装路径>/settings.sh,设置Petalinux运行环境 3. 通过petalinux-create -t project创建petalinux工程; 4. 使用petalinux-config --get-hw-description,将hdf文件导入到petalinux工程当中并配置petalinux工程; 5. 使用petalinux-config -c kernel配置Linux内核; 6. 使用petalinux-config -c rootfs配置Linux根文件系统; 7. 配置设备树文件; 8. 使用petalinux-build编译整个工程; 9. 使用petalinux-package --boot制作BOOT.BIN启动文件; 10. 制作SD启动卡,将BOOT.BIN和image.ub以及根文件系统部署到SD卡中; 11. 将SD卡插入开发板,并将开发板启动模式设置为从SD卡启动; 12. 开发板连接串口线并上电启动,串口上位机打印启动信息,登录进入Linux系统。 1.2 使用Petalinux定制Linux系统现在我们以使用Petalinux定制Linux系统为例,来实战下Petalinux的设计流程,体验Petalinux对Linux系统开发的简便之处。 1.2.1 创建Vivado硬件平台在《领航者ZYNQ之嵌入式开发指南》中我们创建了很多Vivado工程,此处我们可以用《领航者ZYNQ之嵌入式开发指南》中的Vivado工程作为本实验的Vivado工程,免得重新搭建。不过需要说明的是在嵌入式开发中除了DDR3外我们的标配外设是UART,无论什么实验都没少UART,同样在linux开发中,我们的标配外设除了UART外,还需要添加SD卡,因为需要从SD卡启动,以太网,毕竟没有以太网的Linux就像不能上网的手机,需要使用键盘和鼠标以及U盘的还需要USB,不需要的可以不加。所以我们只需要在《领航者ZYNQ之嵌入式开发指南》中的Vivado工程中添加SD卡、以太网和USB就可以作为petalinux的Vivado工程了。 推荐使用《领航者ZYNQ之嵌入式开发指南》第十九章的《SD卡读BMP图片LCD显示实验》的Vivado工程或第二十章的《SD卡读BMP图片HDMI显示实验》的Vivado工程作为本实验的Vivado工程的蓝本,在该Vivado工程的基础上添砖加瓦。至于为什么选这两个实验的Vivado工程,主要是因为这两个实验的Vivado工程能输出显示,如HDMI显示或LCD显示,后面的Linux显示设备显示实验就不需要重新搭建Vivado工程以及重新导入及配置petalinux了。 有正点原子LCD液晶屏的推荐选择《SD卡读BMP图片LCD显示实验》的Vivado工程,有HDMI显示器的推荐选择《SD卡读BMP图片HDMI显示实验》的Vivado工程。无论选择哪一个工程,接下来的配置都是一样的,为了讲解方便,我们以《SD卡读BMP图片HDMI显示实验》的Vivado工程为例,对《SD卡读BMP图片LCD显示实验》的Vivado工程同样适用。 现在另存为《SD卡读BMP图片HDMI显示实验》的Vivado工程为“zynq_petalinux”工程,如下图所示:
图 17.2.1 另存为“zynq_petalinux”工程 现在我们来配置ZYNQ ProcessingSystem IP核。为了后面我们少新建Vivado工程及重新导入Petalinux的麻烦,我们将需要用的都加上。因此勾选了QSPI、ENET0、USB0、SD0、SD1、UART0、I2C0和I2C1,如下图所示:
图 17.2.2 配置MIO引脚功能 具体的配置过程就不赘述了,相关的硬件配置可以参考《领航者ZYNQ之嵌入式开发指南》的相应章节,如以太网的配置可以参考《领航者ZYNQ之嵌入式开发指南》的《第二十九章基于lwip的echo server实验》。另外本次实验配置完成的Vivado工程已提供在光盘路径:“ZYNQ开发板光盘资料(A盘)\4_SourceCode\ZYNQ_7020\3_Embedded_Linux\zynq_petalinux\1_customize_linux\hardware\vivado\zynq_petalinux,如有不清楚的,可参考该工程的配置,也可直接使用该Vivado工程。 GPIO的配置如下图所示:
图 17.2.3 配置GPIO 这里简要的说明下各个配置对应的外设。SD0对应的是插入底板的SD卡,SD1对应的是核心板上的EMMC,I2C0对应的是HDMI设备的IIC,I2C1对应的是底板上的EEPROM和RTC的I2C,EMIO的7对应的是PL的3个按键(2个轻触式按键和一个触摸按键)、3个LED灯和一个蜂鸣器,需要注意的是如果是《SD卡读BMP图片LCD显示实验》的Vivado工程,这里的EMIO对应的数字为9,因为还需加上LCD的复位信号rst和背光信号bl。 特别注意的是:在用Vivado搭建Petalinux工程的硬件平台即Vivado工程时,如果使用到的PL IP模块中有中断信号,要确保中断信号连接到ZYNQ Processing SystemIP核,所以还需开启Interrupts接口。 配置完ZYNQ ProcessingSystem IP核后,引出对应的引脚并修改名称,结果如下图所示:
图 17.2.4 ZYNQ Processing System IP核引脚引出结果图 添加concat IP模块连接v_tc_0和axi_vdma_0的中断信号至ZYNQ Processing System IP核的中断输入引脚,如下图所示:
图 17.2.5 连接中断信号 如果是《SD卡读BMP图片HDMI显示实验》的Vivado工程,我们添砖加瓦的工作完成了。如果是《SD卡读BMP图片LCD显示实验》的Vivado工程,我们还需将rgb2lcd IP模块的lcb_bl信号的引出去掉,如下图所示:
图 17.2.6 去掉lcb_bl信号的引出 按F6“Validate Design”验证设计,验证完成后弹出对话框提示“ValidationSuccessful”表明设计无误,点击“OK”确认。最后按快捷键“Ctrl + S”保存设计。 接下来在Source窗口中右键点击Block Design设计文件“system.bd”,然后依次执行“Generate Output Products”和“Create HDLWrapper”。 现在添加约束,打开该工程的引脚约束文件system_wrapper.xdc,追加以下内容: - #-------------------------EMIO-------------------
- #PL_KEY54 55
- set_property-dict { PACKAGE_PIN L20 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[0] }]
- set_property-dict { PACKAGE_PIN J20 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[1] }]
- #TPAG56
- set_property-dict { PACKAGE_PIN L19 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[2] }]
- #BEEP 57
- set_property-dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[3] }]
- #PL_LED58-60
- set_property-dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[4] }]
- set_property-dict { PACKAGE_PIN H18 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[5] }]
- set_property-dict { PACKAGE_PIN J16 IOSTANDARD LVCMOS33 } [get_ports { GPIO_tri_io[6] }]
- #----------------------HDMIDDC---------------------------
- set_property-dict { PACKAGE_PIN M19 IOSTANDARD LVCMOS33 } [get_ports { hdmi_ddc_sda_io}]
- set_property-dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { hdmi_ddc_scl_io}]
- #----------------------IIC1---------------------------
- set_property-dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { IIC_1_scl_io }]
- set_property-dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { IIC_1_sda_io }]
复制代码如果是《SD卡读BMP图片LCD显示实验》的Vivado工程,除了追加以上约束内容外,还需追加以下3行内容(需要删除之前的lcd的bl引脚约束,因为bl引脚的引出已经除掉): - #LCDbl:61,rst:62
- set_property -dict{ PACKAGE_PIN Y16 IOSTANDARD LVCMOS33 }[get_ports { GPIO_tri_io[7
- set_property -dict{ PACKAGE_PIN J15 IOSTANDARD LVCMOS33 }[get_ports { GPIO_tri_io[8
复制代码添加完引脚约束后,编译整个Vivado工程,在生成Bitstream之后,在菜单栏中选择 File > Export >Export hardware导出硬件,并在弹出的对话框中,勾选“Include bitstream”。 完成硬件导出后,就得到了我们需要的hdf硬件描述文件,在zynq_petalinux.sdk文件夹下,如下图所示:
图 17.2.7 hdf硬件描述文件 该文件包含着Vivado工程所对应的硬件平台信息,Petalinux根据这些信息来配置fsbl、uboot、内核等。 其他的文件我们不需要可以删除。我们将zynq_petalinux.sdk文件夹复制到share共享目录下(有关该目录信息可见《4.2 Ubuntu和Windows文件本地共享》小节),如下图所示。也可使用4.1节介绍的使用FTP传到Ubuntu系统中。
图 17.2.8 将zynq_petalinux.sdk文件夹复制到share共享目录下 1.2.2 设置Petalinux环境变量现在进入到Ubuntu系统中,打开终端,以普通用户运行即可,不需要使用root用户。在正式使用petalinux工具之前,需要先设置petalinux的作环境,在终端输入如下命令即可: sptl 执行结果如下图所示:
图 17.2.9 设置petalinux工作环境 1.2.3 创建petalinux工程为了方便工程的管理,我们在使用的用户的家目录下新建一个work/petalinux目录,作为petalinux的工程目录。在终端中输入如下命令新建work/petalinux目录: cd mkdir -p work/petalinux/ 现在我们创建一个名为“zynq_linux”的Petalinux工程,在终端中输入如下命令: petalinux-create -t project --template zynq -nzynq_linux template参数表明创建的petalinux工程使用的平台模板,此处的zynq表明使用的是zynq平台模板的petalinux工程,用于zynq-7000系列的芯片。name参数(此处简写为“-n”)后接的是petalinux工程名,如此处的“zynq_linux”。执行结果如下图所示:
图 17.2.10 创建Petalinux工程 可以看到该命令会自动在work/petalinux目录下创建一个名为zynq_linux的文件夹,也就是zynq_linux对应的Petalinux工程所在目录。 1.2.4 配置petalinux工程首次配置Petalinux工程是将hdf硬件描述文件文件导入到Petalinux工程中,Petalinux工具会解析hdf文件并弹出配置窗口。在终端中输入如下命令配置Petalinux工程: cd zynq_linux petalinux-config --get-hw-description /mnt/hgfs/share/zynq_petalinux.sdk/ 即进入到zynq_linux文件夹,并配置petalinux工程。“petalinux-config--get-hw-description”命令后面的文件夹就是我们复制到Windosw系统的share共享目录的zynq_petalinux.sdk文件夹,如果是通过其他方式如FTP传到Ubuntu系统中的,只要执行“petalinux-config --get-hw-description zynq_petalinux.sdk文件夹所在位置”即可。如果后面修改了Vivado工程,重新生成hdf文件后,可以重新执行“petalinux-config --get-hw-description zynq_petalinux.sdk文件夹所在位置”以重新配置Petalinux工程。 执行结果如下图所示:
图 17.2.11 配置petalinux工程 弹出petalinux工程配置窗口,如下图所示:
图 17.2.12 petalinux工程配置窗口 需要注意的是该窗口不可以使用鼠标操作,只能通过键盘操作,界面上方的英文就是简单的操作说明,操作方法如下: 通过键盘上的“↑”和“↓”键来选择要配置的菜单,按下“Enter”键进入子菜单。菜单中高亮的字母就是此菜单的热键,在键盘上按下此高亮字母对应的键可以快速选中对应的菜单。选中子菜单以后按下“Y”键就会将相应的配置选项写入配置文件中,菜单前面变为“< * >”。按下“N”键不编译相应的代码,按下“M”键就会将相应的代码编译为模块,菜单前面变为“< M >”。按两下“Esc”键退出,也就是返回到上一级,按下“?”键查看此菜单的帮助信息,按下“/”键打开搜索框,可以在搜索框输入要搜索的内容。 在配置界面下方会有五个按钮,这五个按钮的功能如下: <Select>:选中按钮,和“Enter”键的功能相同,负责选中并进入某个菜单。 <Exit>:退出按钮,和按两下“Esc”键功能相同,退出当前菜单,返回到上一级。 <Help>:帮助按钮,查看选中菜单的帮助信息。 <Save>:保存按钮,保存修改后的配置文件。 <Load>:加载按钮,加载指定的配置文件。 本实验我们无需更改该窗口的配置信息。不过由于该窗口菜单不多,我们就从上到下的简单地介绍下这些菜单。 首先按键盘上的下方向键移动到“LinuxComponents Selection”,然后按键盘上的“Enter”进入子菜单,子菜单内容如下图所示:
图 17.2.13 Linux Components Selection子菜单 中括号里的“*”表示为已使能配置。前两个选项表示会自动生成我们在《领航者ZYNQ之嵌入式开发指南》程序固化实验中的fsbl.elf文件和自动更新ps_init。下面两个选项用来配置u-boot和linux-kernel的来源,本实验保持默认来源配置,不做改动,后面的实验需要更改的时候再做介绍。按键盘上的“Esc”按键连按两次退出该子菜单。 “Auto ConfigSettings”菜单主要就是选择是否使能fsbl、Devicetree、Kernel和u-boot的自动配置,默认为自动配置,无需更改,就不看了。 “Subsystem AUTOHardware Settings”子菜单的内容如下图所示:
图 17.2.14 Subsystem AUTO Hardware Settings子菜单 进入到该界面的各个外设子菜单中,可以发现都已经设置好了默认配置,这些默认配置是根据hdf文件的信息自动配置的,基本上无需我们手动配置。在“Advanced bootableimages storage Settings”菜单中可配置启动引导镜像和内核镜像的存储媒介,默认为sd 卡,这里保持默认即可。
图 17.2.15 Advanced bootable images storage Settings菜单 返回到主界面(按四次“ESC”按键),设备树设置菜单“DTG Settings”和u-boot配置菜单“u-boot Configuration”一般保持默认即可。我们进入“ImagePackaging Configuration”子菜单,如下图所示:
图 17.2.16 Image Packaging Configuration子菜单 第一个选项便是根文件系统的类型的配置,默认为INITRAMFS,一般默认即可,如果我们需要运行Ubuntu或Debian的根文件系统时,选择SD card即可。另外从该界面我们可以看到,有“Copy final images to tftpboot”选项,当在Ubuntu的根文件下创建一个名为tftpboot的文件夹时,工程生成镜像后会自动将相关文件复制到/tftpboot目录中。 回到主界面,“FirmwareVersion Configuration”可以用来修改定制的linux系统的主机名和产品名,默认与该Petalinux工程同名,如果需要可修改。“Yocto Settings”进行与Yocto相关的设置,这里就不做介绍了。 按键盘上的右方向键(即右箭头),移动到底部的“Save”,按键盘上的“Enter”键,进入如下图所示的保存配置文件界面:
图 17.2.17 保存配置文件界面 按键盘上的“Enter”键确认,进入下图所示界面:
图 17.2.18 退出保存配置文件界面 再次按键盘上的“Enter”键确认,返会到原界面,踉按两次键盘上的“Esc”退出配置窗口。 如果后面想重新配置,只需输入“petalinux-config”命令即可重新配置。 这一步可能需要几分钟才能完成。这是因为PetaLinux会根据“Auto Config Settings --->”和“Subsystem AUTO Hardware Settings --->”来解析硬件描述文件,以获取更新设备树、U-Boot配置文件和内核配置文件所需的硬件信息。 例如,如果选择ps7_ethernet_0作为主以太网,并且启用了内核配置和U-Boot配置的自动更新,那么PetaLinux将自动启用其内核驱动程序,并更新U-Boot的配置文件以使用选择的以太网控制器。 等待一段时间后,完成petalinux工程的配置,如下图所示:
图 17.2.19 完成petalinux工程的配置 1.2.5 配置Linux内核现在我们开始定制Linux内核,在终端输入如下命令: petalinux-config -c kernel 执行结果如下: file:///C:/Users/WCY/AppData/Local/Temp/msohtmlclip1/01/clip_image032.png 图 17.2.20 定制Linux内核 等一段时间后会弹出Linux内核的配置界面,如下图所示:
图 17.2.21 内核配置界面 可以看到Petalinux默认使用的内核版本为4.14.0,当然也可以换成其它版本的内核。 这里使用的内核Xilinx官方已经做好了基础配置,如无特定需求,无需更改。另外关于Linux内核的配置在后面的Linux内核移植章节进行讲解,此处就不多做介绍了。这里采用Xilinx官方的默认配置即可,保存配置并退出。 1.2.6 配置Linux根文件系统在终端输入下面的命令可配置根文件系统,如果不需要配置可不执行该命令。 petalinux-config -c rootfs 下图就是根文件系统的配置界面:
图 17.2.22 根文件系统的配置界面 默认配置可满足一般使用,也可以根据需求来定制根文件系统,本实验保持默认配置。需要说明的是“PetaLinux RootFS Settings”可以用来设置root用户的密码,默认为“root”。后面登录的时候会用到。 保存配置并退出。 1.2.7 配置设备树文件如果需要配置设备树,可以编辑当前工程目录下的project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi文件。 我们可以打开这个文件进行编辑,将我们所需的按键、led、蜂鸣器和IIC设备添加到该设备树文件当中;设备树的概念源自于Linux内核当中,用于保存Linux系统中的各种设备信息,内核在启动过程当中会去解析设备树文件,获取设备所需的配置信息完成设备的初始化工作。 设备树的概念以及相关配置、语法涉及到了Linux内核驱动相关知识,并不是本篇学习的重点,所以这里并不会去深入给大家介绍,将会在Linux驱动部分的章节当中给大家做详细解说。 使用vi命令打开system-user.dtsi文件,如下所示: viproject-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 默认的文件内容如下,可见该文件需要我们自己手动配置。
图 17.2.23 system-conf.dtsi文件初始内容 我们把按键、led、蜂鸣器、USB和IIC设备的EEPROM和RTC添加到system-user.dtsi设备树当中,system-user.dtsi文件内容如下: - /include/"system-conf.dtsi"
-
- #defineGPIO_ACTIVE_HIGH 0
- #defineGPIO_ACTIVE_LOW 1
-
- /{
- model ="Navigator Development Board";
- compatible ="alientek,zynq-7020","xlnx,zynq-7000";
-
- usb_phy0:phy0@e0002000 {
- compatible ="ulpi-phy";
- #phy-cells= <0>;
- reg =<0xe0002000 0x1000>;
- view-port= <0x0170>;
- drv-vbus;
- };
-
- leds {
- compatible ="gpio-leds";
-
- gpio-led1{
- label ="ps_led1";
- gpios =<&gpio0 0 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
-
- gpio-led2{
- label ="ps_led2";
- gpios =<&gpio0 7 GPIO_ACTIVE_HIGH>;
- linux,default-trigger= "timer";
- };
-
- gpio-led3{
- label ="ps_led3";
- gpios =<&gpio0 8 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
-
- gpio-led4{
- label ="pl_led1";
- gpios =<&gpio0 58 GPIO_ACTIVE_HIGH>;
- linux,default-trigger= "timer";
- };
-
- gpio-led5{
- label ="pl_led2";
- gpios =<&gpio0 59 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
-
- gpio-led6{
- label ="pl_led3";
- gpios =<&gpio0 60 GPIO_ACTIVE_HIGH>;
- default-state = "on";
- };
- };
-
- keys {
- compatible ="gpio-keys-polled";
- poll-interval= <20>;
- autorepeat;
-
- touch-key{
- label ="touch_key";
- gpios =<&gpio0 56 GPIO_ACTIVE_HIGH>;
- linux,code= <1>; // ESC
- };
-
- gpio-key1{
- label ="pl_key1";
- gpios =<&gpio0 54 GPIO_ACTIVE_LOW>;
- linux,code= <105>; //Right
- };
-
- gpio-key2{
- label ="pl_key2";
- gpios =<&gpio0 55 GPIO_ACTIVE_LOW>;
- linux,code= <106>; //Left
- };
-
- gpio-key3{
- label ="ps_key1";
- gpios =<&gpio0 11 GPIO_ACTIVE_LOW>;
- linux,code= <103>; //Up
- };
-
- gpio-key4{
- label ="ps_key2";
- gpios =<&gpio0 12 GPIO_ACTIVE_LOW>;
- linux,code= <108>; //Down
- };
- };
-
- beep {
- compatible ="gpio-beeper";
- gpios =<&gpio0 57 GPIO_ACTIVE_HIGH>;
- };
- };
-
- &i2c1 {
- clock-frequency= <100000>;
- eeprom@50 {
- compatible ="atmel,24c64";
- reg =<0x50>;
- pagesize =<32>;
- };
- rtc@51 {
- compatible ="nxp,pcf8563";
- reg =<0x51>;
- };
- };
- &usb0 {
- status ="okay";
- dr_mode ="otg";
- usb-phy= <&usb_phy0>;
- };
复制代码设备树配置内容在我们的例程源码当中已经提供了,路径为:“领航者ZYNQ开发板资料盘(A盘)\4_SourceCode\ZYNQ_7020\3_Embedded_Linux\zynq_petalinux\1_customize_linux\software\petalinux\project-spec\meta-user\recipes-bsp\device-tree\files\system-user.dtsi”,大家可以打开这个文件将里面的内容拷贝到这个文件中。 设备树文件当中配置了6个gpio led灯,5个按键、一个蜂鸣器、IIC1和USB0。下面简单的讲解下gpioled的配置。 6个gpio led灯分别对应开发板的6个led灯,配置信息主要包括compatible(用于与内核驱动匹配的名字)、label(名字)、gpios(对应的GPIO管脚)、默认状态以及触发状态。 例如linux,default-trigger= " timer "表示默认的触发状态是timer模式,也可以改为heartbeat模式,可以用来判断系统是否还在运行,除此之外,还有其他一些内核定义好的触发状态;default-state = "on"表示默认led灯是亮着的;gpios = <&gpio0 7 GPIO_ACTIVE_HIGH>表示该led的控制管脚是gpio0_7,GPIO_ACTIVE_HIGH表示高电平有效(也就是高电平的时候led灯才会亮)。 其他的就不讲解了,后面驱动部分文档中会详细讲解。 内容编辑完成之后保存退出即可。 1.2.8 编译Petalinux工程现在我们就可以编译整个Petalinux工程了,在终端输入如下命令: petalinux-build 该命令将生成设备树DTB文件、fsbl文件、U-Boot文件,Linux内核和根文件系统映像。编译完成后,生成的映像将位于工程的images目录下。需要说明的是fsbl、U-Boot这两个我们在工程中并没有配置,这是因为Petalinux会根据hdf文件和17.2.4节的配置petalinux工程自动配置fsbl和uboot,如无特需要求,不需要再手动配置。 执行结果如下图所示:
图 17.2.24 编译整个Petalinux工程 其中有一个WARNING警告,这是Petalinux版本的问题,不影响实际使用,也不会对结果产生影响。 1.2.9 制作BOOT.BIN启动文件Petalinux提供了petalinux-package命令将PetaLinux项目打包为适合部署的格式,其中“petalinux-package --boot”命令生成可引导映像,该映像可直接与Zynq系列设备(包括Zynq-7000和Zynq UltraScale + MPSoC)或基于MicroBlaze的FPGA设计一起使用。对于Zynq系列设备,可引导格式为BOOT.BIN,可以从SD卡引导。对于基于MicroBlaze的设计,默认格式为MCS PROM文件,适用于通过Vivado或其他PROM编程器进行编程。 ZYNQ的启动文件BOOT.BIN一般包含fsbl文件、bitstream文件和uboot文件。使用下面命令可生成 BOOT.BIN文件: petalinux-package--boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force 参数“--fsbl./images/linux/zynq_fsbl.elf”指定fsbl文件的位置,如果不指定文件位置如用于指定bitstream文件的位置参数“--fpga”, Petalinux会自动使用默认位置。执行结果如下图所示:
图 17.2.25 生成 BOOT文件 1.2.10 制作SD启动卡如果使用SD卡引导linux系统启动,一般需要在SD卡上有2个分区。一个分区使用FAT32文件系统,用于放置启动镜像文件(如BOOT.BIN,linux镜像等),另一分区使用EXT4文件系统,用于存放根文件系统。 需要说明的是在6.2.4节配置petalinux工程中,“Image Packaging Configuration”子菜单根文件系统的类型的配置使用的是默认的INITRAMFS,所以只需要一个使用FAT32文件系统的分区就可以了。当设置为“SD card”则需要另一个存放根文件系统的分区。 本小节先讲解SD卡的分区和格式化,然后说明将哪些文件复制到SD卡中。此处的SD卡指的是那种小卡,也称为TF卡。 插入作为启动卡的SD卡到Ubuntu系统。特别提醒:如果SD卡中有需要的数据请先备份SD卡中的数据到其他存储设备如电脑磁盘。在Ubuntu系统中找到SD所在的节点,笔者的SD卡位于/dev/sdc。现在我们先给SD卡分区。在终端中输入如下命令: sudoumount /dev/sdc* sudofdisk /dev/sdc 输入“p”执行结果如下图所示:
图 17.2.26 给SD卡分区 可以看到当前的分区表,有一个FAT32的分区。在开始新分区之前需要将以前的分区删除,键入“d”,删除该分区,再次键入“d”时会出现下图所示的红色字体提示,表明已无存在的分区。
图 17.2.27 将以前的分区删除 下面开始新建分区。输入“n”创建一个新分区。通过选择'p'使其为主,使用默认分区号1和第一个扇区2048。设置最后一个扇区,也就是设置第一个分区的大小,一般设置500M足够了,通过输入“+ 500M”,为该分区预留500MB,如下图所示:
图 17.2.28 创建第一个新分区 现在设置分区类型,输入“t”,然后输入“c”,设置为“W95 FAT32 (LBA)”,如下图所示:
图 17.2.29设置分区类型 输入“a”,设为引导分区,如下图所示:
图 17.2.30 设为引导分区 第一个分区就创建好了,开始创建第二个分区。 通过键入“n”来创建根文件系统分区。后面一路默认就可以了,如下图所示:
图 17.2.31 创建第二个分区 如果现在输入“p”检查分区表,会看到刚刚创建的2个分区。如果没问题,键入“w”以写入到SD卡并退出。
图 17.2.32 写入分区到SD卡 完成了分区创建后,就可以格式化分区了。在终端输入如下命令: sudomkfs.vfat -F 32 -n BOOT /dev/sdc1 sudomkfs.ext4 -L rootfs /dev/sdc2 将第一个分区格式化成FAT32分区并命名为BOOT,将第二个分区格式化成ext4分区并命名为rootfs。 格式化分区之后就可以挂载分区了,挂载完成后,我们将该工程image/linux目录下的BOOT.BIN和image.ub文件拷贝到名为BOOT的分区也即/dev/sdc1分区中,如下图所示:
图 17.2.33 拷贝启动镜像到第一个分区 本实验只需要这两个文件即可,现在可以卸载SD卡了。 1.2.11 开发板启动模式设置将SD卡插入领航者开发板的SD卡槽(卡槽位于开发板背面),然后使用Mini USB连接线将开发板左侧的USB_UART接口与电脑连接,用于串口通信。领航者开发板连接SD(TF)卡的正面图和背面图如图 17.2.34和图 17.2.35所示:
图 17.2.34 开发板连接TF卡正面图
图 17.2.35 开发板连接TF卡背面图 接下来将领航者底板上的启动模式开关BOOT_CFG的两个开关均拨到下面(都置为OFF),即设置为从SD卡启动。不同的启动方式与两个拨码开关的状态对应关系如下图所示:
图 17.2.36 启动模式设置 最后连接开发板的电源线,并打开电源开关。 1.2.12 打开串口上位机,进入Linux系统打开Putty串口上位机或其它串口上位机。上位机打印Linux启动信息如下:
图 17.2.37 打印Linux启动信息 停留在登录处,此处使用root用户登录,登录密码为“root”(去掉双引号),登录进去后,界面如下:
图 17.2.38 使用root用户登录 如果插入网线到PS的网口,会自动获取ip(需要路由器支持DHCP服务),
图 17.2.39 插入网线到PS的网口 如果我们把视线移到开发板,会看到板上的LED灯全都是亮的,其中,底板上的PL_LED0和PS_LED0同频闪烁,这是设备树配置文件产生的结果,还记得那个“timer”么。 至此我们就走完了Petalinux开发Linux的整个流程。正如俗语所说师傅领进门,修行靠个人,Petalinux的功能远不止如此,其他功能读者有兴趣可进行探索,建议参考ug1144参考手册,也就是Xilinx官方编写的PetaLinux工具使用说明文档,已提供在开发板光盘资料:领航者ZYNQ开发板资料盘(A盘)\8_ZYNQ&FPGA参考资料\Xilinx\User Guide\ug1144-petalinux-tools-reference-guide.pdf。 特别说明:以后我们使用主机终端指代电脑上Ubuntu系统的终端,串口终端指代通过串口线连接到领航者开发板显示在串口上位机中的终端。
|