前面說的我的硬件上有一顆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卡<SD0>又有eMMC<SD1>,一般情況下SD卡會是mmcblk0,eMMC會是mmcblk1)
啟動板子,輸入用戶名密碼后,進行分區。按照手冊上的說明,分一個128MB的分區出來,並格式化成FAT32.
下面是我的分區和格式化過程:
root@ifc_petalinux:~# fdisk /dev/mmcblk0 The number of cylinders for this disk is set to 117504. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/mmcblk0: 3850 MB, 3850371072 bytes 4 heads, 16 sectors/track, 117504 cylinders Units = cylinders of 64 * 512 = 32768 bytes Device Boot Start End Blocks Id System Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-117504, default 1): Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-117504, default 117504): +128M Command (m for help): t Partition number (1-4): 1 Hex code (type L to list codes): L 0 Empty 1b Hidden Win95 FAT32 9f BSD/OS 1 FAT12 1c Hidden W95 FAT32 (LBA) a0 Thinkpad hibernation 4 FAT16 <32M 1e Hidden W95 FAT16 (LBA) a5 FreeBSD 5 Extended 3c Part.Magic recovery a6 OpenBSD 6 FAT16 41 PPC PReP Boot a8 Darwin UFS 7 HPFS/NTFS 42 SFS a9 NetBSD a OS/2 Boot Manager 63 GNU HURD or SysV ab Darwin boot b Win95 FAT32 80 Old Minix b7 BSDI fs c Win95 FAT32 (LBA) 81 Minix / old Linux b8 BSDI swap e Win95 FAT16 (LBA) 82 Linux swap be Solaris boot f Win95 Ext'd (LBA) 83 Linux eb BeOS fs 11 Hidden FAT12 84 OS/2 hidden C: drive ee EFI GPT 12 Compaq diagnostics 85 Linux extended ef EFI (FAT-12/16/32) 14 Hidden FAT16 <32M 86 NTFS volume set f0 Linux/PA-RISC boot 16 Hidden FAT16 87 NTFS volume set f2 DOS secondary 17 Hidden HPFS/NTFS 8e Linux LVM fd Linux raid autodetect Hex code (type L to list codes): b Changed system type of partition 1 to b (Win95 FAT32) Command (m for help): 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分區可在系統升級時進行切換。好復雜,將來有時間再研究吧。