新近入手了一塊國產(chǎn)化ZedBoard贱勃,全兼容Digilent ZedBoard,物美價廉贵扰。通過幾天時間摸索戚绕,u-boot,linux耘子,linaro都從官網(wǎng)下載了源碼并編譯生成鏡像球切,并通過SD卡啟動成功吨凑,通過本文記錄如下怀骤。主要講操作,涉及些許原理,遇到過的問題也對現(xiàn)象焚鹊、思路末患、解決辦法做了記錄,在這里分享給大家嚷炉。更多的ZedBoard Demo教程申屹,可以訪問我的個人網(wǎng)站www.qingchengyouran.com獲取隧膏。
概述
Zynq芯片啟動流程如上圖所示胞枕,可以看出想要將ZedBoard從SD卡啟動,需要完成以下準(zhǔn)備工作:
- 將SD卡分為fat32和ext4兩個分區(qū)队询,fat32分區(qū)保存Linux的內(nèi)核映像构诚,ext4分區(qū)保存Linux文件系統(tǒng)唤反,
- 通過Vivado生成Bit文件,
- 導(dǎo)出硬件配置肠缨,在SDK中生成fsbl文件盏阶,
- 編譯u-boot源碼生成u-boot.elf名斟,將.bit、fsbl.elf闷袒、u-boot.elf合成為BOOT.BIN文件并拷貝到fat32分區(qū)囊骤,
- 編譯xilinx-linux源碼生成uImage冀值,拷貝到fat32分區(qū)
- 在xilinx-linux源碼中修改dts文件列疗,并用dtc工具生成devicetree.dtb,拷貝到fat32分區(qū)
- 將linaro文件系統(tǒng)拷貝到ext4分區(qū)
可以使用我生成的鏡像做測試告材, https://pan.baidu.com/s/1p2Pgu_YF-vdSDqxUYbxOcQ 创葡,提取碼:xtjq
環(huán)境
ZedBoard Zynq Evaluation and Development Kit (xc7z020clg484-1)
BanQ-A1 32G TF存儲卡 + SanDisk microSD Adapter + 川宇USB3.0高速讀卡器
Xilinx Vivado 2017.1
Xilinx SDK 2017.1
VMWare 12.5.2 build-4638234 + Ubuntu 14.04
交叉編譯工具鏈?zhǔn)褂胊rm-xilinx-linux-gnueabi-
putty_V0.63.0.0.43510830
一灿渴、SD卡分區(qū)
Xilinx推薦SD卡至少大于4GB,speed-grade為6或者更高蹬挤,在Linux下操作棘幸,分區(qū)軟件使用GParted误续。
- sudo apt-get install GParted 蹋嵌,安裝 gparted分區(qū)工具,
- 插入SD卡躏仇,在VMWare中點(diǎn)擊“虛擬機(jī) -> 可移動設(shè)備 -> Prolific USB SD Card Reader -> 連接 ”焰手,讓ubuntu識別到SD卡怀喉,
- sudo gparted躬拢,運(yùn)行GParted,
- 工具欄選擇/dev/sdb,先umount已有分區(qū)馅袁,再Delete掉汗销,為格式化做準(zhǔn)備抵窒,
-
新建分區(qū)李皇,第一個分區(qū)至少60MB宙枷,格式化為fat32文件系統(tǒng)慰丛,F(xiàn)ree space preceding需要設(shè)置為4MB诅病,Label為BOOT粥烁,
- 新建分區(qū)讨阻,第二個分區(qū)用完剩余空間变勇,格式化為ext4文件系統(tǒng),Label為rootfs飞袋。
- 在工具欄點(diǎn)擊綠色的勾“Apply All Opertaions”巧鸭,進(jìn)行格式化麻捻。
以上操作請參考ug1144-petalinux-tools-reference-guide贸毕,configuring SD Card ext filesystem Boot
以上操作都是在Ubuntu中進(jìn)行明棍,也可以在Windows下對SD卡進(jìn)行分區(qū)摊腋,具體步驟見在Windows下對ZedBoard SD卡進(jìn)行分區(qū)。
二视粮、新建Vivado工程并生成Bit文件
- 打開Vivado2017.1蕾殴,Create Project,RTL Project娃殖,Board:ZedBoard Zynq Evaluation and Development Kit炉爆,F(xiàn)inish
- 左側(cè)Project Manager -> IP Integrator -> Create Block Design , 在Diagram視圖中Add Ip -> ZYNQ7 Processing System芬首,并點(diǎn)擊上方的Run Block Automation逼裆,Vivado會按照內(nèi)置的ZedBoard電路自動生成部分連接胜宇,包括DDR等,
-
我只生成最簡化的FPGA工程桐愉,所以打算去掉圖中標(biāo)紅的部分的配置,雙擊Zynq IP左痢,在彈出的窗口中依次去掉M AXI GP0 Interface俊性、Timer 0定页、FCLK_CLK0的勾就可以绽诚,
-
特別注意憔购,修改SD卡IO的Speed玫鸟,從默認(rèn)的fast->slow屎飘。并修改SDIO的Requested Frequency為25MHz(默認(rèn)是50MHz)。這樣可以適配更多種類的SD卡檐盟,以免部分品牌SD卡出現(xiàn)啟動失敗的情況葵萎,
-
此時Diagram如下圖羡忘,通過Create HDL Wrapper自動生成頂層文件磕昼,再點(diǎn)擊Generate BitStream票从,
- 等待幾分鐘峰鄙,在...\zed_helloworld\zed_helloworld.runs\impl_1路徑下生成bit文件先馆。
三煤墙、在SDK中編譯出fsbl.el
- 在上一步的Vivado工程中,F(xiàn)ile -> Export -> Export Hardware铣减,勾選include bitstream葫哗,確認(rèn)后會在vivado根目錄下生成zed_helloworld.sdk文件夾及Zed_HelloWorld_wrapper.hdf文件球涛,這就是bit對應(yīng)的硬件描述文件亿扁,用以配置fsbl从祝,
- File -> Launch SDK,在SDK中File -> New -> Application Project擎浴,在彈出的窗口中輸入Project Name為zedhello_fsb贮预,其它選項默認(rèn)萌狂,點(diǎn)擊Next茫藏,
- 在Templates中選擇Zynq FSBL,點(diǎn)擊Finish凉当,
- SDK會自動編譯出zedhello_fsbl.elf看杭,默認(rèn)在zed_helloworld.sdk/zedhello_fsbl/Debug路徑下楼雹。
四贮缅、在虛擬機(jī)中編譯出u-boot.elf介却,并在SDK中生成BOOT.BIN
- 從GitHub上下載Xilinx發(fā)布的u-boot源碼齿坷,網(wǎng)址為https://github.com/Xilinx/u-boot-xlnx永淌,建議直接從releases中下載遂蛀,xilinx一般一季度更新一次,此處選擇當(dāng)前交叉編譯工具(arm-xilinx-linux-gnueabi-)支持的較新的u-boot-xlnx-xilinx-v2016.4.tar版本饺蚊,
- 在虛擬機(jī)中通過tar -xvf u-boot-xlnx-xilinx-v2016.4.tar解壓污呼,
- 進(jìn)入u-boot燕酷,打開include/configs/zynq-common.h苗缩,將sdboot的參數(shù)修改如下:
"sdboot=if mmcinfo; then " \
"run uenvboot; " \
"echo Copying Linux from SD to RAM... && " \
"load mmc 0 ${kernel_load_address} ${kernel_image} && " \
"load mmc 0 ${devicetree_load_address} ${devicetree_image} && " \
"bootm ${kernel_load_address} - ${devicetree_load_address}; " \
"fi\0" \
- 設(shè)置交叉編譯工具鏈為arm-xilinx-linux-gnueabi-酱讶,在終端中泻肯,依次執(zhí)行如下兩條指令
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_zed_config
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
- 在根目錄下生成u-boot灶挟,即為鏡像毒租。通過mv u-boot u-boot.elf重命名為elf格式墅垮。
-
將前兩步生成的zedhello_fsbl.elf噩斟、Zed_HelloWorld_wrapper.bit剃允、u-boot.elf放到同一個路徑下斥废,在SDK中Xilinx Tools -> Create Boot Image
- 如上圖配置牡肉,一次Add三個文件,其中zedhello_fsbl.elf為bootloader毛俏,另兩個為datafile煌寇,點(diǎn)擊Create Image阀溶,在同一路徑下生成BOOT.BIN银锻。
五击纬、編譯xilinx-linux源碼掉弛,生成uImage
- 從GitHub上下載Xilinx發(fā)布的linux源碼,網(wǎng)址為https://github.com/Xilinx/linux-xlnx殃饿,從releases中下載谋作,xilinx一般一季度更新一次,此處選擇當(dāng)前交叉編譯工具(arm-xilinx-linux-gnueabi-)支持的較新的xilinx-v2016.4.tar.gz版本乎芳,
- 在虛擬機(jī)中通過tar -xvzf u-boot-xlnx-xilinx-v2016.4.tar解壓遵蚜,
- 打開終端,進(jìn)入解壓出的目錄奈惑,依次執(zhí)行如下兩條指令吭净,
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- xilinx_zynq_defconfig
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000
- 等待時間較長,生成的uImage在arch/arm/boot目錄下寂殉。
六、生成devicetree.dtb
設(shè)備樹devicetree是內(nèi)核啟動必須的原在,u-boot在跳到內(nèi)核入口前會把這一塊數(shù)據(jù)復(fù)制到DDR的已知地址友扰。
- 使用gedit打開arch/arm/boot/dts/zynq-zed.dts文件,
- 將第15行#include "zynq-7000.dtsi"修改為 /include/ "zynq-7000.dtsi"
- 在第34行添加bootargs參數(shù)
bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0"; - 使用dtc工具將dts編譯生成devicetree.dtb文件
./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb ./arch/arm/boot/dts/zynq-zed.dts - 將前幾步生成的Boot.bin,uImage庶柿,devicetree.dtb拷貝到SD卡Fat32分區(qū)中
七村怪、將Linaro根文件系統(tǒng)拷貝到SD卡ext4分區(qū)
- 從Linaro官網(wǎng)http://release.linaro.org下載ubuntu版本,我選擇的是archive->12.11-> ubuntu -> precise-images -> ubuntu-desktop -> linaro-precise-ubuntu-desktop-20121124-560.tar.gz浮庐,
- 將SD卡連接上虛擬機(jī)甚负,識別出ext4分區(qū)梭域,其地址為/media/username/rootfs病涨,
- 通過以下命令没宾,將linaro系統(tǒng)直接解壓進(jìn)SD卡的ext4分區(qū)循衰,因為Linaro系統(tǒng)較大褐澎,這一步一定使用高速讀卡器和較好的SD卡工三,否則等待時間會非常非常長俭正,而且容易出問題掸读。
sudo tar --strip-components=3 -C /media/username/rootfs -xzpf linaro-o-ubuntu-desktop-tar-20111219-0.tar.gz binary/boot/filesystem.dir
八儿惫、通過SD卡啟動ZedBoard
-
將ZedBoard啟動選擇處跳帽設(shè)置如下圖,配置為SD卡啟動留搔,并在卡槽中插入SD卡铛铁,
- 連接串口線避归,在電腦上打開Putty,設(shè)置對應(yīng)串口哺窄,Speed為115200萌业,Open生年,
-
ZedBoard供電抱婉,Zynq會自動從SD卡讀取各系統(tǒng)鏡像蒸绩,可通過Putty觀察其啟動順序患亿,最終啟動后文件系統(tǒng)如下圖所示
遇到的問題
-
更換USB3.0讀卡器后步藕,ubuntu提示設(shè)備“Prolific USB SD Card Reader”無法連接到理想的主機(jī)控制器咙冗。
解決辦法:關(guān)閉ubuntu沾歪,在虛擬機(jī)設(shè)置 -> USB控制器 -> USB兼容性 中選擇 USB3.0,重啟虛擬機(jī)瞬逊,問題解決。
u-boot編譯報錯确镊,In file included from tools/aisimage.c:10:0: include/image.h:949:27:fatal error: openssl/evp.h: No such file or directory # include <openssl/evp.h>
原因:缺庫文件
解決辦法:sudo apt-get install libssl-devdts編譯報錯,Error: ./arch/arm/boot/dts/zynq-zed.dts:15.1-9 syntax error FATAL ERROR: Unable to parse input tree
原因:第15行語法錯誤
解決辦法:將第15行#include "zynq-7000.dtsi"修改為 /include/ "zynq-7000.dtsi"-
Boot.bin不啟動范删,不知道死在了哪一步
思路:fsbl是第一個啟動的個性文件,默認(rèn)fsbl是關(guān)閉了調(diào)試信息的到旦,應(yīng)該打開FSBL調(diào)試信息旨巷,再觀察具體在哪里出的錯
解決辦法:在SDK,fsbl工程的Properties添忘,C/C++ Build -> Settings -> ARM v7 gcc compiler -> Symbols,添加“FSBL_DEBUG_INFO”搁骑,如下圖所示。
重新編譯fsbl仰冠,并生成boot.bin文件,copy到SD卡FAT32分區(qū)昼捍,上電舷礼,putty打印如下信息,可以明確定位到FSBL啟動過程中的問題了郊闯。
更多的Zynq fsbl階段調(diào)試方法,可以參考https://www.cnblogs.com/otod3r/p/5275732.html蛛株,內(nèi)含安富利工程師的郵件摘抄团赁。 -
FSBL啟動報錯,SD:Unable to open file BOOT.BIN:1谨履,SD_INIT_FAIL欢摄,F(xiàn)SBL Status = 0xA009
原因:FSBL的SD驅(qū)動存在問題,對SD卡品質(zhì)比較挑剔
解決辦法:修改SD卡IO的Speed笋粟,從默認(rèn)的fast->slow怀挠。并修改SDIO的Requested Frequency為25MHz(默認(rèn)是50MHz)。這樣可以適配更多種類的SD卡害捕,以免部分品牌SD卡出現(xiàn)啟動失敗的情況绿淋。
內(nèi)核啟動失敗,出現(xiàn)Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(179,2)
思路:a尝盼、觀察得知吞滞,uboot和linux能夠啟動,說明fat32分區(qū)OK盾沫,rootfs位于ext4分區(qū)裁赠,這里有問題。 b赴精、通過QSPI啟動ZedBoard并掛載ramdisk文件系統(tǒng)佩捞,直接使用zedboard_oob_design的鏡像就可以。然后通過mount -t ext4 /dev/mmcblk0p2 /mnt來手動mount此分區(qū)蕾哟。結(jié)果打印如下信息:
[ 421.640000] EXT4-fs (mmcblk0p2): INFO: recovery required on readonly filesystem
[ 421.650000] EXT4-fs (mmcblk0p2): write access unavailable, cannot proceed
mount: mounting /dev/mmcblk0p2 on /mnt failed: Invalid argument
觀察這個打印信息一忱,發(fā)現(xiàn)是readonly filesystem,懷疑SD卡處于只讀狀態(tài)莲蜘。因為FAT32分區(qū)的鏡像只需要讀取就OK,所以不影響系統(tǒng)初始階段的啟動掀潮,但是到了rootfs菇夸,需要讀寫交換數(shù)據(jù),系統(tǒng)啟動就失敗了仪吧。
解決辦法:把SD卡只讀撥片往上撥動庄新,讓SD卡處于可讀可寫狀態(tài),如下圖所示
- Linaor啟動后薯鼠,提示EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts:(null) Kernel panic - not syncing: No working init found.
分析:用了不合適的方式择诈,將rootfs文件系統(tǒng)放到了SD卡的ext4分區(qū),會提示此問題
解決辦法:a出皇、使用本文的解壓命令爪模,可以避免此問題
sudo tar --strip-components=3 -C /media/username/rootfs -xzpf linaro-o-ubuntu-desktop-tar-20111219-0.tar.gz binary/boot/filesystem.dir
b、使用xilinx官方ug1144-petalinux-tools-reference-guide推薦的方法荒椭,將rootfs.tar拷貝到SD卡中再解壓