快速运行AMD Xilinx KR260的Linux
工具
Vitis 2022.1
PetaLinux 2022.1
文档
建议重点查看 DS988 Kria KR260 Robotics Starter Kit Data Sheet
和 UG1092 - Kria KR260 Robotics Starter Kit User Guide.
启动设备
KR260首先从QSPI加载BOOT.BIN启动U-BOOT,U-BOOT再从SD(TF)卡的第1个分区(sda1)启动Linux内核,Linux内核再把SD(TF)卡的第2个分区(sda2)加载为根文件系统。BOOT.BIN包含FSBL、U-BOOT。Linux的启动文件包括boot.scr,Image,ramdisk.cpio.gz.u-boot,system.dtb,system-zynqmp-sck-kr-g-revB.dtb等。
官方文档描述如下:
KR260 has a primary and secondary boot device.
The primary boot device is a QSPI memory located on the SOM
The secondary boot device is an SD card interface on the carrier card.
By default, the KR260 sets the XCK26 boot mode to QSPI32.
The SOM boots up to U-Boot using the QSPI contents
and then U-Boot does a hand-off to the secondary boot device.
Linux根文件系统
如上所述,默认情况下,KR260使用从SD(TF)卡的第2个分区(sda2)作为根文件系统。可以查看系统日志中的相关信息、使用df查看系统的文件系统信息来确认。
xilinx-kr260-starterkit-20221:/home/petalinux# dmesg | grep sda
[ 7.203335] sd 0:0:0:0: [sda] 31116288 512-byte logical blocks: (15.9 GB/14.8 GiB)
[ 7.211483] sd 0:0:0:0: [sda] Write Protect is off
[ 7.216272] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
[ 7.216897] sd 0:0:0:0: [sda] No Caching mode page found
[ 7.222207] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 7.235477] sda: sda1 sda2
[ 7.240160] sd 0:0:0:0: [sda] Attached SCSI removable disk
[ 8.663905] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[ 10.872703] EXT4-fs (sda2): re-mounted. Opts: (null). Quota mode: none.
xilinx-kr260-starterkit-20221:/home/petalinux# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 1.5G 4.0K 1.5G 1% /dev
/dev/sda2 3.8G 809M 2.8G 23% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 787M 9.9M 777M 2% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
tmpfs 2.0G 0 2.0G 0% /tmp
tmpfs 2.0G 184K 2.0G 1% /var/volatile
/dev/sda1 2.0G 44M 2.0G 3% /boot
tmpfs 394M 0 394M 0% /run/user/1000
升级BOOT.BIN
应用开发人员,主要升级Linux和开发应用程序,一般不更改BOOT.BIN。特殊情况下,如果需要更改,需要使用xilinx的工具xmutil来做BOOT.BIN的升级。注意,仅把BOOT.BIN复制到SD(TF)卡的第1个分区(sda1),并不能起作用。
xmutil的详细信息可以参考Xilinx文档。升级BOOT.BIN的简要流程如下:
- 将BOOT.BIN复制到单板上,比如通过SFTP等。
- 使用命令“sudo xmutil bootfw_update -i
” 升级BOOT.bin。 - 升级成功后,硬件复位单板或者掉电重启动。不要使用Linux的命令reboot重启动。
- 新的BOOT.BIN启动成功后, “sudo xmutil bootfw_update -v” ,标记新的BOOT.BIN可用,后续启动一直使用它。
升级BOOT.bin的log:
root@kria:/home/ubuntu# pwd
/home/ubuntu
root@kria:/home/ubuntu# ls -l -h
total 4.5M
-rw-r--r-- 1 ubuntu ubuntu 4.5M Apr 21 2022 BOOT.BIN
root@kria:/home/ubuntu# xmutil bootfw_update -h
Usage: sudo image_update -i <path of image file>
image_update -i updates qspi image with the image file passed as argument.
image_update -p prints persistent state registers.
image_update -v marks the current running image as bootable.
image_update -h prints this menu.
Can use xmutil bootfw_update instead of image_update in any of the above commands.
root@kria:/home/ubuntu# xmutil bootfw_update -p
Image A: Bootable
Image B: Bootable
Requested Boot Image: Image A
Last Booted Image: Image A
XilinxSom_QspiImage_v2.0_03240013
ImageA Revision Info: Not defined
ImageB Revision Info: Not defined
root@kria:/home/ubuntu# xmutil bootfw_update -i ./BOOT.BIN
Marking last booted image as bootable
Reading Image..
Marking target image non bootable
Writing Image..
Marking target image as non bootable and requested image
./BOOT.BIN updated successfully
root@kria:/home/ubuntu# xmutil bootfw_update -p
Image A: Bootable
Image B: Non Bootable
Requested Boot Image: Image B
Last Booted Image: Image A
XilinxSom_QspiImage_v2.0_03240013
ImageA Revision Info: Not defined
ImageB Revision Info: Not defined
root@kria:/home/ubuntu# sync
[power-off the board, and power-on the board]
Xilinx Zynq MP First Stage Boot Loader
............
ZynqMP> md.l 0xa0020000
a0020000: 00000000 00000000 00000000 00000000 ................
a0020010: 00000000 00000000 00000000 00000000 ................
a0020020: 000000d0 00000000 00000000 00000000 ................
.......................
root@kria:/home/ubuntu# xmutil bootfw_update -p
Image A: Bootable
Image B: Non Bootable
Requested Boot Image: Image B
Last Booted Image: Image B
XilinxSom_QspiImage_v2.0_03240013
ImageA Revision Info: Not defined
ImageB Revision Info: Not defined
root@kria:/home/ubuntu# xmutil bootfw_update -v
Marking last booted image as bootable
[power-off the board, and power-on the board]
Command 'power-off' not found, did you mean
Xilinx Zynq MP First Stage Boot Loader
.......................
ZynqMP> md.l 0xa0020000
a0020000: 00000000 00000000 00000000 00000000 ................
a0020010: 00000000 00000000 00000000 00000000 ................
a0020020: 000000d0 00000000 00000000 00000000 ................
.......................
root@kria:/home/ubuntu# xmutil bootfw_update -p
Image A: Bootable
Image B: Bootable
Requested Boot Image: Image B
Last Booted Image: Image B
XilinxSom_QspiImage_v2.0_03240013
ImageA Revision Info: Not defined
ImageB Revision Info: Not defined
另外,可以使用命令“sudo xmutil bootfw_status”或者“sudo xmutil bootfw_update -p” 查看启动映像的使用情况。注意带上命令“sudo”或者root用户,否则会报告错误“Open Qspi MTD partition failed”。
普通用户执行情况。
xilinx-kr260-starterkit-20221:~$ xmutil bootfw_status
Open Qspi MTD partition failed
Reading persistent registers backup
Open Qspi MTD partition failed
xilinx-kr260-starterkit-20221:~$ xmutil bootfw_update -p
Open Qspi MTD partition failed
Reading persistent registers backup
Open Qspi MTD partition failed
root用户执行情况。
xilinx-kr260-starterkit-20221:/home/petalinux# xmutil bootfw_update -p
Image A: Bootable
Image B: Bootable
Requested Boot Image: Image B
Last Booted Image: Image B
XilinxSom_QspiImage_v2.0_03240013
ImageA Revision Info: XilinxSOM_BootFW_20220323
ImageB Revision Info: Not defined
启动映像
AMD Xilinx 提供了多个KR260启动映像。
在Kria K26 SOM中,提供了Kria Starter Kit 2022.1 Image。下载后,得到文件“petalinux-sdimage_xilinx-k26-starterkit.wic.xz”。
Xilinx Downloads 中,提供了 Kria KR260 Starter Kit 2022.1 BSP。使用BSP文件,创建petalinux工程后,在目录“pre-built/linux/images”中有所有启动相关的文件,包括wic Image文件petalinux-sdimage.wic的压缩版本“petalinux-sdimage.wic.xz”。
hankf@XSZGS4:kr260-221-bsp-orig-peta$ ls pre-built/linux/images/ -l
total 2853440
-rw-r--r-- 1 hankf hankf 3595720 May 14 16:36 BOOT.BIN
-rw-r--r-- 1 hankf hankf 394 May 14 16:47 bootgen.bif
-rw-r--r-- 1 hankf hankf 2777 May 14 16:11 boot.scr
-rw-r--r-- 1 hankf hankf 22401536 May 14 16:26 Image
-rw-r--r-- 1 hankf hankf 9678824 May 14 16:21 Image.gz
-rw-r--r-- 1 hankf hankf 33001984 May 14 16:21 image.ub
-rw-r--r-- 1 hankf hankf 173143748 May 14 16:41 petalinux-sdimage.wic.xz
-rw-r--r-- 1 hankf hankf 23215496 May 14 16:20 ramdisk.cpio.gz
-rw-r--r-- 1 hankf hankf 23215560 May 14 16:20 ramdisk.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 5340 May 14 16:20 ramdisk.manifest
-rw-r--r-- 1 hankf hankf 23511703 May 14 16:20 ramdisk.tar.gz
-rw-r--r-- 1 hankf hankf 240271201 May 14 16:23 rootfs.cpio.gz
-rw-r--r-- 1 hankf hankf 240271265 May 14 16:23 rootfs.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 50142 May 14 16:22 rootfs.manifest
-rw-r--r-- 1 hankf hankf 242846085 May 14 16:23 rootfs.tar.gz
-rw-r--r-- 1 hankf hankf 51 May 14 16:36 som_build_info.txt
-rw-r--r-- 1 hankf hankf 1861099 May 14 16:06 system.bit
lrwxrwxrwx 1 hankf hankf 31 May 14 16:13 system.dtb -> system-zynqmp-sck-kr-g-revB.dtb
-rw-r--r-- 1 hankf hankf 46945 May 14 16:13 system-zynqmp-sck-kr-g-revB.dtb
...........
hankf@XSZGS4:kr260-221-bsp-orig-peta$ cd pre-built/linux/images/
hankf@XSZGS4:images$ pwd
/proj/hankf/hankf/kr260/v221/kr260-221-bsp-orig-peta/pre-built/linux/images
hankf@XSZGS4:images$ xz -d petalinux-sdimage.wic.xz
hankf@XSZGS4:images$ wic ls petalinux-sdimage.wic
Num Start End Size Fstype
1 4096 2147487743 2147483648 fat32
2 2147487744 6442455039 4294967296 ext4
hankf@XSZGS4:images$ wic ls petalinux-sdimage.wic:1
Volume in drive : is boot
Volume Serial Number is D247-3B5E
Directory for ::/
boot scr 2777 2022-05-14 8:40
IMAGE 22401536 2022-05-14 8:40 Image
RAMDIS~1 U-B 23215560 2022-05-14 8:40 ramdisk.cpio.gz.u-boot
system dtb 46945 2022-05-14 8:40
SYSTEM~1 DTB 46945 2022-05-14 8:40 system-zynqmp-sck-kr-g-revB.dtb
5 files 45 713 763 bytes
2 097 545 216 bytes free
hankf@XSZGS4:images$ wic ls petalinux-sdimage.wic:2
debugfs 1.44.1 (24-Mar-2018)
2 40755 (2) 0 0 4096 14-May-2022 16:40 .
2 40755 (2) 0 0 4096 14-May-2022 16:40 ..
11 40700 (2) 0 0 16384 14-May-2022 16:40 lost+found
12 40755 (2) 0 0 4096 9-Mar-2018 20:34 bin
169 40755 (2) 0 0 4096 9-Mar-2018 20:34 boot
174 40755 (2) 0 0 4096 9-Mar-2018 20:34 dev
175 40755 (2) 0 0 4096 9-Mar-2018 20:34 etc
969 40755 (2) 0 0 4096 9-Mar-2018 20:34 home
974 40755 (2) 0 0 4096 9-Mar-2018 20:34 lib
1813 40755 (2) 0 0 4096 9-Mar-2018 20:34 media
1814 40755 (2) 0 0 4096 9-Mar-2018 20:34 mnt
1815 40555 (2) 0 0 4096 9-Mar-2018 20:34 proc
1816 40755 (2) 0 0 4096 9-Mar-2018 20:34 run
1817 40755 (2) 0 0 4096 9-Mar-2018 20:34 sbin
1942 40755 (2) 0 0 4096 9-Mar-2018 20:34 srv
1943 40555 (2) 0 0 4096 9-Mar-2018 20:34 sys
1944 41777 (2) 0 0 4096 9-Mar-2018 20:34 tmp
1945 40755 (2) 0 0 4096 9-Mar-2018 20:34 usr
38765 40755 (2) 0 0 4096 9-Mar-2018 20:34 var
Install Ubuntu on Xilinx 的 “Ubuntu for Kria SOMs” 提供了 Ubuntu的映像,“iot-limerick-kria-classic-desktop-2204-x06-20220614-78.img.xz”。Ubnuntu的更多信息,可以参考
Getting Started with Certified Ubuntu 22.04 LTS for Xilinx Devices 。
使用工具,比如7zip,解压上述的wic文件的压缩版本,再使用Win32DiskImager或者类似工具,将wic文件写入TF卡,插入KR260,即可启动。
包含逻辑设计到BOOT.BIN
Xilinx建议使用KR260的客户,使用DFX进行逻辑设计,使用dfx-mgr加载新的DFX逻辑设计。如果使用DFX流程,在PetaLinux工程中,建议选择“DTG Settings”中的“Devicetree overlay”和“Remove PL from devicetree”。
很多客户还是习惯传统流程。传统流程中,Linux内核启动时会加载PL的驱动程序,所以要在启动阶段加载逻辑设计,必须在BOOT.BIN中包含逻辑设计的bit文件。请使用命令“petalinux-package --boot --u-boot --fpga --force”制作BOOT.BIN,再按前面的方法升级BOOT.BIN。
hankf@XSZGS4:kr260-221-bsp-i2c-peta$ petalinux-package --boot --u-boot --fpga --force
[INFO] Sourcing buildtools
INFO: Getting system flash information...
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/zynqmp_fsbl.elf"
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/pmufw.elf"
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/project-spec/hw-description/kr260_starter_kit_pl_bram_timer.bit"
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/bl31.elf"
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/system-zynqmp-sck-kr-g-revB.dtb"
INFO: File in BOOT BIN: "/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/u-boot.elf"
INFO: Generating zynqmp binary package BOOT.BIN...
****** Xilinx Bootgen v2022.1
**** Build date : Mar 30 2022-09:29:13
** Copyright 1986-2022 Xilinx, Inc. All Rights Reserved.
[WARNING]: Partition zynqmp_fsbl.elf.0 range is overlapped with partition bl31.elf.0 memory range
[INFO] : Bootimage generated successfully
INFO: Binary is ready.
hankf@XSZGS4:kr260-221-bsp-i2c-peta$ cat images/linux/bootgen.bif
the_ROM_image:
{
[bootloader, destination_cpu=a53-0] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/zynqmp_fsbl.elf
[pmufw_image] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/pmufw.elf
[destination_device=pl] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/project-spec/hw-description/kr260_starter_kit_pl_bram_timer.bit
[destination_cpu=a53-0, exception_level=el-3, trustzone] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/bl31.elf
[destination_cpu=a53-0, load=0x00100000] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/system-zynqmp-sck-kr-g-revB.dtb
[destination_cpu=a53-0, exception_level=el-2] /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux/u-boot.elf
}
如果在启动阶段没有加载逻辑设计,Linux内核加载PL的驱动程序时会被卡死。如果怀疑Linux启动失败时这个原因,可以再U-Boot启动时按键停止U-Boot的自动启动,在U-Boot的命令行中输入“md.l <pl_device_base_addrss>”读取PL的寄存器。如果也卡死,说明PL没有被加载,需要检查单板目前使用的BOOT.BIN。
从image.ub加载最终的根文件系统
如前所述,KR260的Linux默认使用SD(TF)卡的第2个分区(sda2)作为根文件系统(rootfs)。如果更改设计,需要烧写大约6GB的wic文件,耗时较长。实际上,文件系统rootfs.cpio大约只有800MB,压缩后的rootfs.cpio.gz大约只有200MB。使用传统的带根文件系统的image.ub启动Linux,更加方便。但是默认的KR260的PetaLinux工程中,image.ub只包含一个临时的小的根文件系统,不包含最终的根文件系统。
默认设置
检查文件"project-spec/configs/config",可以发现默认的设置如下:
hankf@XSZGS4:project-spec$ pwd
/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/project-spec
hankf@XSZGS4:project-spec$ cat configs/config | grep -A 10 -B 3 CONFIG_SUBSYSTEM_ROOTFS_INITRD
# Image Packaging Configuration
# CONFIG_SUBSYSTEM_ROOTFS_INITRAMFS is not set
CONFIG_SUBSYSTEM_ROOTFS_INITRD=y
CONFIG_SUBSYSTEM_INITRD_RAMDISK_LOADADDR=0x0
CONFIG_SUBSYSTEM_INITRAMFS_IMAGE_NAME="petalinux-initramfs-image"
CONFIG_SUBSYSTEM_UIMAGE_NAME="image.ub"
CONFIG_SUBSYSTEM_RFS_FORMATS="cpio cpio.gz cpio.gz.u-boot ext4 tar.gz jffs2
使用默认配置,编译后得到的Linux文件信息如下:
hankf@XSZGS4:linux$ pwd
/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux
hankf@XSZGS4:images$ ls -l -h
total 2.8G
-rw-r--r-- 1 hankf hankf 22M May 14 16:26 Image
-rw-r--r-- 1 hankf hankf 9.3M May 14 16:21 Image.gz
-rw-r--r-- 1 hankf hankf 32M May 14 16:21 image.ub
-rw-r--r-- 1 hankf hankf 23M May 14 16:20 ramdisk.cpio.gz
-rw-r--r-- 1 hankf hankf 23M May 14 16:20 ramdisk.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 5.3K May 14 16:20 ramdisk.manifest
-rw-r--r-- 1 hankf hankf 23M May 14 16:20 ramdisk.tar.gz
-rw-r--r-- 1 hankf hankf 230M May 14 16:23 rootfs.cpio.gz
-rw-r--r-- 1 hankf hankf 230M May 14 16:23 rootfs.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 1.2G May 14 16:23 rootfs.ext4
-rw-r--r-- 1 hankf hankf 317M May 14 16:23 rootfs.jffs2
-rw-r--r-- 1 hankf hankf 49K May 14 16:22 rootfs.manifest
-rw-r--r-- 1 hankf hankf 232M May 14 16:23 rootfs.tar.gz
...............
hankf@XSZGS4:images$ dumpimage -l image.ub
FIT description: Kernel fitImage for PetaLinux/5.15.19+gitAUTOINC+5ead03b6e6/xilinx-k26-kr
Created: Thu May 12 17:05:30 2022
Image 0 (kernel-1)
Description: Linux kernel
Created: Thu May 12 17:05:30 2022
Type: Kernel Image
Compression: gzip compressed
Data Size: 9682192 Bytes = 9455.27 KiB = 9.23 MiB
Architecture: AArch64
OS: Linux
Load Address: 0x00200000
Entry Point: 0x00200000
Hash algo: sha256
Hash value: 28338e2a871c889ab8d2569571307a0281eda7d916c97dc4f44cd64af2d6d849
Image 1 (fdt-system-top.dtb)
Description: Flattened Device Tree blob
Created: Thu May 12 17:05:30 2022
Type: Flat Device Tree
Compression: uncompressed
Data Size: 45034 Bytes = 43.98 KiB = 0.04 MiB
Architecture: AArch64
Hash algo: sha256
Hash value: 40cc4ba1fb9736b13d9d10d103d813d207ab529672114fc9022900b2e868abf1
...........................................
Image 4 (ramdisk-1)
Description: petalinux-initramfs-image
Created: Thu May 12 17:05:30 2022
Type: RAMDisk Image
Compression: uncompressed
Data Size: 23215496 Bytes = 22671.38 KiB = 22.14 MiB
Architecture: AArch64
OS: Linux
Load Address: unavailable
Entry Point: unavailable
Hash algo: sha256
Hash value: 5d5b3c289b6afda7a87e56f324afb00ee25bdeb175ea6c89312a6e4212d3bf12
Default Configuration: 'conf-system-top.dtb'
Configuration 0 (conf-system-top.dtb)
Description: 1 Linux kernel, FDT blob, ramdisk
Kernel: kernel-1
Init Ramdisk: ramdisk-1
FDT: fdt-system-top.dtb
Hash algo: sha256
Hash value: unavailable
..................
从上面可以看到,image.ub只有32MB左右,包含的文件系统只有22MB左右。Linux只是临时使用这个文件系统。
image.ub含根文件系统的设置
在PetaLinux的工程里,把ROOTFS从INITRD改为INITRAMFS,把INITRAMFS_IMAGE_NAME从petalinux-initramfs-image改为"petalinux-image-minimal",编译后的image.ub的包含最终的根文件系统。
更改后的设置如下:
hankf@XSZGS4:project-spec$ pwd
/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/project-spec
hankf@XSZGS4:project-spec$ cat configs/config | grep -A 10 -B 2 CONFIG_SUBSYSTEM_ROOTFS_INITRAMFS
# Image Packaging Configuration
#
CONFIG_SUBSYSTEM_ROOTFS_INITRAMFS=y
# CONFIG_SUBSYSTEM_ROOTFS_INITRD is not set
......
CONFIG_SUBSYSTEM_INITRAMFS_IMAGE_NAME="petalinux-image-minimal"
CONFIG_SUBSYSTEM_UIMAGE_NAME="image.ub"
CONFIG_SUBSYSTEM_RFS_FORMATS="cpio cpio.gz cpio.gz.u-boot ext4 tar.gz jffs2"
使用新配置,编译后得到的Linux的文件信息如下:
hankf@XSZGS4:linux$ pwd
/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/images/linux
hankf@XSZGS4:linux$ ls -l -h
total 6.0G
-rw-r--r-- 1 hankf hankf 740M Sep 14 16:06 Image
-rw-r--r-- 1 hankf hankf 237M Sep 14 16:06 Image.gz
-rw-r--r-- 1 hankf hankf 239M Sep 14 16:06 image.ub
-rw-r--r-- 1 hankf hankf 23M Sep 14 15:00 ramdisk.cpio.gz
-rw-r--r-- 1 hankf hankf 23M Sep 14 15:00 ramdisk.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 5.3K Sep 13 17:49 ramdisk.manifest
-rw-r--r-- 1 hankf hankf 23M Sep 14 15:00 ramdisk.tar.gz
-rw-r--r-- 1 hankf hankf 718M Sep 14 16:01 rootfs.cpio
-rw-r--r-- 1 hankf hankf 229M Sep 14 16:01 rootfs.cpio.gz
-rw-r--r-- 1 hankf hankf 229M Sep 14 16:01 rootfs.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 1.2G Sep 14 16:01 rootfs.ext4
-rw-r--r-- 1 hankf hankf 316M Sep 14 16:01 rootfs.jffs2
-rw-r--r-- 1 hankf hankf 49K Sep 14 16:00 rootfs.manifest
-rw-r--r-- 1 hankf hankf 232M Sep 14 16:01 rootfs.tar.gz
..............
hankf@XSZGS4:linux$ dumpimage -l image.ub
FIT description: Kernel fitImage for PetaLinux/5.15.19+gitAUTOINC+b0c1be301e/xilinx-k26-kr
Created: Tue Apr 12 01:52:14 2022
Image 0 (kernel-1)
Description: Linux kernel
Created: Tue Apr 12 01:52:14 2022
Type: Kernel Image
Compression: gzip compressed
Data Size: 9681872 Bytes = 9454.95 KiB = 9.23 MiB
Architecture: AArch64
OS: Linux
Load Address: 0x00200000
Entry Point: 0x00200000
Hash algo: sha256
Hash value: 969233c18dce2dfc5d3f63398c2610c5c9bb9215579c3cef57ddfa95d06fe5af
Image 1 (fdt-system-top.dtb)
Description: Flattened Device Tree blob
Created: Tue Apr 12 01:52:14 2022
Type: Flat Device Tree
Compression: uncompressed
Data Size: 46754 Bytes = 45.66 KiB = 0.04 MiB
Architecture: AArch64
Hash algo: sha256
Hash value: 29cea877670408077e8a53d989e42db2ef06818ed425502fa51bc11c3ab9afe3
.................
Image 4 (ramdisk-1)
Description: petalinux-image-minimal
Created: Tue Apr 12 01:52:14 2022
Type: RAMDisk Image
Compression: uncompressed
Data Size: 239828082 Bytes = 234207.11 KiB = 228.72 MiB
Architecture: AArch64
OS: Linux
Load Address: unavailable
Entry Point: unavailable
Hash algo: sha256
Hash value: 8065d42c7c2f4460b03a1b94655245645445c5a7b5c72353fc9fbed9919d1419
Default Configuration: 'conf-system-top.dtb'
Configuration 0 (conf-system-top.dtb)
Description: 1 Linux kernel, FDT blob, ramdisk
Kernel: kernel-1
Init Ramdisk: ramdisk-1
FDT: fdt-system-top.dtb
Hash algo: sha256
Hash value: unavailable
.................
从上面可以看到,新的image.ub有239MB,包含的文件系统已经变大为228MB。启动后,可以看到sda2被加载到“/run/media/sda2”,不再是根目录。
xilinx-kr260-starterkit-20221:/home/petalinux# dmesg | grep sda
[ 10.215647] sd 0:0:0:0: [sda] 31116288 512-byte logical blocks: (15.9 GB/14.8 GiB)
[ 10.224745] sd 0:0:0:0: [sda] Write Protect is off
[ 10.229556] sd 0:0:0:0: [sda] Mode Sense: 23 00 00 00
[ 10.235198] sd 0:0:0:0: [sda] No Caching mode page found
[ 10.245733] sd 0:0:0:0: [sda] Assuming drive cache: write through
[ 10.259460] sda: sda1 sda2
[ 10.264831] sd 0:0:0:0: [sda] Attached SCSI removable disk
[ 13.202278] FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
[ 13.334297] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
xilinx-kr260-starterkit-20221:/home/petalinux# df -h
Filesystem Size Used Available Use% Mounted on
devtmpfs 4.0M 4.0K 4.0M 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 786.1M 9.8M 776.3M 1% /run
tmpfs 4.0M 0 4.0M 0% /sys/fs/cgroup
tmpfs 1.9G 0 1.9G 0% /tmp
tmpfs 1.9G 12.0K 1.9G 0% /var/volatile
/dev/sda1 2.0G 107.8M 1.9G 5% /run/media/sda1
/dev/sda2 3.8G 807.1M 2.8G 22% /run/media/sda2
tmpfs 393.1M 0 393.1M 0% /run/user/1000
xilinx-kr260-starterkit-20221:/home/petalinux# free
total used free shared buff/cache available
Mem: 4024936 84916 3601200 318300 338820 3536020
Swap: 0 0 0
INITRAMFS和petalinux-initramfs-image
注意,不能同时使用配置“ROOTFS_INITRAMFS”,和把INITRAMFS_IMAGE_NAME设置成“petalinux-initramfs-image”,否则会遇到错误“Could not find any petalinux-initramfs-image-xilinx-k26-kr.cpio{.gz|.lz4|.lzo|.lzma|.xz|.zst) for bundling; ”。
这时的配置如下:
# Image Packaging Configuration
CONFIG_SUBSYSTEM_ROOTFS_INITRAMFS=y
# CONFIG_SUBSYSTEM_ROOTFS_INITRD is not set
CONFIG_SUBSYSTEM_INITRAMFS_IMAGE_NAME="petalinux-initramfs-image"
CONFIG_SUBSYSTEM_UIMAGE_NAME="image.ub"
CONFIG_SUBSYSTEM_RFS_FORMATS="cpio cpio.gz cpio.gz.u-boot ext4 tar.gz"
更多错误信息如下:
Initialising tasks: 100% |#####################################################################################################################################################| Time: 0:00:08
Checking sstate mirror object availability: 100% |#############################################################################################################################| Time: 0:00:04
Sstate summary: Wanted 1089 Local 21 Network 647 Missed 421 Current 2635 (61% match, 88% complete)
Removing 27 stale sstate objects for arch xilinx_k26_kr: 100% |################################################################################################################| Time: 0:00:00
NOTE: Executing Tasks
ERROR: linux-xlnx-5.15.19+gitAUTOINC+b0c1be301e-r0 do_bundle_initramfs:
Could not find any /home/hankf/proj/kr260/v221/kr260-221-bsp-peta/build/tmp/deploy/images/xilinx-k26-kr/
petalinux-initramfs-image-xilinx-k26-kr.cpio{.gz|.lz4|.lzo|.lzma|.xz|.zst) for bundling;
INITRAMFS_IMAGE_NAME might be wrong.
减小image.ub大小
分析文件大小
上述的image.ub很大。解压文件系统的压缩文件,使用du命令“du --max-depth=2 -h | grep [0-9]M ”分析文件夹的大小。
hankf@XSZGS4:rootfs$ du --max-depth=3 -h | grep [0-9][0-9]M
18M ./lib/udev
44M ./lib
440M ./usr/lib/python3.9
512M ./usr/lib
106M ./usr/bin
26M ./usr/libexec/gcc
28M ./usr/libexec
17M ./usr/share/jupyter
17M ./usr/share/cmake-3.21
78M ./usr/share
733M ./usr
13M ./var/lib/rpm
18M ./var/lib
18M ./var
810M .
可以看到主要是文件夹“/usr/lib”和“/usr/bin”占用了很多空间。其中python的库就占用了440MB。
PetaLinux的文件系统的配置保存在文件project-spec/configs/rootfs_config,由rootfs_config.py分析后输出到build/conf/plnxtool.conf。 在petalinux-config的verbose模式下可以看到具体过程。
分析文件project-spec/configs/rootfs_config,通过下面字段,可以发现packagegroup-core-full-cmdline、packagegroup-petalinux-jupyter和packagegroup-petalinux-som被使能。
CONFIG_packagegroup-core-full-cmdline=y
CONFIG_packagegroup-petalinux-jupyter=y
CONFIG_packagegroup-petalinux-som=y
重点分析packagegroup-petalinux-som,检查它的定义文件packagegroup-petalinux-som.bb,可以发现它使能了python、jupyter等软件包。
SOM_PACKAGES = " \
packagegroup-core-full-cmdline \
packagegroup-core-tools-debug \
packagegroup-core-ssh-dropbear \
packagegroup-petalinux-jupyter \
packagegroup-petalinux-networking-stack \
packagegroup-petalinux-python-modules \
packagegroup-petalinux-tpm \
packagegroup-petalinux-utils \
packagegroup-petalinux \
archconfig \
fru-print \
image-update \
ldd \
ntp \
resize-part \
tree \
tzdata \
xmutil \
som-dashboard \
k26-starter-kits \
lmsensors-fancontrol \
"
RDEPENDS:${PN} = "${SOM_PACKAGES}"
使用命令“petalinux-config -c rootfs”配置文件系统,禁止上述模块。再编译petalinux工程,可以发现rootfs.cpio和image.ub的大小都大大减小。
hankf@XSZGS4:kr260-221-bsp-i2c-peta$ ls images/linux/ -l -h
total 2.3G
-rw-r--r-- 1 hankf hankf 305M Sep 15 16:55 Image
-rw-r--r-- 1 hankf hankf 103M Sep 15 16:55 Image.gz
-rw-r--r-- 1 hankf hankf 104M Sep 15 16:55 image.ub
-rw-r--r-- 1 hankf hankf 284M Sep 15 16:50 rootfs.cpio
-rw-r--r-- 1 hankf hankf 95M Sep 15 16:50 rootfs.cpio.gz
-rw-r--r-- 1 hankf hankf 95M Sep 15 16:50 rootfs.cpio.gz.u-boot
-rw-r--r-- 1 hankf hankf 500M Sep 15 16:50 rootfs.ext4
-rw-r--r-- 1 hankf hankf 128M Sep 15 16:50 rootfs.jffs2
-rw-r--r-- 1 hankf hankf 39K Sep 15 16:50 rootfs.manifest
-rw-r--r-- 1 hankf hankf 95M Sep 15 16:50 rootfs.tar.gz
继续分析文件系统,还可以进一步减小系统的大小。
分析PetaLinux配置
也可以正向分析来减少软件包。
PetaLinux编译的目标是petalinux-image-minimal。分析petalinux-image-minimal的定义文件petalinux-image-minimal.bb和petalinux-image-minimal.bbappend,可以发现它包含的软件包。
hankf@XSZGS4:kr260-221-bsp-peta$ find -name "petalinux-image-minimal*.bb*"
./components/yocto/layers/meta-petalinux/recipes-core/images/petalinux-image-minimal.bb
./components/yocto/layers/meta-som/dynamic-layers/petalinux/recipes-core/images/petalinux-image-minimal.bbappend
petalinux-image-minimal.bb只包含了petalinux-image-common-som.inc。 petalinux-image-common.inc中通过定义IMAGE_INSTALL、IMAGE_FEATURES,增加了各种软件包。主要内容如下:
IMAGE_FEATURES += "${COMMON_FEATURES}
COMMON_FEATURES = " \
ssh-server-dropbear \
hwcodecs \
"
IMAGE_INSTALL = " \
packagegroup-core-boot \
${COMMON_INSTALL} \
${CORE_IMAGE_EXTRA_INSTALL} \
"
COMMON_INSTALL = " \
tcf-agent \
mtd-utils \
bridge-utils \
can-utils \
pciutils \
kernel-modules \
nfs-utils \
nfs-utils-client \
"
COMMON_INSTALL:append:zynqmp = " ${INSTALL_ZYNQ_ZYNQMP_VERSAL} hellopm ${LIBDFX_RECIPE}"
INSTALL_ZYNQ_ZYNQMP_VERSAL = " haveged htop iperf3 meson u-boot-tools"
CORE_IMAGE_EXTRA_INSTALL:append:ultra96 = " packagegroup-base-extended"
上面的内容,为了便于理解,调整了各个变量的顺序。
petalinux-image-minimal.bbappend包含了petalinux-image-common-som.inc, 后者增加了软件包packagegroup-petalinux-som。
其它
PetaLinux的用户名和密码
PetaLinux 2022.1 为了提升系统安全性,第一次启动时,需要设置用户密码。默认用户名是petalinux。第一次使用sudo时,也需要设置密码。
PetaLinux 2022.1_release_S04190222 xilinx-kr260-starterkit-20221 ttyPS1
xilinx-kr260-starterkit-20221 login: petalinux
You are required to change your password immediately (administrator enforced).
New password:
Retype new password:
[ 25.175711] audit: type=1006 audit(1637342384.772:2): pid=753 uid=0 old-auid=4294967295 auid=1000 tty=(none) old-ses=4294967295 ses=1 res=1
[ 25.188338] audit: type=1300 audit(1637342384.772:2): arch=c00000b7 syscall=64 success=yes exit=4 a0=8 a1=fffffd5ff460 a2=4 a3=ffffa94d66b0 items=0 ppid=1 pid=753 auid=1000 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=1 comm="(systemd)" exe="/lib/systemd/systemd" key=(null)
[ 25.214878] audit: type=1327 audit(1637342384.772:2): proctitle="(systemd)"
xilinx-kr260-starterkit-20221:~$ sudo su
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
Password:
uboot saveenv 命令
KR260 BSP 的U-Boot,默认不带有saveenv 命令。如果要使能saveenv命令,需要在文件"components/yocto/layers/meta-som/recipes-bsp/u-boot/files/som_k26.cfg"中,添加以下行。
CONFIG_ENV_SUPPORT=y
CONFIG_SAVEENV=y
# CONFIG_ENV_OVERWRITE is not set
# CONFIG_ENV_IS_NOWHERE is not set
CONFIG_ENV_IS_IN_FAT=y
否则,编译可能遇到下列错误,
| rm -f drivers/mtd/spi/built-in.o; aarch64-xilinx-linux-ar cDPrsT drivers/mtd/spi/built-in.o drivers/mtd/spi/sf-uclass.o drivers/mtd/spi/spi-nor.o drivers/mtd/spi/sf_mtd.o
| aarch64-xilinx-linux-ld.bfd -nostdlib -znocombreloc -T /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/build/tmp/work/xilinx_k26_kr-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2022.1+gitAUTOINC+c50d6c48f4-r0/git/arch/arm/lib/elf_aarch64_efi.lds -shared -Bsymbolic -znorelro -s lib/efi_loader/helloworld.o lib/efi_loader/efi_crt0.o lib/efi_loader/efi_reloc.o lib/efi_loader/efi_freestanding.o -o lib/efi_loader/helloworld_efi.so
| aarch64-xilinx-linux-objcopy -j .header -j .text -j .sdata -j .data -j .dynamic -j .dynsym -j .rel* -j .rela* -j .reloc -O binary lib/efi_loader/helloworld_efi.so lib/efi_loader/helloworld.efi
| /proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/build/tmp/work/xilinx_k26_kr-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2022.1+gitAUTOINC+c50d6c48f4-r0/git/cmd/nvedit.c:65:3: error: #error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|NAND|NVRAM|ONENAND|SATA|SPI_FLASH|REMOTE|UBI} or CONFIG_ENV_IS_NOWHERE
| 65 | # error Define one of CONFIG_ENV_IS_IN_{EEPROM|FLASH|MMC|FAT|EXT4|\
| | ^~~~~
| make[2]: *** [/proj/hankf/hankf/kr260/v221/kr260-221-bsp-i2c-peta/build/tmp/work/xilinx_k26_kr-xilinx-linux/u-boot-xlnx/v2021.01-xilinx-v2022.1+gitAUTOINC+c50d6c48f4-r0/git/scripts/Makefile.build:253: cmd/nvedit.o] Error 1
| make[2]: *** Waiting for unfinished jobs....
制作WIC映像
修改文件components/yocto/layers/meta-petalinux/recipes-core/initrdscripts/initramfs-framework/searche2fs,为如下内容。
#!/bin/sh
searche2fs_enabled() {
return 0
}
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
# sourcing the required functions
. /scripts/functions
searche2fs_run() {
if [ -z "$ROOTFS_DIR" ]; then
return 0
fi
if [ -z "${bootparam_ext2}" ] && [ -z "${bootparam_ext3}" ] && [ -z "${bootparam_ext4}" ]; then
boot_devices=""
block_devices=""
count=15
for i in $(seq $count); do
block_devices=$(ls /sys/block/ | grep -e "sd[a-z]\{1,\}$" -e "mmcblk[0-9]\{1,\}$")
sleep 0.1
done
for block_device in $block_devices; do
boot_devices=$(blkid /dev/${block_device}* | grep "TYPE=\"ext" | cut -d: -f 1)
for boot_device in $boot_devices; do
if [ -e ${boot_device} ]; then
boot_device_type="$(blkid ${boot_device} | grep -o 'TYPE=.*' | cut -d\" -f 2)"
mkdir -p "$ROOTFS_DIR"
check_fsck "$boot_device" "$boot_device_type"
if ! mount -t $boot_device_type $boot_device $ROOTFS_DIR; then
msg "Failed to mount selected root filesystem ($boot_device)"
fi
if [ ! -d $ROOTFS_DIR/dev ]; then
umount $ROOTFS_DIR
msg "There's no '/dev' on $boot_device_type(${boot_device}) partition."
else
if ! check_init $ROOTFS_DIR; then
umount $ROOTFS_DIR
fi
return 0
fi
fi
done
done
fi
}
请使用下列命令,制作WIC映像。
petalinux-package --wic --bootfiles "ramdisk.cpio.gz.u-boot boot.scr Image system*.dtb" --disk-name "sda"
网口
KR260 有PS、PL网口。 PS网口在靠近USB插座一侧。
TF卡
KR260 TF卡使用USB芯片链接,不是PS SD Controller连接。所以在U-Boot里,需要使用USB设备访问TF卡里的文件,比如“fatls usb 0”.
ZynqMP> mmc list
No MMC device available
ZynqMP> mmcinfo
No MMC device available
ZynqMP> usb start
ZynqMP> usb dev
IDE device 0: Vendor: Generic Rev: 1.98 Prod: Ultra HS-COMBO
Type: Removable Hard Disk
Capacity: 15193.5 MB = 14.8 GB (31116288 x 512)
ZynqMP> fatls usb 0
22401536 Image
2777 boot.scr
23216868 ramdisk.cpio.gz.u-boot
46945 system-zynqmp-sck-kr-g-revB.dtb
46945 system.dtb
System Volume Information/
52077 rootfs.manifest
256544692 rootfs.cpio.gz.u-boot
1733256 BOOT.BIN