ZYNQ BOOT.bin 的製作方法

ZYNQ BOOT.bin 的製作方法

參考地址:(防丟失)
ZYNQ之uboot,kernel,設備樹,文件系統生成。
[dts]Device Tree機制

1、FSBL.elf :SDK生成的FSBL(first stage boot loader)
2、your_design.bit :用戶設計文件
3、u-boot.elf : (Linux boot loader)
4、uImage :Linux內核映像文件
5、devicetree.dtb :命名爲devicetree.dtb的設備樹文件,依賴於ZYNQ
6、uramdisk.image.gz :
7、合成Boot.bin

1、FSBL.elf

導出設備信息並Launch SDK, 新建FSBL工程並編譯,生成FSBL

ZYNQ之uboot,kernel,設備樹,文件系統生成。

下載文件名稱: https://github.com/Xilinx

u-boot-xlnx-xilinx-v2016.4.zip
2016.4-zed-release.tar.xz

device-tree-xlnx-xilinx-v2016.4.zip

arm_ramdisk.image.gz

一、環境搭建

請參考博客:https://blog.csdn.net/flyingforever_wl/article/details/8097059

環境搭建好後在.bashrc 中設置環境變量:

export ARCH=arm
  export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
  export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH

二、編譯u-boot

1). 將下載好的u-boot-xlnx-xilinx-v2016.4.zip 解壓 unzip u-boot-xlnx-xilinx-v2016.4.zip

修改DDR的大小:

許多教程裏面是Vivado2016.2之前的版本,修改DDR的方法爲修改include/configs/zynq_zed.h文件
 在這裏插入圖片描述
 Vivado2016.4裏zynq_zed.h 中沒有找到這該宏定義,於是去翻github,發現vivado2016.2中才把此宏定義刪除的,轉爲由dts文件定義,如下圖

在這裏插入圖片描述

剛開始以爲是在devicetree.dtb中修改即可,發現修改後並不生效,嘗試多次終於發現在u-boot文件夾中也有個dts文件夾,其中有zynq-zed.dts文件中定義了設備樹。

因此此處需要修改的是uboot文件夾中arch/arm/dts/zynq-zed.dts 中DDR設備樹的定義大小,如下圖
在這裏插入圖片描述
 至此,DDR的大小修改完成

注意:uboot中arch/arm/dts/zynq-zed.dts文件最好跟生成devicetree.dtb的設備樹文件保持一致

2). 進入解壓目錄,生成編譯腳本:make zynq_zed_config

3). make -j8

4) mv u-boot u-boot.elf

注意:此處一定要將u-boot轉換成u-boot.elf後在生成燒寫文件

二、編譯kernel uImage :Linux內核映像文件

1). 解壓kernel文件linux-xlnx-xilinx-v2016.4.zip: unzip linux-xlnx-xilinx-v2016.4.zip

2). make xilinx_zynq_defconfig

3). make UIMAGE_LOADADDR=0x8000 uImage -j8

編譯完成後生成的uImage在arch/arm/boot目錄下

三、devicetree.dtb生成

1). devicetree的生成依賴於FPGA工程中ZYNQ的配置,方法請參考:http://blog.chinaaet.com/cuter521/p/5100001052

2). 我的bootargs設置是:
  在這裏插入圖片描述
其中QSPI部分的描述根據uboot中arch/arm/dts/zynq-zed.dts中對QSPI的描述進行修改,因爲我最終是要用到QSPI FLASH啓動因此需要對QSPI FLASH進行分區設置

修改好dts文件後,將pl.dtsi skeleton.dtsi system.dts zynq-7000.dtsi文件拷貝到ubuntu下:
  在這裏插入圖片描述
  使用命令生成devicetree.dtb文件:dtc -I dts -O dtb -o devicetree.dtb system.dts

四、uramdisk修改官方根文件系統

1). 解壓壓縮包: gunzip arm_ramdisk.image.gz

2). chmod u+rwx arm_ramdisk.image

3). 創建目錄並掛載ramdisk:mkdir file_system; mount arm_ramdisk.image file_system

4). 修改file_system內容,由於我們未使用到sd卡,因此將/etc/fstab中的最後兩行刪除掉:
在這裏插入圖片描述
5). 完成修改後umount file_system

6). 壓縮文件系統:gzip arm_ramdisk.image

7). mkimage -A arm -T ramdisk -C gzip -d arm_ramdisk.image.gz uramdisk.image.gz

如果要修改意見生成好的uramdisk.image.gz,需要反向生成ramdisk.image再進行上述的操作,uramdisk.image.gz–>ramdisk.image步驟如下:

1). sudo dd if=./uramdisk.image.gz of=./ramdisk.image.gz skip=16 bs=4

參考鏈接:http://www.wiki.xilinx.com/Build%20and%20Modify%20a%20Rootfs

7、合成Boot.bin

1).SDK軟件中Xilinx Tools 下Create Boot Image

加載各種文件,設置offset,make

附上環境搭建及編譯過程中遇到的一些錯誤及解決辦法:

U-boot編譯時出現錯誤fatal error:openssl/evp.h: No such file or derectory 解決:apt-get install libssl-dev

問題:dtc:command not found
  解決:apt-get install device-tree-compiler
  問題:fatal error curses.h no such file or directory
  解決:apt-get install libncurses5-dev

u-boot 啓動後找不到網絡

問題在於vivado配置ZYNQ的時候,選中的eth沒有選擇對應的MDIO。
  解決方法:在vivado中選中MDIO後重新編譯生成bit文件,重新導出hardware,重新產生FSBL。
  不能直接生成FSBL,需要重新生成hardware文件後重新生成FSBL

內核編譯:

錯誤: “mkimage” Command not found
  解決: apt-get install u-boot-tools

內核啓動時出現錯誤

Copying Linux from QSPI flash to RAM…

SF: Unsupported flash IDs: manuf 00, jedec 0000, ext_jedec 0000
  Failed to initialize SPI flash at 0:0 (error -93)

是由於內核啓動命令中sf probe 0 0 0 &&這句參數不對,應該修改爲sf probe 0 &&

在uboot目錄下./include/configs/zynq-common.h文件中修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章