Xilinx ZYNQMP 根系统以及EMMC启动

Xilinx ZYNQMP 根系统以及EMMC启动

Author:Swing

note date:2023/12/29

使用核心:zu7ev

前言

​ Xilinx的ZYNQMP支持4种启动方式,分别为SD,EMMC,QSPI,JTAG。EMMC启动的话,需要qflash启动fsbl后再加载emmc的uboot和内核镜像,根文件的话可以选择性挂载。你如果想问为什么:那就是ARM架构的内部有一块boot rom,存放着原厂写好的启动程序(这玩意改不了),这个程序他去加载qflash的fsbl程序,fsbl启动后加载PL BitStream,然后才去启动uboot,uboot再启动内核。如果你启动不起来,记得去烧录一下qflash。

image-20240109150352406

1. 前置知识

​ 描述:这里其实是一个磁盘分区的问题,所有的像sd卡,emmc,nandflash,qspi_flash这些。磁盘都会有一个分区表。有了分区表,才会有磁盘分区,一个磁盘只能拥有一种分区方案其实在磁盘空间内,空间地址是连续的,只是把他进行划分,再抽象出来分区的概念,方便管理开发。

分区表分为两种:

  1. MBR(msdos 目前用得比较少)
  2. gpt (用得最多)

1.1. MBR(msdos) 分区表

​ 描述:目前msdos分区表用的比较少,大多使用gpt分区表。不论嵌入式设备系统还是台式机(Windows)目前主流都是使用gpt分区表。但作为一个系统驱动工程师,这些都得知道。

msdos分区表简单的来说,就是只有4个主分区(包括拓展分区)。例如:1 主+3 拓展或者2 主+2 拓展或者3 主+1 拓展。那如何分超过4个分区呢。拓展分区就是用来做这个的,拓展分区最多可以建63个逻辑分区。把概念抽象出来就是这样的。拓展包含逻辑分区,用数学的方式就是逻辑分区是拓展分区的子集。注意拓展分区是没有格式的。

image-20240109161633814

1.2. GPT 分区表

​ 描述:GPT分区表就没有分主分区,拓展分区,逻辑分区的概念的。你建多少个分区,就是多少个分区。一个GPT分区表的磁盘,他可以分出128个分区。

1.3. 分区原理

​ 描述:磁盘的分区信息,保存在磁盘的前512个字节内。

​ 在MBR分区表中:前446个字节是引导扇区,保存着启动系统的引导程序;剩下的64个字节是分区信息。

​ 在GPT分区表中:为于MBR兼容,第一个扇区叫保护性MBR。保护性MBR只有一个分区叫ESP,内部存放着UEFI引导程序,同时也保存着分区信息。

image-20240109164153402

2. Xilinx ZYNQMP EMMC启动

2.1. 描述

Xilinx的ZYNQMP 默认启动只能通过MBR的分区方案进行启动,我尝试使用GPT方案,Uboot都起不来。其实改Xilinx的分区很简单,不论是SD卡启动还是EMMC启动,都是使用MBR分区方案启动。

2.2. 方法

​ 首先先SD卡启动,然后SD卡启动的系统内进行分区,进行操作等等等。还有一种把SD卡的分区做成img,再dd到emmc的设备节点,这样也是可以的。这里只介绍常规方法。

2.3. 操作步骤

  1. 制作分区

​ petalinux运行要有两个东西,一个是启动分区,另一个是根文件分区。这里我使用的是parted工具进行分区,parted 工具在petalinux配置rootfs工具包的时候,默认是没勾上的,要把他勾上。不勾上的话就自己手动去移植。

image-20240109170518605

​ 建立msdos分区表(其实你把前512个字节拷贝进去的话,可以忽略此操作),

parted -s /dev/mmcblk0 mklabel msdos

​ 建立分区

parted -s /dev/mmcblk0 mkpart p fat32 0% 100M
parted -s /dev/mmcblk0 mkpart p exit4 100M 1G
mkfs.ext4 -F /dev/mmcblk0p2  #为啥要这一步呢,因为有时候用parted工具虽然指定了分区格式,但有时候分出来不是这个格式
  1. 挂载并把启动分区的文件丢进去和根文件系统丢进去根文件分区。

ZYNQMP的启动是把BOOT.bin image.ub boot.scr三个文件丢启动分区。根文件系统把他丢根文件系统分区就好了。做完这一步执行sync同步一下,切换EMMC启动,就能起来了。

image-20240109171522094

image-20240109150352406

3. 文件系统启动

3.1. udev动态挂载规则

​ ZYNQMP的根文件系统,默认会有udev设备的规则管理块设备的挂载。默认会分区挂载到根文件的/media文件夹内,再软链接到/mnt目录。你可以把规则给改了。udev动态设备管理的规则目录在

/etc/udev/rules.d

image-20240109172129947

​ 这里跟petalinux自带的规则文件不一样,因为这里规则被我改过了。

3.2. zynqmp根文件的启动脚本

其实大部分的嵌入式设备,初始化都是用init程序,他是内核去挂载根文件系统后,第一个启动的程序。他会把串口终端以及一些启动脚本运行。启动那些服务都是用init去启动当前启动等级的脚本文件,可以在下面这里看到

vi /etc/inittab

这个脚本默认运行的等级是5

image-20240109173115135

你可以使用命令查看当前系统运行的等级

image-20240109173209758

对应的等级5,系统启动的时候,会去运行/etc/rc5.d/下面的shell脚本。

image-20240109173314721

这里的rc5.d目录下的脚本全都是来自/etc/init.d/文件夹下的软链接

image-20240109173443157

所以你需要添加什么自启动服务,只需要把运行的shell脚本丢到/etc/init.d/文件夹下,再软链接到/etc/rc5.d/目录下,对了脚本名字得是Sx开头。参考赛灵思的启动脚本照葫芦画瓢就行了。

4. 注意事项

  1. 不知道因为我下载的版本还是什么问题,串口进入终端后,他会变成9600波特率,需要去修改串口中断的inittab文件,这个文件默认是9600。不改的话,你会发现用115200波特率看,看完到系统登录的时候,他就没了。终端变9600波特率了。操作如下:

image-20240109174005399

  1. 如果有EMMC有根文件系统,如果在kernel没有指定cmdline参数的话,你是SD卡启动,他会默认挂载EMMC的根文件系统。以防万一,得把cmdline指定一下,默认是没有指定cmdline参数的,通过uboot启动传参。操作如下:在petalinux工程
petalinux-config -c kernel

image-20240109174348141

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
引用\[1\]:在ZynqMP平台上,可以通过将文件系统和内核、uboot复制到eMMC分区来实现eMMC启动。首先,在官方板子上使用SD卡启动,然后挂载eMMC分区,将文件系统和内核、uboot复制到eMMC分区。接下来,通过拨码开关启动。需要注意的是,如果要将系统放到8G的eMMC中,需要进行压缩处理。可以在虚拟机中挂载SD卡,查看文件系统分区的实际大小,并进行压缩。压缩后的文件系统可以挂载到eMMC中,并直接解压到eMMC中。实测压缩后的文件系统大小为2.6G。\[1\] 引用\[2\]:如果遇到无法ping通外网的问题,可以参考https://superuser.com/questions/1026291/linux-avahi-daemon-failed-to-find-user-avahi。如果SSH无法登录,即使修改了/etc/ssh/sshd_config中的perimtrootlogin为yes,仍然无法登录,可以参考https://blog.csdn.net/lizheng2017/article/details/123141120。在处理这些问题时,可以观察启动日志,查看哪些服务未启动,并据提示寻找解决方法。\[2\] 引用\[3\]:如果网络无法启动,eth无法识别,可以在rc.local文件中配置网络IP和网关。需要注意的是,在rc.local文件中启动失败的程序需要屏蔽,并在网络启动服务和设置IP服务之间增加适当的延时(例如sleep 5)。\[3\] 综上所述,要在ZynqMP上实现eMMC启动,可以通过将文件系统和内核、uboot复制到eMMC分区,并进行压缩处理。同时,需要注意处理网络相关的问题,如无法ping通外网、SSH无法登录以及网络无法启动等。可以参考提供的链接和观察启动日志来解决这些问题。 #### 引用[.reference_title] - *1* *2* *3* [在黑金zynqmp 上用emmc 启动的那些坑](https://blog.csdn.net/Nyiragongo/article/details/128470418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值