ZYNQ学习笔记-Petalinux的使用
Petalinux可以简化ZYNQ-7000的Linux开发,这里记录一下基本使用流程。
设计流程
Petalinux设计流程一般如下:
- 创建硬件。使用vivado创建工程,设定硬件,导出hdf文件。
- 创建Petalinux工程。
- 导入硬件。导入vivado生成的hdf。
- 设置工程。
- 设置内核。
- 设置根文件系统。
- 配置设备树。
- 编译工程。
- 打包制作BIN文件。
创建硬件工程
这里需要使用vivado生成硬件工程。
这边偷懒一下,使用了小梅哥的BX71开发板给的出厂工程。其BlockDesign如图所示:
可以看见它HDMI输出了一个色条。并且使用了PL端的ENET,并且为了适配板上的物理层芯片使用加了一个转换模块。
处理器的设置如下,开启了QSPI,UART1(与板子上的转换芯片相连),ENET0,USB0,SD0,GPIO。
ENET使用了EMIO(PL)端,并使用了MDIO(配置信号线)。
这里导出硬件信息,注意包含bit流。最后在工程目录下的sdk目录中得到hdf文件。
在linux中创建petalinux工程文件夹,在该文件夹下创建hdf文件夹,将hdf文件夹整个拷贝到hdf下。
创建Petalinux工程
使用petalinux工程前,先使用source命令运行安装目录下的setting.sh
文件,添加环境变量。
1 | source petalinux2018.3/settings.sh |
切换到之前的工程目录,在终端输入以下命令创建工程:
1 | petalinux-create -t project --template zynq -n mylinux |
-t project
:表明这是一个linux工程,而不是linux应用之类。-n mylinux
:指定工程名为mylinux。--template zynq
:设定这是一个ZYNQ的工程。
配置Petalinux工程
第一次配置时,需要将hdf文件导入到工程中,petalinux解析完成后会弹出配置界面。进入刚刚创建的mylinux工程,输入以下命令导入。
1 | petalinux-config --get-hw-description <hdf 文件 |
导入成功后会自动弹出配置窗口:
这里对各个选项进行简单的说明。
- Linux Components Selection
星号表示已经使能。First Stage Bootloader
是自动生成fsbl.elf文件。第二个是自动更新ps_init,即fsbl中的第一个函数。自动配置会让程序跟着hdf文件更新。下面两个是配置u-boot和linux内核的来源,一般默认就行。
- Auto Config Setting
自动配置各种组件(根据hdf文件)。
- Subsystem AUTO Hardware Settings
配置一些硬件设置。
第一个为系统处理器设置,程序跑在哪个核。
第二个用来配置内存大小以及程序基地址等等,根据hdf文件自动生成。
第三个选择使用哪个串口进行标志输入输出以及波特率,这里只开了一个串口。
第四个为网络设置,包括使用主网口,MAC地址设置和是否自动IP地址获取(DHCP)。
第五个设置FLASH(QSPI),设置FLASH的分区,用于从FLASH启动LInux时。
第六个设置默认的SD卡设备。
第七个设置RTC时钟,这里没开启。
最后为镜像设置。设置各种镜像存储在那个存储介质,包括boot(fsbl,bitstream,uboot,dtb(可选))、u-boot环境变量、jffs2文件系统(用来存配置信息)、dtb来源(设备树)。
- DTG Settings
MACHINE_NAME设置开发板的名字,用来对应开发板设备树(国外总是喜欢以开发板为配置单位)默认即可。
Kernel Bootargs设置,设置内核启动变量。
Devicetree flags 设备树相关
Devicetree overlay 设备树相关
Remove PL 设备树不自动包含PL端的设备。
- u-boot Configuration
配置uboot相关的设置。
第一个不知道。
第二个设置了uboot的配置文件。
第三个设置netboot,网络启动相关。
第四个设置TFTP服务器ip地址,网络下载镜像时使用。
- Image Packaging Configuration
第一个设置根文件系统的类型。默认是放在RAM中(内存模拟文件系统—根目录在内存中),和内核镜像打包在一起。也可以放在SD_card。
INITRAMFS 类型的根文件系统每次重新启动 linux 系统都是全新的、 未改动过的,也就是说启动系统后进行的所有修改掉电后就全部丢失了, 再次重新启动还是之前未修改过的根文件系统,选择 SD card 可以将根文件系统放在 SD 卡的 ext4 分区,这样启动系统后进行的所有修改掉电后就不会丢失了。 ——引用自正点原子
第二个设置了内核镜像名字。
第三个设备树相关。
第四个设置是否将镜像自动拷贝到tftp服务器目录中,这里没有搭建,设置为不使能。
第五个设置tftp服务器目录所在。
- Firmware Version Configuration
配置版本名,可自定义。
- Yocto Settings
底层的设置。Petalinux底层就是Yocto。
配置完成后进行保存Save
,程序会自动进行配置。
配置配置内核
终端输入如下命令配置内核:
1 | petalinux-config -c kernel |
这里由于使用了GMII 2 RGMIIIP核,需要添加相应的驱动。
Device Driver->Network device support->PHY Device support and infrastructure
中使能xilinx GMII2RGMII converter driver
。
配置Uboot
- 注意:由于petalinux2018的bug,如果将设备树放在sd卡,最后会生成booti(64位下的)命令,导致无法启动linux,这里需要将
project-spec/meta-plnx-generated/recipes-bsp/u-boot/configs/platform-auto.h
中的
1 | default_bootcmd=run uenvboot; run cp_kernel2ram && run cp_dtb2ram && booti ${netstart} - ${dtbnetstart} |
将上面的booti改成bootm.
配置根文件系统
终端输入如下命令配置内核:
1 | petalinux-config -c rootfs |
- Filesystem Packages
配置常用的工具软件,包括内核调试软件、流媒体软件、 Python 软件以及图形界面软件等 。
- Petalinux Package Groups
选择Petalinux提供的软件包,比如包含opencv的相关软件包依赖。
- Image Features
配置根文件系统的某些功能,如是否支持 ssh,使用 dropbear
的 ssh 还是 openssh 等。如果不希望每次启动 linux 后都得输入密码验证,可以使能该菜单下的“ debug-tweaks”选项。
- apps
构建用户应用。
- user packages
配置自定义软件包。
- petalinux rootfs settings
主要用来设置root的密码。
最后可以编译出各种rootfs文件,可以将 rootfs.tar.gz 或者 rootfs.tar.bz2文件解压到 SD 卡的第二个分区——ext4 文件系统分区来测试根文件系统 。
配置设备树
如果需要配置设备树,可以编辑当前 petalinux 工程目录下的 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 文件。
1 | vim project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi |
编译Petalinux工程
配置全部完成后,使用命令编译。
1 | petalinux-build |
制作镜像
编译完成后,petalinux生成了一系列文件,此时需要将这些分散的文件部署整合成易于部署的镜像。
1 | petalinux-package --boot --fsbl --fpga --u-boot --force |
–boot说明生成镜像
–fsbl指定镜像中的fsbl文件位置
–fpga指定bit流文件
–u-boot指定uboot即用户代码位置
–force强制覆盖已生成的文件
文件都默认在images/linux
下,不指定就会使用默认路径。
BOOT.BIN就是启动镜像,image.ub是linux镜像。
制作SD启动卡
使用SD卡引导linux启动,一般需要两个分区。一个是FAT32文件系统,用来放置启动镜像(BOOT.BIN,linux镜像),另外一个是EXT4分区,用于存放根文件系统。由于本篇设置的是INITRAMFS,没有用到SD卡的文件系统,因此只需要FAT32分区。
将读卡器插入到电脑上,连接到虚拟机,查看其符号,我这里是/dev/sdb
。
如果使用图形界面。插入后会自动挂载,先取消挂载,然后进行分区。
1 | umount /dev/sdb* |
在fdisk界面输入p:
可以看到有一个FAT32分区/dev/sdb1
。这里输入d将该分区删除。
接着输入n新建分区,输入p为主分区,使用默认分区号1和2048第一个扇区,设置第一个分区大小为100M。
之后先后输入t,c,将分区设为W95 FAT32(代号为c)。
之后输入a设置为引导分区。
此时FAT分区创建完毕,之后创建ext分区。
输入n,之后全部默认,将剩余的空间全部分走。
之后输入w保存,退出。
之后在分区创建文件系统:
1 | sudo mkfs.vfat -F 32 -n boot /dev/sdb1 |
如果使用图形界面,此时可以看到自动挂载了两个U盘。如果没有图形界面,还需手动挂载sdb1和sdb2。之后将BOOT.BIN和image.ub拷贝到boot下就可以了。
SD启动
之后将SD插入到卡槽,利用串口终端即可登录。默认账户和密码为root。
FLASH启动
当Linux文件系统不是太大时,可以直接将其放在FLASH中。其实就是将BOOT.BIN放在FLASH里面,在config中设置boot的路径后将最后生成的文件通过SDK的program flash烧录到QSPI FLASH即可。
问题
编译时报错提示没有“phy1”
1 | system-top.dtb: ERROR (phandle_references): /amba/ethernet@e000b000: Reference to non-existent node or label "phy1" |
这是由于在配置中使能了MDIO(配置端口),引用了一个外部的物理层芯片却没有为其添加设备树导致的,外部芯片无法自动添加到设备树中。这里需要手动添加:
打开文件:project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi
在这个文件中添加自定义的设备树。
在文件最后添加:
1 | &gem0{ |
&gem0表示重写gem0,在其中添加一个phy1。
这本质还是当前版本的petalinux不能正确的读取hdf生成设备树,请使用与vivado相同版本的petalinux。