前面说的我的硬件上有一颗eMMC的芯片,型号是MTFC4GACAJCN-4M IT,有4GB的容量。
BOOT.bin的文件较小,只有不到3MB,但是image.ub的文件根据不同的需求,将来可能会越来越大,将它们都放在16MB的QSPI Flash上有点危险,而且下载起来也不太方便。
所以准备将u-boot和kernel的存储位置分开,将包含u-boot的BOOT.bin烧录在QSPI Flash当中,将image.ub文件直接放在eMMC中进行启动。
step1:eMMC存储空间分区
参考文档网址:http://zedboard.org/sites/default/files/design/PicoZed_Petalinux_2015_2_eMMC_boot_v3.0_0.zip
前面我配置的方式是BOOT.bin和image.ub都在QSPI Flash当中,这样我才能正常启动Linux,来给eMMC提前进行分区。
因为我的板子上没有SD卡,所以禁用了PS的SD0外设,最终我的eMMC芯片挂载到了mmcblk0上。(假如既有SD卡又有eMMC,一般情况下SD卡会是mmcblk0,eMMC会是mmcblk1)
启动板子,输入用户名密码后,进行分区。按照手册上的说明,分一个128MB的分区出来,并格式化成FAT32.
下面是我的分区和格式化过程:
root@ifc_petalinux:~# fdisk /dev/mmcblk0
The number of cylindersfor this disk is set to 117504.
Thereis nothing wrong with that, but this is larger than 1024,
and couldincertain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software fromother OSs
(e.g., DOS FDISK, OS/2FDISK)
Command (mforhelp): p
Disk/dev/mmcblk0: 3850 MB, 3850371072bytes4 heads, 16 sectors/track, 117504cylinders
Units= cylinders of 64 * 512 = 32768bytes
Device Boot Start End Blocks Id System
Command (mforhelp): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1First cylinder (1-117504, default 1): Using default value 1Last cylinder or+size or +sizeM or +sizeK (1-117504, default 117504): +128M
Command (mforhelp): t
Partition number (1-4): 1Hex code (type L to list codes): L0 Empty 1b Hidden Win95 FAT32 9f BSD/OS1FAT12 1c Hidden W95 FAT32 (LBA) a0 Thinkpad hibernation4 FAT16 <32M 1e Hidden W95 FAT16 (LBA) a5 FreeBSD5Extended 3c Part.Magic recovery a6 OpenBSD6 FAT16 41PPC PReP Boot a8 Darwin UFS7 HPFS/NTFS 42SFS a9 NetBSD
a OS/2 Boot Manager 63GNU HURD or SysV ab Darwin boot
b Win95 FAT3280Old Minix b7 BSDI fs
c Win95 FAT32 (LBA)81 Minix /old Linux b8 BSDI swap
e Win95 FAT16 (LBA)82Linux swap be Solaris boot
f Win95 Ext'd (LBA) 83 Linux eb BeOS fs
11 Hidden FAT12 84 OS/2hidden C: drive ee EFI GPT12 Compaq diagnostics 85 Linux extended ef EFI (FAT-12/16/32)14 Hidden FAT16 <32M 86 NTFS volume set f0 Linux/PA-RISC boot16 Hidden FAT16 87 NTFS volume setf2 DOS secondary17 Hidden HPFS/NTFS 8e Linux LVM fd Linux raid autodetect
Hex code (type L to list codes): b
Changed system type of partition1to b (Win95 FAT32)
Command (mforhelp): w
The partition table has been altered.
Calling ioctl() to re-read partition table
mmcblk0: p1
root@ifc_petalinux:~#
mkdosfs-F 32 /dev/mmcblk0p1
step2:配置u-boot从eMMC引导启动PetaLinux
执行命令:
petalinux-config
配置启动方式,将kernel启动配置为eMMC启动:
#Subsystem AUTO Hardware Settings ---># Advanced bootable images storage Settings---># boot image settings---># image storage media--->primary flash
# kernel image settings---># image storage media--->primary sd
# SD/SDIO Settings ----> ps_sd1
其中的SD/SDIO Settings一定要配置为eMMC对应的SD1。
重新编译:
petalinux-build
编译完成后,重新使用Windows的Xilinx SDK将:zynq_fsbl.elf--->IFC_TOP_wrapper.bit--->u-boot.elf三个文件打包成BOOT.bin文件,改名为BOOT_EMMC.bin。
将BOOT.bin和image.ub文件复制到U盘上,然后把U盘插到板子的USB口。
mkdir /mnt/usb
mkdir/mnt/emmc
#挂载usb和emmc
mount/dev/sda1 /mnt/usb
mount/dev/mmcblk0p1 /mnt/emmc
#复制image.ub到emmc第一个分区mmcblk0p1
cp/mnt/usb/image.ub /mnt/emmc
#复制BOOT_EMMC.bin到QSPI FLASH第一个分区mtd0
flashcp/mnt/usb/BOOT_EMMC.bin /dev/mtd0
#接触挂载
umount/mnt/usb
umount/mnt/emmc
假如出现:FAT-fs (sda1): Volume was not properly unmounted. Some data may be corrupt. Please run fsck.
说明上次U盘没有正确移除,可能会造成image.ub的复制错误。需要在windows中修复一下U盘,再重新进行上面的操作。
重新启动板子:
shutdown now -r
这一次板子就能够从QSPI运行FSBL,加载bit,运行u-boot,
然后u-boot从eMMC芯片引导加载Linux操作系统。
eMMC最终被我分为了3个区,
第一个分区用来存放image.ub或者将来的设备树等文件,128MB
第二个分区用来存放用户数据,2048MB
第三个分区用来存放库文件,如opencv的库,剩余的1个多GB
待改进:
eMMC默认是有两个16MB的boot分区的,而且还支持加密什么的,是否可以把u-boot和image.ub放到里面去。
并且两个boot分区可在系统升级时进行切换。好复杂,将来有时间再研究吧。
yuan :https://blog.csdn.net/vacajk/article/category/6645367