正点原子嵌入式Linux学习笔记1(Petalinux设计和U-Boot篇)

Petalinux简介

  1. Petalinux是Xilinx针对嵌入式Linux开发所推出的开发套件、开发工具
  2. Petalinux包括U-Boot源码、Linux内核源码以及根文件系统
  3. 嵌入式Linux系统三巨头:U-Boot、Linux内核以及rootfs

Petalinux设计流程

  1. 搭建Vivado工程,导出hdf文件
  2. 创建一个petalinux工程
  3. 将hdf文件导入到petalinux工程(将vivado设计应用到petalinux工程)
  4. 配置petalinux工程(包括配置U-Boot、配置内核以及配置根文件系统)
  5. 编译petalinux工程(U-Boot镜像、内核镜像以及rootfs,bitstream,fsbl镜像文件)
  6. 启动开发板

Petalinux设计实战

导出hdf文件

  1. 编译好整个vivado工程,生成Bitstream之后,在菜单栏中选择File > Export > Export hardware 导出硬件,勾选Include bitstream,然后就得到了hdf硬件描述文件
  2. 不妨新建一个目录专门存放hdf文件mkdir zynq_petalinx.sdk
  3. 通过Mobaxterm将hdf文件传到该目录下

创建petalinux工程

  1. 终端输入sptl 进入petalinux工作环境
  2. mkdir 新建一个工作目录并进入该目录
  3. 创建名为zynq_linux的petalinux工程petalinux-create -t project --template zynq -n zynq_linux

hdf导入到petalinux工程

  1. 进入工作目录 cd zynq_linux
  2. 导入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卡

开发板启动

  1. 将SD卡插入卡槽,连接串口通信线
  2. 将启明星底板上的启动模型设置为从SD卡启动(双OFF)
  3. 连接电源线,上电
  4. 打开Mobaxterm,连接串口,登录linux系统

U-BOOT

U-BOOT简介

  1. U-BOOT全称Universal Boot Loader(通用启动、引导程序),本质上是一个开源的裸机程序,作用在于去启动、引导Linux内核或者其他内核。
  2. U-BOOT包含SD卡或者QSPI等设备的驱动程序、I2C等,还包括文件系统以及网络相关的协议
  3. 支持多种操作系统和多种硬件平台
  4. 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的启动

  1. BOOT.BIN启动文件已经存在SD卡或者QSPIT等存储介质中
  2. FSBL代码已经集成在BOOT.BIN文件中
  3. 要启动FSBL,就要先从BOOT.BIN文件中找到FSBL代码,再将其拷贝到SRAM中,再去运行FSBL代码
  4. 以上操作由BootROM来完成

BootROM

  1. BootROM是固化在ZYNQ芯片内部的一个程序,存放在SROM中
  2. BootROM支持文件系统操作,如Fat 32

总结

对于ZYNQ平台,对于嵌入式Linux系统来说:

  1. Linux内核由U-BOOT引导、启动
  2. U-BOOT由FSBL引导、启动
  3. FSBL由ZYNQ片内BootROM引导、启动

SD卡启动流程

详见UG585手册 Ch6:Boot and Configuration–BootROM Code–SD Card Boot

  1. 初始化MIO引脚,将MIO40~MIO45复用为SD0外设所对应的CLK/CMD/DATA引脚
  2. 初始化SD卡外设,驱动SD卡,实现SD卡读写测试
  3. 对SD卡读写进行测试
  4. 从SD卡文件系统当中读取BOOT.BIN文件,并对BOOTROM头进行解析
  5. 得到FSBL代码的运行地址启动FSBL

QSPI启动流程

详见UG585手册 Ch6:Boot and Configuration–BootROM Code–Quad-SPI Boot

  1. 初始化MIO引脚,将MIO引脚复用为QSPI外设所需的引脚功能
  2. 初始化QSPI外设,驱动QSPI Flash设备,可以实现QSPI读写操作
  3. 对QSPI进行读写测试
  4. 从QSPI存储介质中读取BOOT.BIN文件,并对BootROM头进行解析
  5. 得到FSBL代码的运行地址启动FSBL

制作BOOT.BIN文件

U-BOOT操作命令

基础命令

  1. 查询命令help 很重要!不懂就查
  2. 获取板子信息bdinfo
  3. 打印字符串echo
  4. 获取版本信息version

环境变量命令

  1. 查看环境变量printenv
    printenv 查看U-BOOT所有环境变量
    printenv 变量名 查看指定的一个环境变量
  2. 添加/设置环境变量setenv
    setenv 变量名 变量值
  3. 删除环境变量setenv
    setenv 变量名 即为某一变量名添加/设置一个变量值,该值为空
  4. 删除环境变量setenv
  5. 保存环境变量saveenv
  6. env命令合集
    env default -a 最为常用,恢复U-BOOT环境变量为默认环境变量
    env delete 变量名 “删”
    env print 变量名(可选) “查”
    env save “保存”
    env set 变量名 变量值 “设置/添加”

命令行操作下的环境变量都是在内存中维护
只有将环境变量保存到外部Flash存储设备中,才能让之前修改的环境变量在下一次启动时生效

内存操作命令

  1. 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命令行中,所有数字的进制都是十六进制
  2. nm命令——memory modify,用于修改固定内存地址的数据
    用法:nm [.b, .w, .l] address
    按q退出修改模式
  3. mm命令——memory modify,用于修改自增内存地址的数据
    用法同nm,不过内存地址不固定,内存地址会自增长
  4. mw命令——memory write,写内存操作,用于将一段内存地址填充为某一个数据
    用法:mw [.b, .w, .l] address value [count]
  5. cp命令——memory copy,用于实现内存数据之间的拷贝
    用法:cp [.b, .w, .l] source target count
    source 源地址
    target 目标地址
    count 数据数量
  6. 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'

网络操作命令

  1. ping 命令——用于测试开发板与另一台主机之间的网络连通性
    用法:ping pingAddress 只能ping某一个ip地址
    开发板的网络相关环境变量需要提前设置,包括ipaddr、gatewayip、netmask
  2. nfs 命令——使用NFS协议通过网络启动镜像
    用法:nfs [loadAddress] [[hostIPaddr:]bootfilename]
    在使用该命令之前需要先设置serverip这个环境变量
  3. tftboot 命令——通过tftp协议下载文件到开发板内存中
    用法:tftpboot [loadAddress] [[hostIPaddr:]bootfilename]
  4. tftput 命令——将内存中数据通过tftp协议上传到tftp服务器,以文件的形式存在
  5. dhcp 命令——使用DHCP协议下载文件
    用法:dhcp [loadAddress] [[hostIPaddr:]bootfilename]
  6. bootp 命令——通过BOOTP/TFTP协议下载文件,同dhcp命令
    用法:bootp [loadAddress] [[hostIPaddr:]bootfilename]

Fat文件系统操作命令

  1. fstype 命令——用于查看一个文件系统的类型
    用法:fstype :
    interface 用于描述接口类型,mmc、usb等
    dev 用于指定设备,设备编号都是从0开始的
    part 用于指定分区,分区编号都是从1开始的
  2. fatinfo 命令——用于查看fat文件系统信息
    用法:fatinfo []
    dev 为必选参数
    part 为可选参数
  3. fatls 命令——用于列举出Fat文件系统某个目录下的文件,默认根目录"/"
    用法:fatls [] [directory]
    例:fatls mmc 0:1
    directory 可选参数,用于指定查看的目录,目录表示方法同Linux系统
  4. fatload 命令——用于从fat文件系统中读取文件到内存中
    用法:fatload [ [ [ [bytes [pos]]]]]
    常用方法:fatload interface dev:part addr filename
  5. fatwrite 命令——用于将内存中的数据写入到Fat文件系统中
    用法:fatwrite []
    常用方法:fatwrite interface dev:part addr filename bytes

Ext4、Ext2文件系统操作命令

  1. ext4ls 命令——用于列举出Ext4文件系统某个目录下的文件,默认根目录"/"
    用法:ext4ls [] [directory]
    例:ext4ls mmc 0:2
  2. ext4load 命令——用于从Ext4文件系统中读取文件到内存中
    用法:ext4load [ [ [ [bytes [pos]]]]]
    常用方法:ext4load interface dev:part addr filename
  3. ext4write 命令——用于将内存中的数据写入到Ext4文件系统中
    用法:ext4write
    常用方法:ext4write interface dev:part addr sizebytes

Ext2文件系统操作命令只需将以上命令中的Ext4换成Ext2即可

文件系统操作命令

以下三条命令与具体的文件系统类型无关,即既可以用于Fat,也可以用于Ext文件系统

  1. ls 命令——用于列出文件系统中的所有文件和文件夹
    用法:ls [ [directory]]
  2. load 命令——用于读取文件系统中的文件到内存中
    用法:load [ [ [ [bytes [pos]]]]]
  3. save 命令——用用于将内存中的数据写入到文件系统中
    用法:save bytes [pos]

串口下载操作命令

  1. loadb 命令——通过串口的方式下载文件到内存中,使用kermit mode
    用法:loadb [ off ] [ baud ]
    off 指的是内存地址
    baud 即波特率,一般是115200
  2. loadx 命令——通过串口的方式下载文件到内存中,使用xmodem mode
    用法:loadb [ off ] [ baud ]
  3. loady 命令——通过串口的方式下载文件到内存中,使用ymodem mode
    用法:loadb [ off ] [ baud ]

加载FPGA镜像相关命令

  1. fpga info 命令——查看FPGA信息
    用法:fpga info [ dev ]
  2. fpga loadb 命令——从.bit文件加载FPGA,用该命令前先将bit文件拷贝到开发板内存中
    用法:fpga loadb [dev] [address] [size]

你可能感兴趣的:(嵌入式学习,linux,fpga开发)