1. 程式人生 > >ZYNQ之uboot,kernel,裝置樹,檔案系統生成(轉載)

ZYNQ之uboot,kernel,裝置樹,檔案系統生成(轉載)

 轉載自:https://www.cnblogs.com/huakaimanlin/p/9055800.html

  Vivado:2016.4

  Linux:Ubuntu16.4

  ZYNQ:xc7z020

  

  下載檔名稱

  2016.4-zed-release.tar.xz

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

  linux-xlnx-xilinx-v2016.4.zip

  u-boot-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

  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目錄下 

三、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

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

四、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 

  合成BOOT.mcs

  利用Vivado SDK生成BOOT.mcs

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

  

  2). 新增生成BOOT.mcs所需檔案,注意順序:

  

  其中FSBL.elf 和u-boot.elf不需要設定offset,uImage、devicetree.dtb、uramdisk.image.gz這三個檔案的偏移地址需要根據devicetree.dtb中描述的QSPI Flash中對應地址一致

  

   生成BOOT.mcs後,在Xilinx Tools/ Program Flash 對QSPI進行燒寫

  燒寫完成後一切正常的話串列埠會看到列印資訊

  

  

  linux下更新FPGA的方法:

  http://www.wiki.xilinx.com/Programming+the+Programmable+Logic  

 

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

  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檔案中修改