ZYBO開發板之兩種啓動方式:從SD卡和qspi啓動

Posted by Jason Wong on April 19, 2018

##1.從SD卡啓動 有時準備好了BOOT.bin, uramdisk.image.gz, uImage, devicetree.dtb這些文件,並且已經復制進了SD卡,開發板上電後在uboot命令行輸入boot命令時不能啓動linux系統,有很大的原因是bootcmd命令設置錯誤,導致機器找不到啓動所需文件,這時需要修改bootcmd命令:

set bootcmd fatload mmc 0 0x3000000 uImage\;fatload mmc 0 0x2A00000 devicetree.dtb\;fatload mmc 0 0x2000000 uramdisk.image.gz\;bootm 0x3000000 0x2000000 0x2A00000

解釋: 1) fatload mmc 0 0x3000000 uImage 意思是從mmc(SD) Device 0加載uImage到RAM的地址0x3000000處,其他同理。

參考:fatload mmc 0:1 0x3000000 uImage 意思是從mmc(SD) Device 0,partition 1加載uImage到RAM的地址0x3000000處。上面給出的命令沒有指明從哪個分區加載,應該從默認的分區加載吧;具體默認分區是0還是1我後面再查明。

2)設置好加載的地址後執行bootm命令從這些地址加載啓動文件.

##2.從qspi啓動 這裏給出的示例是先用tftpboot命令從主機下載相關文件到開發板的內存中,然後再燒寫到qspi內存中。 注意:進行qspi分區及寫入操作之前,BOOT.bin文件已經用vivado SDK寫入到開發板中,否則不能進行以下這些操作。 這是我的qspi分區情況,需要注意的是分區的大小要>=要寫入的文件大小,否則前面寫入的文件會被覆蓋,導致文件不完整從而不能啓動系統。

Creating 5 MTD partitions on "spi0.0":
0x000000-0x800000 :         "qspi-fsbl-uboot"	//8M(0x800000)
0x800000-0x01600000 :       "qspi-linux"	//8M(0x800000)
0x1600000-0x1680000 :       "qspi-devicetree"	//512K(0x80000)
0x1700000-0x2200000:        "qspi-rootfs"	//10M(0xA00000)

1)下載uImage到內存中

tftpboot 0x30000000 uImage

2)給qspi分區並寫入文件

#先探測qspi
sf probe
#擦除要寫入的區域,地一個地址表示要寫入的內存的偏移量,第二個是要寫入的大小
sf erase 0x800000 0x800000
#從RAM的0x30000000地址處把文件寫道偏移地址爲0x800000的qspi內存處,寫入大小爲0x800000
#0x30000000可以取其他值。
sf write 0x30000000 0x800000 0x800000
#其他同理
tftpboot 0x30000000 devicetree.dtb
sf erase 0x1600000 0x80000
sf write 0x30000000 0x1600000 0x80000

tftpboot 0x30000000 uramdisk.image.gz
sf erase 0x1700000 0x500000
sf write 0x30000000 0x1700000 0x500000

至此,文件燒寫完成,接下來設置uboot的啓動參數。

3)設置uboot啓動參數

setenv bootcmd  'sf probe && echo uIamge is loading ... ... && sf read 0x2080000 0x800000 0x800000 &&echo deviceTree is loading ... ... && sf read 0x2000000 0x1600000 0x80000 && echo ramdisk.image is loading ... ... && sf read 0x4000000 0x1700000 0x500000 && bootm 0x2080000 0x4000000 0x2000000'

:sf read 0x2080000 0x800000 0x800000 表示uImage的啓動地址是0x2080000, 從qspi存儲區0x800000處讀取到RAM中,讀取的文件大小是0x800000,其他同理。 uImage, uramdisk.image.gz, devicetree.dtb的啓動地址可以在uboot界面下使用print命令查看

Zynq> print

 .......         
                                                
devicetree_image=devicetree.dtb                                                 
devicetree_load_address=0x2000000                                               
devicetree_size=0x20000 
                                                        
.......

kernel_image=uImage                                                             
kernel_load_address=0x2080000                                                   
kernel_size=0x500000     
                                                                                                                  
.......

ramdisk_image=uramdisk.image.gz                                                 
ramdisk_load_address=0x4000000                                                  
ramdisk_size=0x5E0000    
                                                       
.......
                                                                              
Environment size: 5434/524284 bytes