用petalinux工具制作linux系统启动映像

1 SD_SD启动

在真正的工程应用中我们使用的都是QSPI_EMMC的启动方式,因为SD_SD这种启动方式需要SD卡与数字板一直保持连接,所有在恶劣使用场景下稳定性不好。在用QSPI_EMMC启动系统前我们需要先制作系统映像使系统通过SD_SD这种方式启动起来。下面介绍用petalinux制作系统映像的步骤。

  • SD_SD启动指的是FPGA配置文件及系统引导文件BOOT.BIN和系统镜像image.ub在SD卡的FAT32分区,linux文件系统在SD卡的EXT4分区。
  • QSPI_EMMC启动指的是用QSPI FLASH存储BOOT.BIN,系统镜像image.ub在EMMC的mmcblk1p1分区(FAT32),linux文件系统在EMMC的mmcblk1p2分区(EXT4)。

1.1 制作SD卡

我们需要先对SD卡进行分区。

  • 将sd卡插入读卡器,插入pc机,将卡格式化
  • 打开MiniTool找到该SD卡,将两个分区卷标分别设为BOOT和rootfs(BOOT分区不要太大,最好小于4G)
  • BOOT分区用来存储之后制作的用来配置FPGA以及引导系统启动的BOOT.bin文件,和系统映像image.ub。rootfs分区用来存储之后制作的linux文件系统
  • BOOT分区文件系统设为FAT32,rootfs分区文件系统设为ext4。
  • 然后将两个分区均设为主分区,点击应用完成分区,SD卡制作完毕。

1.2 用Vivado导出硬件描述文件hdf

HDF( Hardware Definition File)文件对PS的外设,如内存和各种控制器的寄存器地址等进行了描述,通过它我们可以了解ARM处理器的外设配置情况。

  • 在导出hdf之前我们要注意:DDR型号选择正确,SD0、SD1、QSPI Flash接口打开并引脚连接正确。
  • 点击vivado工程界面左上角File → Export → Export Hardware to SDK,勾选比特流。
  • 在本工程的sdk目录下就能看到导出的hdf文件。
    在这里插入图片描述

1.3 建立petalinux工程,导入hdf并配置

  • 进入petalinux工具目录下,获取root权限,并读取settings.sh脚本配置环境变量:
cd /opt/petalinux
sudo su
source settings.sh

在这里插入图片描述

  • 新建工程,其中miboard_0120是工程名,工程名根据芯片型号及启动方式进行修改,如7100_sd_sd
petalinux-create -t project -n miboard_0120 --template zynq 

在这里插入图片描述

  • 进入创建的工程目录,然后把该工程的hdf文件和bit流文件复制过来,之后导入硬件工程,并配置硬件。在这里最好将终端窗口最大化,否则偶尔会失败。
 cp /mnt/hgfs/ZXJ/035/xillydemo.* . 
 petalinux-config --get-hw-description -p ./

在这里插入图片描述

1.3.1 配置SD接口类型

然后会弹出配置窗口,在这里配置系统启动方式,主要的配置如下:

  • SD_SD启动时配置SD接口为SD0,指SD接口为SD卡。
  • EMMC_QSPI启动时配置SD1为EMMC,指SD接口为EMMC。
  • 这里的SD指广义上的SD,EMMC也是SD的一种。
  • 0:表示SD卡 1:表示eMMC
    在这里插入图片描述
    Subsystem AUTO Hardware SettingsSD/SDIO Settings下配置,
    在这里插入图片描述
1.3.2 配置支持BOOT.BIN文件大小
  • 在flash Settings设置中,将boot分区的大小设置为0x1400000,大小为20MB,BOOT.BIN文件较大时才设置。在这里插入图片描述
1.3.3 配置BOOT.BIN文件的启动位置

Subsystem AUTO Hardware Settings,Advanced bootable images storage Settings,Boot image settings下配置

  • SD_SD启动时BOOT.BIN文件在SD卡的第一分区,选择sd
  • EMMC_QSPI启动时BOOT.BIN文件在QSPI FLASH中,选择flash
    在这里插入图片描述
1.3.4 配置linux系统镜像启动位置

Subsystem AUTO Hardware Settings,Advanced bootable images storage Settings,Kernel image settings下配置

  • SD_SD启动时配置内核、设备树(内核和设备树都集成在image.ub映像中)存放在SD卡第一分区,SD卡第一分区对应/dev/mmcblk0p1,选择sd。
  • EMMC_QSPI启动时配置内核、设备树存放在EMMC第一分区,EMMC第一分区对应/dev/mmcblk1p1,也选择sd(广义)!!!
    在这里插入图片描述
1.3.5 配置文件系统格式和位置
  • Image Packaging Configuration下配置,进入Root filesystem type,配置文件系统格式,选择SD卡,这里不管是SD_SD还是QSPI_EMMC都选择SD卡。
    在这里插入图片描述
    在这里插入图片描述
  • SD_SD时,将Device node of SD device设为/dev/mmcblk0p2,表示将文件系统存放于SD卡第二分区
  • QSPI_EMMC时,将Device node of SD device设为/dev/mmcblk1p2,表示将文件系统存放于eMMC第二分区;
    在这里插入图片描述
1.3.6 配置系统IP地址
  • 在Subsystem AUTO Hardware Settings → Ethernet Settings中,也可以在最终生成的文件系统(编译之后才会生成)的etc/network/interfaces中修改IP地址
    在这里插入图片描述
  • 都配置完后退出并保存。

1.4 配置uboot支持的启动方式

uboot被合成在BOOT.BIN文件中,它用来启动linux操作系统的镜像或者启动裸机程序。

  • SD_SD时,BOOT.BIN文件在SD第一分区中,uboot从SD/EMMC启动,选择SD/EMMC。
  • QSPI_EMMC时,BOOT.BIN文件在QSPI FLASH中,uboot从FLASH启动,选择QSPI flash。
petalinux-config -c u-boot

在这里插入图片描述
在这里插入图片描述

1.5 配置rootfs

在工程目录下输入petalinux-config –c rootfs,配置root用户密码
在这里插入图片描述
配置界面:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6 配置自动登录

参照ug1144-petalinux-tools-reference-guide_2016.3中的Step for Petalinux Auto Login部分操作:

  • 进入建立的petalinux工程目录下,新建apps工程。
  • 进入工程的components/apps/autologin目录下,修改此目录下的autologin.c和Makefile。
petalinux-create -t apps --name autologin --enable
cd your_proj_name/components/apps/autologin
  • 修改autologin.c为: execlp(“login”, “login”, “-f”, “root”, 0);(记住这个0,和设定的密码无关,不要修改里面参数)
    在这里插入图片描述
  • 修改Makefile为:
#注意$(TARGETINST)**前面是Tab**
install:
	$(TARGETINST) -d -p 0755 autologin /etc/init.d/autologin
	$(TARGETINST) -s /etc/init.d/autologin /etc/rc5.d/S99autologin

在这里插入图片描述
若前面已将文件系统密码改为1,则SSH登录时用户名为root,密码为1,串口登录则可自动登录,无需输入用户名和密码,即使密码不为root

1.7 配置linux内核

1.7.1 使用xillybus时

输入petalinux-config -c kernel进入内核配置界面。
在这里插入图片描述

  • Device Drivers下进入Character devices中,勾选xillybus generic FPGA interface后下面会弹出两个选项,将这两个都勾上即可,之后退出保存。
    在这里插入图片描述
1.7.2 使用xilinx DMA IP核时
  • Device Drivers下DMA Engine support中勾选Xilinx提供的DMA IP核驱动(Petalinux2017.2默认勾选),如下:
    在这里插入图片描述
    如果勾选上,系统启动之后可使用dmesg | grep dma命令查看当前内核是支持DMA IP核的驱动的。
    在这里插入图片描述

1.8 自动加载驱动,运行应用程序

若需要开机自动加载驱动运行应用程序,可在autologin的Makefile中加入驱动和应用程序,也可以直接在工程生成的文件系统中的etc/profile中添加。

  • 使用axidma驱动时:
    在这里插入图片描述
  • 使用Xillybus驱动时:
    -

1.9 修改platform-auto.h文件

  • 修改platform-auto.h文件,将cp_kernel2ram按照下图修改,这里修改的是内核路径,注意红框部分。
  • QSPI_EMMC启动时,mmc 1对应emmc,故mmc dev 1以及mmc 1指定从emmc拷贝内核镜像。
  • SD_SD启动时,将图中红框内0改为1即可,mmc 0对应SD卡,指定从SD卡拷贝内核镜像。
    在这里插入图片描述

1.10 修改设备树

1.10.1 使用xillybus时
  • 硬件工程使用xillybus时,进入/opt/petalinux/project_name/subsystems/linux/configs/device-tree,修改pl.dtsi,如下:
    在这里插入图片描述
1.10.1 使用xilinx DMA时
  • 硬件工程使用xilinx DMA时,,进入/opt/petalinux/project_name/subsystems/linux/configs/device-tree,修改pl.dtsi,如下:

    修改添加部分主要三处:

#添加三个:
linux,phandle = <0x6>;    linux,phandle = <0x7>;	linux,phandle = <0x8>; 
phandle = <0x6>;		  phandle = <0x7>;			phandle = <0x8>; 
#xlnx,device-id 修改为<0x0>至<0x5>
#在amba_pl节点下三个DMA之后再添加一个设备
  axidma_chrdev@0 {
  	compatible = "xlnx,axidma-chrdev";
  	dmas = <0x6 0x0 0x6 0x1 0x7 0x0 0x7 0x1 0x8 0x0 0x8 0x1>;
  	dma-names = "tx_channel_0", "rx_channel_0", "tx_channel_1", "rx_channel_1", "tx_channel_2", "rx_channel_2";
  };
  • 下图中,右边是petalinux自动生成的设备树,需要按照左边修改
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

1.11 编译工程

输入petalinux-build编译工程。
在这里插入图片描述
工程编译完成后,会在build/linux/rootfs/targetroot下生成文件系统。若需要修改MAC地址或自动加载驱动和开机自动运行应用程序,可修改文件系统的etc/profile文件。
your_proj_name/images/linux/目录下生成的vmlinux就是未压缩的系统镜像文件,zImage是压缩的系统镜像文件,system.dtb是系统设备树文件,image.ub是将zImage和设备树system.dtb文件合并起来的文件,u-boot.elf是引导系统启动的bootloader二级引导文件,zynq_fsbl.elf是引导系统启动的一级引导文件。

1.12 Petalinux下生成BOOT.BIN文件

编译工程完成后,在your_proj_name/images/linux/下会生成一些启动文件,需用到zynq_fsbl.elf、project_top.bit、u-boot.elf生成BOOT.BIN,再用JTAG烧写到QSPI Flash中。命令的比特流的名字需与image/linux下比特流名字一致。

petalinux-package --boot --fsbl zynq_fsbl.elf --fpga project_top.bit--u-boot u-boot.elf

在这里插入图片描述

  • 烧写BOOT.BIN到FLASH
    JTAG烧写器连接板子和PC机,打开板子开关,选择Xilinx Tools → Program Flash,在弹出的窗口中点击Browse找到刚刚生成的BOOT.BIN,点击Program将其烧写到FLASH。可在SDK下面的窗口中看到烧写进度,成功烧写时如下:
    在这里插入图片描述
    在这里插入图片描述
  • 至此,我们SD_SD模式下的步骤已经完毕,只需要将文件系统复制到SD卡的rootfs分区,把image.ub和BOOT.BIN复制到BOOT分区即可。然后插上SD卡,将拨码开关调节到SD卡启动模式,我们的数字版就可以起来了。
  • 接下来的步骤对于系统的完整运行是必不可缺的,但是在SD卡模式下我们可以不做,因为SD卡模式下生成的一系列文件只是为了让板子暂时起来,从而可以让我们进行EMMC的配置,工程中真正使用的是QSPI_EMMC的模式。

1.13 添加设备驱动及应用程序

生成文件系统后,在文件系统的/home/root/下添加模块驱动、应用程序和Qt库动态链接
在这里插入图片描述

  • 硬件工程使用XilinxDMA时,需加入以下文件:
    在这里插入图片描述
  • 硬件工程使用xillybus时,需将xillybus_core.ko,xillybus_lite_of.ko,xillybus_of.ko这三个驱动拷贝到root目录下:
    在这里插入图片描述
  • 在etc/profile在最终生成的文件系统中,添加下列驱动(路径必须和之前添加的三个驱动的路径相同),修改如下:
    在这里插入图片描述
  • 若需要修改MAC地址,设置静态路由,也可在profile中添加,如下:
    在这里插入图片描述

1.13 添加应用程序用到的库文件

  • 当前工程的build/linux/rootfs/targetroot/目录是最后在板子上运行的文件系统,在home下新建文件夹,目录需要与虚拟机中Qt库目录一致,把Qt库拷到这里
    在这里插入图片描述
    拷贝完Qt库之后:
    在这里插入图片描述

  • Qt库拷贝完成再将/root/下面的libstdc++.so.6.0.21直接重命名为libstdc++.so.6:mv libstdc++.so.6.0.21 libstdc++.so.6
    在这里插入图片描述

  • 若使用了Gtest,则将libgtest.so拷贝到刚刚生成的Linux文件系统 目录/usr/lib中。

1.14 EMMC配置

  • 先利用SD卡启动系统,SD卡启动后输入ls /dev查看设备,若没有mmcblk1p1和mmcblk1p2,则emmc还未分区。若没有mmcblk1,则表示当前使用的SD卡的硬件工程或启动文件不支持emmc*。
    在这里插入图片描述
1.14.1 将emmc分区

mmcblk1对应emmc,需要将mmcblk1分为mmcblk1p1和mmcblk1p2两个区。
输入命令fdisk /dev/mmcblk1 进入分区模式为emmc分区。
在这里插入图片描述
输入m查看命令介绍,根据提示分区并保存退出
主要用到三个命令:
n :新建分区
p:打印分区列表
w:退出分区命令并保存
在这里插入图片描述
新建第一个分区:如果选择默认选项(default)的话,回车即可
在这里插入图片描述
同样的步骤新建第二个分区:都选择默认选项即可
在这里插入图片描述
输入p可查看分区情况,可看到已经有两个分区:
在这里插入图片描述
输入w保存并退出分区命令:
在这里插入图片描述
我们可以看到在/dev下面有两个新的分区:
在这里插入图片描述

1.14.2 格式化emmc分区
  • 格式化EMMC分区会用到两个工具,mkdosfsmke2fs ,如果没有这两个命令,将这两个命令拷贝到SD卡的/usr/bin中。若没有这两个工具则要自己下载源码并编译。
  • 拷贝内核image.ub文件
    1.mount /dev/mmcblk1p1 /mnt/mmk1p1/dev/mmcblk1p1挂载到某个目录下
    2.cd /mnt/mmk1p1进入挂载的目录
    3.scp zynq@192.168.1.112:~/zhuang/0408/image.ub /mnt/mmk1p1/ scp网络拷贝将虚拟机下的image.ub拷贝到挂载的目录下,密码为1
    4.sync 同步数据
    5.cd / 退出到根目录
    6.umount /dev/mmcblk1p1 卸载eMMC第一分区
    在这里插入图片描述
  • 拷贝文件系统rootfs
    编译工程之后生成的image/linux/build/linux/rootfs/targetroot/*是最终运行在板子上的文件系统,通过网口拷贝到EMMC第二分区。
    1.将build/linux/rootfs/targetroot/*拷贝至某目录
    2.mount /dev/mmcblk1p2 /mnt/mmk1p2 SD卡启动并挂载eMMC第二分区
    3.cd /mnt/mmk1p2 进入挂载的目录
    4rsync -a --progress zynq@192.168.1.112:~/zhuang/0408/rootfs/* /mnt/mmk1p2/
    5.sync 同步数据
    6.cd / 退出到根目录
    7.umount /dev/mmcblk1p2 卸载eMMC第二分区
    8.拷贝完成之后可在/mnt/mmk1p2/下看到文件系统,若需要修改替换应用程序及模块驱动、修改IP地址、配置开机自启动,均可在相应路径及文件中设置。推荐设置好后再复制过来。
  • 至此QSPI_EMMC模式下的配置已经完毕,将拨码开关调制EMMC模式后重启即可。

2 启动时找不到内核原因

2.1 拷贝完未使用sync命令且并卸载分区

因为用SD卡启动系统,挂载emmc分区,把image.ub拷到emmc分区中之后没有卸载此分区,所以有时候会找不到内核镜像。同时,拷贝完内核镜像之后最好使用sync命令强制让拷贝的文件立刻从内存缓冲区拷贝到emmc硬件里(Linux下拷贝文件会先把文件存放在内存缓冲区再到相应存储器)。

2.2 uboot引导内核参数未正确设置

  • 进入u-boot命令行(启动倒数几秒的时候按空格键进入uboot命令行)
    输入printenv查看打印的参数,确认cp_kernel2ram= mmc dev 1&& mmcinfo && fatload mmc 1 0x10000000 image.ub
    若不是,则需输入以下命令重新配置环境变量:
    setenv cp_kernel2ram 'mmc dev 1 && mmcinfo && fatload mmc 1 0x10000000 image.ub',输入saveenv保存退出。
    再输入printenv查看cp_kernel2ram,确认是否修改正确。
    mmc dev 1:mmcinfo可能默认是SD0,故需手动设置为dev 1,否则可能有如下情况:
    在这里插入图片描述
  • 若需要修改uboot倒计时,进入uboot命令行
    输入printenv打印环境变量
    输入setenv bootdelay 2设置启动延时为2秒,或其他值
    输入saveenv保存设置
    输入boot启动内核和文件系统
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值