Petalinux简介
- Petalinux是Xilinx针对嵌入式Linux开发所推出的开发套件、开发工具
- Petalinux包括U-Boot源码、Linux内核源码以及根文件系统
- 嵌入式Linux系统三巨头:U-Boot、Linux内核以及rootfs
Petalinux设计流程
- 搭建Vivado工程,导出hdf文件
- 创建一个petalinux工程
- 将hdf文件导入到petalinux工程(将vivado设计应用到petalinux工程)
- 配置petalinux工程(包括配置U-Boot、配置内核以及配置根文件系统)
- 编译petalinux工程(U-Boot镜像、内核镜像以及rootfs,bitstream,fsbl镜像文件)
- 启动开发板
Petalinux设计实战
导出hdf文件
- 编译好整个vivado工程,生成Bitstream之后,在菜单栏中选择File > Export > Export hardware 导出硬件,勾选Include bitstream,然后就得到了hdf硬件描述文件
- 不妨新建一个目录专门存放hdf文件
mkdir zynq_petalinx.sdk
- 通过Mobaxterm将hdf文件传到该目录下
创建petalinux工程
- 终端输入
sptl
进入petalinux工作环境 mkdir
新建一个工作目录并进入该目录- 创建名为zynq_linux的petalinux工程
petalinux-create -t project --template zynq -n zynq_linux
hdf导入到petalinux工程
- 进入工作目录
cd zynq_linux
- 导入hdf
petalinux-config --get-hw-description **/zynq_petalinx.sdk/
后面的路径为hdf所在目录地址
配置petalinux工程
上一步完成后会自动弹出配置窗口
当然也可以通过这个命令重新配置
petalinux-config
一般默认配置,这一部分略
配置Linux内核
终端输入如下命令
petalinux-config -c kernel
无特殊需求,无需更改
配置Linux根文件系统
终端输入以下命令可配置根文件系统
petalinux-config -c rootfs
无特殊需求,无需更改
备注:root用户密码,默认为“root”
配置设备树文件
如果需要配置设备树,则可以编辑当前工程目录下的project-spec/meta-user/recipes-bsp/devicetree/files/system-user.dtsi
文件
无特殊需求,无需更改
编译petalinux工程
编译整个petalinux工程命令
petalinux-build
optional: 可选单独编译命令如下
-c u-boot #编译U-BOOT
-c kernel #编译内核
-c rootfs #编译根文件系统
制作BOOT.BIN启动文件
Petalinux 提供了petalinux-package 命令将 PetaLinux 项目打包为适合部署的格式
petalinux-package --boot
命令可生成可引导映像,可直接与Zynq设备的FPGA设计一起使用
ZYNQ的启动文件BOOT.BIN一般包含fsbl文件、bitstream文件和U-BOOT文件
使用下面的命令可生成BOOT.BIN文件
petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force
参数--boot
表明我们要通过petalinux-package
命令生成BOOT.BIN启动镜像文件
参数--fsbl
用于指定 fsbl 镜像文件的位置
参数--fpga
用于指定 bitstream文件的位置
参数--u-boot
用于指定 U-BOOT文件的位置
参数--force
表示强制覆盖当前目录下的BOOT.BIN文件
制作SD启动卡
配置过程详见正点原子启明星ZYNQ之Linux开发指南第六章6.2.10节
插入SD卡,连接到虚拟机,会出现一个BOOT分区
然后将该工程image/linux
目录下的BOOT.BIN和image.ub文件拷贝到BOOT分区,最后拔出SD卡
开发板启动
- 将SD卡插入卡槽,连接串口通信线
- 将启明星底板上的启动模型设置为从SD卡启动(双OFF)
- 连接电源线,上电
- 打开Mobaxterm,连接串口,登录linux系统
U-BOOT
U-BOOT简介
- U-BOOT全称Universal Boot Loader(通用启动、引导程序),本质上是一个开源的裸机程序,作用在于去启动、引导Linux内核或者其他内核。
- U-BOOT包含SD卡或者QSPI等设备的驱动程序、I2C等,还包括文件系统以及网络相关的协议
- 支持多种操作系统和多种硬件平台
- U-BOOT源码种类很多,有U-BOOT官方提供的,有Soc厂商(比如Xilinx)提供的,当然也有开发板厂商提供的。
U-BOOT与FSBL
FSBL全称First Stage Boot Loader(第一阶段启动、引导程序)
即FSBL是开发板在开机上电后运行的第一段代码
系统启动后,FSBL代码会第一个运行,用于引导、启动用户裸机程序
在嵌入式Linux系统中,对于ZYNQ平台来说,BOOT.BIN = FSBL + U-BOOT + bitstream
即先由FSBL启动U-BOOT,再由U-BOOT用于启动内核
FSBL的启动
- BOOT.BIN启动文件已经存在SD卡或者QSPIT等存储介质中
- FSBL代码已经集成在BOOT.BIN文件中
- 要启动FSBL,就要先从BOOT.BIN文件中找到FSBL代码,再将其拷贝到SRAM中,再去运行FSBL代码
- 以上操作由BootROM来完成
BootROM
- BootROM是固化在ZYNQ芯片内部的一个程序,存放在SROM中
- BootROM支持文件系统操作,如Fat 32
总结
对于ZYNQ平台,对于嵌入式Linux系统来说:
- Linux内核由U-BOOT引导、启动
- U-BOOT由FSBL引导、启动
- FSBL由ZYNQ片内BootROM引导、启动
SD卡启动流程
详见UG585手册 Ch6:Boot and Configuration–BootROM Code–SD Card Boot
- 初始化MIO引脚,将MIO40~MIO45复用为SD0外设所对应的CLK/CMD/DATA引脚
- 初始化SD卡外设,驱动SD卡,实现SD卡读写测试
- 对SD卡读写进行测试
- 从SD卡文件系统当中读取BOOT.BIN文件,并对BOOTROM头进行解析
- 得到FSBL代码的运行地址启动FSBL
QSPI启动流程
详见UG585手册 Ch6:Boot and Configuration–BootROM Code–Quad-SPI Boot
- 初始化MIO引脚,将MIO引脚复用为QSPI外设所需的引脚功能
- 初始化QSPI外设,驱动QSPI Flash设备,可以实现QSPI读写操作
- 对QSPI进行读写测试
- 从QSPI存储介质中读取BOOT.BIN文件,并对BootROM头进行解析
- 得到FSBL代码的运行地址启动FSBL
制作BOOT.BIN文件
U-BOOT操作命令
基础命令
- 查询命令
help
很重要!不懂就查 - 获取板子信息
bdinfo
- 打印字符串
echo
- 获取版本信息
version
环境变量命令
- 查看环境变量
printenv
printenv
查看U-BOOT所有环境变量
printenv 变量名
查看指定的一个环境变量 - 添加/设置环境变量
setenv
setenv 变量名 变量值
- 删除环境变量
setenv
setenv 变量名
即为某一变量名添加/设置一个变量值,该值为空 - 删除环境变量
setenv
- 保存环境变量
saveenv
- env命令合集
env default -a
最为常用,恢复U-BOOT环境变量为默认环境变量
env delete 变量名
“删”
env print 变量名(可选)
“查”
env save
“保存”
env set 变量名 变量值
“设置/添加”
命令行操作下的环境变量都是在内存中维护
只有将环境变量保存到外部Flash存储设备中,才能让之前修改的环境变量在下一次启动时生效
内存操作命令
- md命令——memory display,用于查看内存数据
用法:md [.b, .w, .l] address [# of objects]
md.b 表示以1个字节为单位进行数据显示
md.w 表示以2个字节为单位进行数据显示
md.l 表示以4个字节为单位进行数据显示
md 默认以4个字节为单位进行数据显示,即md.l
address 内存起始地址
[# of objects] 可选参数,表示显示多少个数据
U-BOOT命令行中,所有数字的进制都是十六进制 - nm命令——memory modify,用于修改固定内存地址的数据
用法:nm [.b, .w, .l] address
按q退出修改模式 - mm命令——memory modify,用于修改自增内存地址的数据
用法同nm,不过内存地址不固定,内存地址会自增长 - mw命令——memory write,写内存操作,用于将一段内存地址填充为某一个数据
用法:mw [.b, .w, .l] address value [count]
- cp命令——memory copy,用于实现内存数据之间的拷贝
用法:cp [.b, .w, .l] source target count
source 源地址
target 目标地址
count 数据数量 - cmp命令——memory compare,比较两个内存地址中存储的数据是否一致
用法:cmp [.b, .w, .l] addr1 addr2 count
EMMC和SD卡操作命令
U-BOOT 支持 EMMC 和 SD 卡,统一使用 mmc 来代指 EMMC 和 SD 卡
mmc
命令合集
mmc info - display info of the current MMC device
mmc read addr blk# cnt
mmc write addr blk# cnt
mmc erase blk# cnt
mmc rescan
mmc part - lists available partition on current mmc device
mmc dev [dev] [part] - show or set current mmc device [partition]
mmc list - lists available devices
mmc hwpartition [args...] - does hardware partitioning
QSPI操作命令
sf
命令集
sf probe [[bus:]cs] [hz] [mode] - init flash device on given SPI bus and chip select
sf read addr offset|partition len - read `len' bytes starting at
`offset' or from start of mtd
`partition'to memory at `addr'
sf write addr offset|partition len - write `len' bytes from memory
at `addr' to flash at `offset'
or to start of mtd `partition'
sf erase offset|partition [+]len - erase `len' bytes from `offset'
or from start of mtd `partition'
`+len' round up `len' to block size
sf update addr offset|partition len - erase and write `len' bytes from memor y
at `addr' to flash at `offset'
or to start of mtd `partition'
sf protect lock/unlock sector len - protect/unprotect 'len' bytes starting
at address 'sector'
USB操作命令
usb start - start (scan) USB controller
usb reset - reset (rescan) USB controller
usb stop [f] - stop USB [f]=force stop
usb tree - show USB device tree
usb info [dev] - show available USB devices
usb test [dev] [port] [mode] - set USB 2.0 test mode (specify port 0 to indicate the device's upstream port) Available modes: J, K, S[E0_NAK], P[acket], F[orce_Enable]
usb storage - show details of USB storage devices
usb dev [dev] - show or set current USB storage device
usb part [dev] - print partition table of one or all USB storage devices
usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'
to memory address `addr'
usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'
from memory address `addr'
网络操作命令
ping
命令——用于测试开发板与另一台主机之间的网络连通性
用法:ping pingAddress
只能ping某一个ip地址
开发板的网络相关环境变量需要提前设置,包括ipaddr、gatewayip、netmasknfs
命令——使用NFS协议通过网络启动镜像
用法:nfs [loadAddress] [[hostIPaddr:]bootfilename]
在使用该命令之前需要先设置serverip这个环境变量tftboot
命令——通过tftp协议下载文件到开发板内存中
用法:tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
tftput
命令——将内存中数据通过tftp协议上传到tftp服务器,以文件的形式存在dhcp
命令——使用DHCP协议下载文件
用法:dhcp [loadAddress] [[hostIPaddr:]bootfilename]
bootp
命令——通过BOOTP/TFTP协议下载文件,同dhcp
命令
用法:bootp [loadAddress] [[hostIPaddr:]bootfilename]
Fat文件系统操作命令
fstype
命令——用于查看一个文件系统的类型
用法:fstype <interface> <dev>:<part>
interface 用于描述接口类型,mmc、usb等
dev 用于指定设备,设备编号都是从0开始的
part 用于指定分区,分区编号都是从1开始的fatinfo
命令——用于查看fat文件系统信息
用法:fatinfo <interface> [<dev[:part]>]
dev 为必选参数
part 为可选参数fatls
命令——用于列举出Fat文件系统某个目录下的文件,默认根目录"/"
用法:fatls <interface> [<dev[:part]>] [directory]
例:fatls mmc 0:1
directory 可选参数,用于指定查看的目录,目录表示方法同Linux系统fatload
命令——用于从fat文件系统中读取文件到内存中
用法:fatload <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
常用方法:fatload interface dev:part addr filename
fatwrite
命令——用于将内存中的数据写入到Fat文件系统中
用法:fatwrite <interface> <dev[:part]> <addr> <filename> [<bytes>]
常用方法:fatwrite interface dev:part addr filename bytes
Ext4、Ext2文件系统操作命令
ext4ls
命令——用于列举出Ext4文件系统某个目录下的文件,默认根目录"/"
用法:ext4ls <interface> [<dev[:part]>] [directory]
例:ext4ls mmc 0:2
ext4load
命令——用于从Ext4文件系统中读取文件到内存中
用法:ext4load <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
常用方法:ext4load interface dev:part addr filename
ext4write
命令——用于将内存中的数据写入到Ext4文件系统中
用法:ext4write <interface> <dev[:part]> <addr> <absolute filename path>
常用方法:ext4write interface dev:part addr <absolute filename path> sizebytes
Ext2文件系统操作命令只需将以上命令中的Ext4换成Ext2即可
文件系统操作命令
以下三条命令与具体的文件系统类型无关,即既可以用于Fat,也可以用于Ext文件系统
ls
命令——用于列出文件系统中的所有文件和文件夹
用法:ls <interface> [<dev[:part]> [directory]]
load
命令——用于读取文件系统中的文件到内存中
用法:load <interface> [<dev[:part]> [<addr> [<filename> [bytes [pos]]]]]
save
命令——用用于将内存中的数据写入到文件系统中
用法:save <interface> <dev[:part]> <addr> <filename> bytes [pos]
串口下载操作命令
loadb
命令——通过串口的方式下载文件到内存中,使用kermit mode
用法:loadb [ off ] [ baud ]
off 指的是内存地址
baud 即波特率,一般是115200loadx
命令——通过串口的方式下载文件到内存中,使用xmodem mode
用法:loadb [ off ] [ baud ]
loady
命令——通过串口的方式下载文件到内存中,使用ymodem mode
用法:loadb [ off ] [ baud ]
加载FPGA镜像相关命令
fpga info
命令——查看FPGA信息
用法:fpga info [ dev ]
fpga loadb
命令——从.bit文件加载FPGA,用该命令前先将bit文件拷贝到开发板内存中
用法:fpga loadb [dev] [address] [size]