petalinux自学笔记

petalinux-boot启动
petalinux-build编译
petalinux-config配置
petalinux-create创建
petalinux-package打包
每次进入终端都需要配置petalinux环境
已经使用替代sptl(source petalinux)启动
设计流程:
1.搭建vivado工程导出hdf文件(硬件描述文件)
2.创建一个petalinux工程
3.将hdf导入petalinux工程(将vivado设计应用到petalinux工程中)
4.配置petalinux工程(包括配置内核,配置u-boot,配置根文件系统)
5.编译petalinux工程(u-boot镜像,内核(kernel镜像,rootfs,bitstream,fsbl镜像文件)
6.启动开发板

配置:
导入hdf文件
petalinux-config --get-hw-describtion ~xx(路径)
单独打开工程配置界面
petalinux-config
配置u-boot
petalinux-config -c u-boot
配置内核
petalinux-config -c kernel
配置rootfs
petalinux-config -c rootfs
编译:
1.编译整个petalinux工程(fsbl,bit文件,设备树,kernel,u-boot等)
petalinux-build
2.单独编译u-boot,kernel,rootfs,
petalinux-build-c u-boot

启动开发板
制作启动镜像文件:boot.bin(多个镜像文件组合,petalinux工具制作启动文件,即petalinux-package,使用方法:petalinux-package --boot --fsbl --fpga --u-boot --force,--boot指定生成boot.bin启动镜像文件,--fsbl指定fsbl镜像文件路径fsbl.elf,--fpga指定bitstream文件路径system.bit,--u-boot指定u-boot文件(用户程序镜像)路径u-boot.elf。
boot.bin(包括fsbl,u-boot,bitstream文件,这些是必须的)还需要linux中的设备树,rootfs,Linux内核(kernel一起组成。
image.ub(kernel,和设备树(DTG),rootfs)image就是镜像的意思
所以linux系统只需要image.ub+boot.bin即可
制作SD启动卡:将镜像文件(boot.bin和image.ub)拷贝到SD卡的FAT32分区,先创建一个FAT32分区,fdisk命令,再格式化FAT32分区
对于linux系统,linux内核由u-boot引导,而u-boot由fsbl引导,fsbl由zynq片内rootrom引导启动。ps:fsbl为first stage boot loader 第一阶段加载程序
bootrom固化在zynq芯片内部,用来寻找boot.bit,然后启动fsbl,
bios(base input output system)
一般采用小端存储,即二进制低段(低位靠右)存放在内存地址小的一端(二进制与存储方向相反),大端相反(二进制与存储方向相同)。
uboot(实际上就是bootloader,只是比较通用)的作用,linux一般运行在ddr中,而linux镜像一般在外部存储设备里面,uboot的作用就是初始化ddr并且驱动如sd卡和flash等拷贝系统镜像到ddr中。
另一种方式启动系统
对于 ZYNQ 而言,一个完整的 linux 系统包含 PS 和 PL 两个构件,其中 PS 构件包含 fsbl、uboot、设备树文件、linux 内核、根文件系统共 5 个要素,PL 构件包含 bit 文件一个要素,当不使用 PL 的时候,该要素非必须。编写 linux 驱动的时候,经常改动的要素有设备树文件、linux 内核、根文件系统,当然如果改动 PL 的话还需改动 bit 文件。因而我们将这些要素独立出来,从而方便修改变更。也就是说我们将 bit 文件从原先的 BOOT.BIN 文件独立出来,将 image.ub 文件分开为内核 zImage和设备树 dtb。另外将根文件系统放到 SD 卡的 EXT4 分区,加载启动速度
source /home/ljh/petalinux/v2018.3/settings.sh
petalinux-create -t project --template zynq -n ALIENTEK-ZYNQ
cd ALIENTEK-ZYNQ
petalinux-config --get-hw-description /home/ljh/hdf/Navigator_7010/Navigator_7010.sdk
进入
配置好后需要再进入这个配置只需要在内核文件下进入终端,如何输入命令行make menuconfig即可再次配置。
在这里插入图片描述
选择Subsystem AUTO Hardware Settings
Serial Settings选择Primary stdin/stdout改为ps7_uart_0
Advanced bootable images storage Settings
dtb image settings
image storage media 选择primary sd
返回最初的菜单,Image Packaging Configuration
Root filesystem type (INITRAMFS)
再选择SD card按enter返回保存退出。
上面的配置是将 dtb 文件从 image.ub 文件中独立开来,并将根文件系统放到 SD 卡的 EXT4分区。
配置完成后,编译 uboot,及生成 BOOT.BIN 文件,命令如下:
petalinux-build -c u-boot
petalinux-build -c bootloader
上面两个分别是编译u-boot引导文件,编译fsbl引导文件
petalinux-package --boot --fsbl --u-boot --force
第二步当工程需要更新设备树的时候步骤如下:
进入hsi命令行,及输入hsi(source /opt/pkg/petalinux/2018.3/settings.sh (需要先配置petalinux环境, sptl即可自动配置,sptl不行就输入source /opt/pkg/petalinux/2018.3/settings.sh))
open_hw_design open_hw_design /home/ljh/hdf/Navigator_7010/Navigator_7010.sdk/navigator_7010_wrapper.hdf
set_repo_path /home/ljh/zynq/device_tree/device-tree-xlnx-xilinx-v2018.3
create_sw_design device-tree -os device_tree -proc ps7_cortexa9_0
generate_target -dir /home/ljh/zynq/linux/dts
第一个命令是打开hdf文件,然后使用 set_repo_path 命令设置device-tree 仓库所在路径
使用 create_sw_design 创建软件设计,最后使用 generate_target 命令去产生目标,也就是我们的设备树文件.(exit退出hsi命令)
ps:其中 设 备 树 文 件 在 Petalinux 工程的ALIENTEK-ZYNQ/components/plnx_workspace/device-tree/device-tree/目录下
添加设备树文件 按照文档来
直到2、defconfig 配置
在内核源码目录下执行下面这条命令对内核进行 defconfig 配置:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig
编译内核:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j10
这里编译不成功可能是arm-linux-gcc(针对arm进行编译,gcc是针对xp86的)没有安装,安装命令:sudo apt-get install gcc-arm-linux-gnueabihf
而且gcc-5.4版本不够,下载更新到gcc-6安装命令:
sudo apt-get update &&
sudo apt-get install build-essential software-properties-common -y &&
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y &&
sudo apt-get update &&
sudo apt-get install gcc-6 g+±6 -y
sudo apt install gcc-multilib(可能出现安装包不对)
编译设备树:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb -j10
进入ALIENTEK-ZYNQ文件夹下,打开终端输入sptl配置petalinux环境,然后再编译根文件系统:
先配置根文件系统
一定要进入petalinux下的ALIENTEK-ZYNQ文件夹下面进入终端输入。
petalinux-config -c rootfs
再选择进入“Image Features —>”菜单下,使能“debug-tweaks”
petalinux-build -c rootfs
(理解:经过上面一系列的过程之后,我们就已经得到了启动开发板的所有所需的镜像文件了。例如我们使用 petalinux 工具会生成 image.ub 和 BOOT.BIN 文件,使用这两个文件我们就可以启动开发板了,但是这里我们不这样做。前面给大家介绍过image.ub 这个文件的本质,那么它其实是多个文件组合在一起的,包括内核镜像、dtb 以及根文件系统,这样的做法有一个弊端,不够灵活,一个变了整个 image.ub文件就得重新制作一遍,很麻烦。同样 BOOT.BIN 文件是 fsbl 镜像、u-boot 镜像以及 pl 端 bit文件集合在一起的,那么既然是集合在一起的,那么我们单独使用也是可以的嘛。所以我们这里的思路就是将内核镜像文件 zImage、内核设备树文件以及根文件系统从image.ub 文件中分离出来;而将 bit 文件从 BOOT.BIN 文件中分离出来,这样做之后我们的 SD卡中将会存在 5 部分内容:zImage、dtb、rootfs、bit 以及 BOOT.BIN(fsbl 镜像与 u-boot 镜像的集合体),明确之后我们将他们拷贝到我们的 SD 卡中。)
sd启动卡制作:
先将sd卡连接到ubuntu中,这挂在sd卡,命令行如下
umount /dev/sdb*
sudo fdisk /dev/sdb
第一个是卸载sd卡df -h、可以看到sd卡不再挂载了
下面一句是对sd卡进行分区操作
(ps:df -h可以看系统挂载的外设)
进入操作界面,先按p选择进行分区,再按d选择删除之前的分区,再输入d的时候就提示没有分区。
第一个扇区是boot扇区,100m(显示99M)
输入n创建一个分区,输入p代表主分区(e代表额外分区),输入分区号选择为1,和输入第一个扇区2048,设置最后一个扇区,选择+100M即可(输入+100M)。
再然后分区类型输入t再输入c,设置为“W95 FAT32 (LBA)。
第二个扇区是roofts扇区,15gb,再输入“a”,设为引导分区,第一个分区就创建好了,开始创建第二个分区。通过键入“n”来创建根文件系统分区。后面一路默认就可以了,直到显示create a new partion 2。。。即可,这里默认剩下的内存做根文件扇区,
最后输入p查看分区情况,看到有两个分区即可,一个是fat32格式,另一个是ext4格式,键入“w”以写入到 SD 卡并退出。(df -Th可以看挂载并且包括其格式)
第三步格式化分区,输入命令行
sudo mkfs.vfat -F 32 -n boot /dev/sdb1
sudo mkfs.ext4 -L rootfs /dev/sdb2
最后分区成功,再次挂载sd卡,格式化完成之后,在 Ubuntu 系统桌面的左边会出现两个 USB U 盘类设备图标,分别点击两个图标即可自动将这两个分区挂载到 Ubuntu 系统,再输入df -Th查看是否挂载成功,否则再次点击图标。(ps:也可以选择使用mount挂载,操作命令如 mount /media/lijiahao/boot)
拷贝文件:
将前面过程当中生成的各种镜像文件拷贝到 SD 启动卡的 FAT 分区,包括 zImage(内核镜像,内核源码目录 arch/arm/boot/zImage)、system-top.dtb(内核设备树 dtb 文件,内核源码目录 arch/arm/boot/dts/system-top.dtb)、system.bit(pl 端 bitstream 文件,Petalinux工程目录下的 images/linux/system.bit),还有一个就是ALIENTEK-ZYNQ/image/linux目录下的BOOT.bin文件别忘记拷贝到FAT分区里面!
总共两个扇区boot扇区为启动文件扇区,主要是内核镜像文件和系统设备树文件加上pl端的系统比特流文件,用以启动系统。
第二个扇区是roofts扇区,主要是根文件系统相关的, rootfs.tar.gz 压缩包文件在ALIENTEK-ZYNQ/ images/linux/,进入该目录下打开命令行输入:
sudo tar -xzf rootfs.tar.gz -C /media/lijiahao/rootfs/
进行解压操作,解压完成之后执行 sync 命令将数据同步到 SD 卡中,之后卸载 SD 启动卡,卸载成功之后拔掉它,卸载操作为 umount xxx
umount /media/lijiahao/rootfs
umount /media/lijiahao/boot
修改环境参数:
env default -a
setenv bitstream_load_address 0x100000
setenv bitstream_image system.bit
setenv bitstream_size 0x300000
setenv kernel_img zImage
setenv dtbnetstart 0x2000000
setenv netstart 0x2080000
setenv default_bootcmd ‘if mmcinfo; then run uenvboot; echo Copying Linux from SD to RAM… &&
load mmc 0 ${bitstream_load_address} ${bitstream_image} &&
fpga loadb 0 ${bitstream_load_address} ${bitstream_size} &&
run cp_kernel2ram && run cp_dtb2ram && bootz ${netstart} - ${dtbnetstart}; fi’
加入后输入saveenv保持到qspi flash里面
ps:可以通过配置内核得到内核中自带的模块然后使用,这里我们需要将驱动编译为模块!使用的时候直接输入命令加载驱动模块即可。配置(make menuconfig)好以后执行下面这些命令重新编译 Linux 内核、编译模块:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j16
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j16 //编译内核模块
ps:当含stdio.h等64位下的库时,运行发现抱错找不到stdio.h时使用:
gcc x.c -I/usr/include -o run
#x.c为你的c文件,-I后面跟头文件所在目录,例如:/usr/include, run指代的是编译后的可执行程序名
在配置内核的过程中可以使用menuconfig配置内核,这里面的选项都是在内核目录下的driver目录下的文件配置的,即如要配置staging driver则在driver目录下必有一个staging driver文件夹包含必须的驱动文件。
其中包含了config配置文件,这里面写了如何配置menuconfig,如何source各文件夹中的makefile(shell脚本文件,linux source命令的作用是使当前shell读入路径为filepath的shell文件并依次执行文件中的所有语句;通常用于重新执行刚修改的初始化文件,使之立即生效,该命令的使用语法是“source filepath”),而其中的makefile文件主要就是生成.o文件使最终menuconfig成功调用其驱动。
makeflie和shell区别:makefile使用make自动搜索并且执行,shell一般以.sh为后缀。
makefile:描述了整个工程的编译、链接规则。当源码文件比较多的时候就不适合通过输入 gcc 命令来编译,Makefile 文件描述了编译哪些源码文件、如何编译,每次需要编译工程时只需要使用这个文件就行了。
shell:shell 脚本第一行一定要为: #!/bin/bash -------> 表示使用 bash(即打开命令终端),shell 脚本就是一些命令的集合,它是个纯文本文件。
在 Makefile 中可以调用 shell 脚本,其表现形式就是:xx = $(shell 这里是 shell 代码),这里很重要参考driver文件里面的内容,都是这样的config里面对使用source配置文件夹的shell,而对应的文件夹里面的makefile使用上述格式调用shell脚本,最终实现输出.o可执行文件供menuconfig调用。
Makefile中执行 shell 命令时,一行创建一个进程来执行。我们为了保证 shell 命令在一个进程中执行,在很多 Makefile中有很多行的末尾都是 “;\”。
config:

source "drivers/staging/clocking-wizard/Kconfig"

makefile:

obj-$(CONFIG_COMMON_CLK_XLNX_CLKWZRD)	+= clocking-wizard/

当报错:Makefile:1024: recipe for target ‘drivers’ failed时,看上面编译的Zimage出错在哪里(在哪里停止),进去查看makefile文件一般都是makefile文件写错,如复制粘贴过来代了一些空格,建议全部重新手打,如果报错xxx停止或者怎么样的是因为之前中断了,输入命令行make clean,从头开始再编译一次即可。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_zynq_defconfig //defconf 配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig //配置内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage -j16 //编译 zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- system-top.dtb //编译设备树

ps:重新构造一个内核的时候必须配置一下system-top.dtb和makefile文件参考正点原子手册。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值