通過SD卡啟動ZedBoard并運(yùn)行Linaro根文件系統(tǒng)

新近入手了一塊國產(chǎn)化ZedBoard贱勃,全兼容Digilent ZedBoard,物美價廉贵扰。通過幾天時間摸索戚绕,u-boot,linux耘子,linaro都從官網(wǎng)下載了源碼并編譯生成鏡像球切,并通過SD卡啟動成功吨凑,通過本文記錄如下怀骤。主要講操作,涉及些許原理,遇到過的問題也對現(xiàn)象焚鹊、思路末患、解決辦法做了記錄,在這里分享給大家嚷炉。更多的ZedBoard Demo教程申屹,可以訪問我的個人網(wǎng)站www.qingchengyouran.com獲取隧膏。

概述

zynq啟動流程

Zynq芯片啟動流程如上圖所示胞枕,可以看出想要將ZedBoard從SD卡啟動,需要完成以下準(zhǔn)備工作:

  1. 將SD卡分為fat32和ext4兩個分區(qū)队询,fat32分區(qū)保存Linux的內(nèi)核映像构诚,ext4分區(qū)保存Linux文件系統(tǒng)唤反,
  2. 通過Vivado生成Bit文件,
  3. 導(dǎo)出硬件配置肠缨,在SDK中生成fsbl文件盏阶,
  4. 編譯u-boot源碼生成u-boot.elf名斟,將.bit、fsbl.elf闷袒、u-boot.elf合成為BOOT.BIN文件并拷貝到fat32分區(qū)囊骤,
  5. 編譯xilinx-linux源碼生成uImage冀值,拷貝到fat32分區(qū)
  6. 在xilinx-linux源碼中修改dts文件列疗,并用dtc工具生成devicetree.dtb,拷貝到fat32分區(qū)
  7. 將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误续。

  1. sudo apt-get install GParted 蹋嵌,安裝 gparted分區(qū)工具,
  2. 插入SD卡躏仇,在VMWare中點(diǎn)擊“虛擬機(jī) -> 可移動設(shè)備 -> Prolific USB SD Card Reader -> 連接 ”焰手,讓ubuntu識別到SD卡怀喉,
  3. sudo gparted躬拢,運(yùn)行GParted,
  4. 工具欄選擇/dev/sdb,先umount已有分區(qū)馅袁,再Delete掉汗销,為格式化做準(zhǔn)備抵窒,
  5. 新建分區(qū)李皇,第一個分區(qū)至少60MB宙枷,格式化為fat32文件系統(tǒng)慰丛,F(xiàn)ree space preceding需要設(shè)置為4MB诅病,Label為BOOT粥烁,


  6. 新建分區(qū)讨阻,第二個分區(qū)用完剩余空間变勇,格式化為ext4文件系統(tǒng),Label為rootfs飞袋。
  7. 在工具欄點(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文件

  1. 打開Vivado2017.1蕾殴,Create Project,RTL Project娃殖,Board:ZedBoard Zynq Evaluation and Development Kit炉爆,F(xiàn)inish
  2. 左側(cè)Project Manager -> IP Integrator -> Create Block Design , 在Diagram視圖中Add Ip -> ZYNQ7 Processing System芬首,并點(diǎn)擊上方的Run Block Automation逼裆,Vivado會按照內(nèi)置的ZedBoard電路自動生成部分連接胜宇,包括DDR等,
  3. 我只生成最簡化的FPGA工程桐愉,所以打算去掉圖中標(biāo)紅的部分的配置,雙擊Zynq IP左痢,在彈出的窗口中依次去掉M AXI GP0 Interface俊性、Timer 0定页、FCLK_CLK0的勾就可以绽诚,


  4. 特別注意憔购,修改SD卡IO的Speed玫鸟,從默認(rèn)的fast->slow屎飘。并修改SDIO的Requested Frequency為25MHz(默認(rèn)是50MHz)。這樣可以適配更多種類的SD卡檐盟,以免部分品牌SD卡出現(xiàn)啟動失敗的情況葵萎,


  5. 此時Diagram如下圖羡忘,通過Create HDL Wrapper自動生成頂層文件磕昼,再點(diǎn)擊Generate BitStream票从,


  6. 等待幾分鐘峰鄙,在...\zed_helloworld\zed_helloworld.runs\impl_1路徑下生成bit文件先馆。

三煤墙、在SDK中編譯出fsbl.el

  1. 在上一步的Vivado工程中,F(xiàn)ile -> Export -> Export Hardware铣减,勾選include bitstream葫哗,確認(rèn)后會在vivado根目錄下生成zed_helloworld.sdk文件夾及Zed_HelloWorld_wrapper.hdf文件球涛,這就是bit對應(yīng)的硬件描述文件亿扁,用以配置fsbl从祝,
  2. File -> Launch SDK,在SDK中File -> New -> Application Project擎浴,在彈出的窗口中輸入Project Name為zedhello_fsb贮预,其它選項默認(rèn)萌狂,點(diǎn)擊Next茫藏,
  3. 在Templates中選擇Zynq FSBL,點(diǎn)擊Finish凉当,
  4. SDK會自動編譯出zedhello_fsbl.elf看杭,默認(rèn)在zed_helloworld.sdk/zedhello_fsbl/Debug路徑下楼雹。

四贮缅、在虛擬機(jī)中編譯出u-boot.elf介却,并在SDK中生成BOOT.BIN

  1. 從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版本饺蚊,
  2. 在虛擬機(jī)中通過tar -xvf u-boot-xlnx-xilinx-v2016.4.tar解壓污呼,
  3. 進(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" \
  1. 設(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-
  1. 在根目錄下生成u-boot灶挟,即為鏡像毒租。通過mv u-boot u-boot.elf重命名為elf格式墅垮。
  2. 將前兩步生成的zedhello_fsbl.elf噩斟、Zed_HelloWorld_wrapper.bit剃允、u-boot.elf放到同一個路徑下斥废,在SDK中Xilinx Tools -> Create Boot Image


  3. 如上圖配置牡肉,一次Add三個文件,其中zedhello_fsbl.elf為bootloader毛俏,另兩個為datafile煌寇,點(diǎn)擊Create Image阀溶,在同一路徑下生成BOOT.BIN银锻。

五击纬、編譯xilinx-linux源碼掉弛,生成uImage

  1. 從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版本乎芳,
  2. 在虛擬機(jī)中通過tar -xvzf u-boot-xlnx-xilinx-v2016.4.tar解壓遵蚜,
  3. 打開終端,進(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
  1. 等待時間較長,生成的uImage在arch/arm/boot目錄下寂殉。

六、生成devicetree.dtb

設(shè)備樹devicetree是內(nèi)核啟動必須的原在,u-boot在跳到內(nèi)核入口前會把這一塊數(shù)據(jù)復(fù)制到DDR的已知地址友扰。

  1. 使用gedit打開arch/arm/boot/dts/zynq-zed.dts文件,
  2. 將第15行#include "zynq-7000.dtsi"修改為 /include/ "zynq-7000.dtsi"
  3. 在第34行添加bootargs參數(shù)
    bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0";
  4. 使用dtc工具將dts編譯生成devicetree.dtb文件
    ./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb ./arch/arm/boot/dts/zynq-zed.dts
  5. 將前幾步生成的Boot.bin,uImage庶柿,devicetree.dtb拷貝到SD卡Fat32分區(qū)中

七村怪、將Linaro根文件系統(tǒng)拷貝到SD卡ext4分區(qū)

  1. 從Linaro官網(wǎng)http://release.linaro.org下載ubuntu版本,我選擇的是archive->12.11-> ubuntu -> precise-images -> ubuntu-desktop -> linaro-precise-ubuntu-desktop-20121124-560.tar.gz浮庐,
  2. 將SD卡連接上虛擬機(jī)甚负,識別出ext4分區(qū)梭域,其地址為/media/username/rootfs病涨,
  3. 通過以下命令没宾,將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

  1. 將ZedBoard啟動選擇處跳帽設(shè)置如下圖,配置為SD卡啟動留搔,并在卡槽中插入SD卡铛铁,


  2. 連接串口線避归,在電腦上打開Putty,設(shè)置對應(yīng)串口哺窄,Speed為115200萌业,Open生年,
  3. ZedBoard供電抱婉,Zynq會自動從SD卡讀取各系統(tǒng)鏡像蒸绩,可通過Putty觀察其啟動順序患亿,最終啟動后文件系統(tǒng)如下圖所示


遇到的問題

  1. 更換USB3.0讀卡器后步藕,ubuntu提示設(shè)備“Prolific USB SD Card Reader”無法連接到理想的主機(jī)控制器咙冗。
    解決辦法:關(guān)閉ubuntu沾歪,在虛擬機(jī)設(shè)置 -> USB控制器 -> USB兼容性 中選擇 USB3.0,重啟虛擬機(jī)瞬逊,問題解決。


  2. 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-dev

  3. dts編譯報錯,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"

  4. 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)含安富利工程師的郵件摘抄团赁。

  5. 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)啟動失敗的情況绿淋。


  6. 內(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),如下圖所示


  1. 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卡中再解壓
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末出嘹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纱注,更是在濱河造成了極大的恐慌畏浆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞贱,死亡現(xiàn)場離奇詭異刻获,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瞎嬉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進(jìn)店門蝎毡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人氧枣,你說我怎么就攤上這事沐兵。” “怎么了便监?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵痒筒,是天一觀的道長。 經(jīng)常有香客問我茬贵,道長簿透,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任解藻,我火速辦了婚禮老充,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘螟左。我一直安慰自己啡浊,他們只是感情好觅够,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巷嚣,像睡著了一般喘先。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上廷粒,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天窘拯,我揣著相機(jī)與錄音,去河邊找鬼坝茎。 笑死涤姊,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嗤放。 我是一名探鬼主播思喊,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼次酌!你這毒婦竟也來了恨课?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤岳服,失蹤者是張志新(化名)和其女友劉穎庄呈,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體派阱,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年斜纪,在試婚紗的時候發(fā)現(xiàn)自己被綠了贫母。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盒刚,死狀恐怖腺劣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情因块,我是刑警寧澤橘原,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站涡上,受9級特大地震影響趾断,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吩愧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一芋酌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雁佳,春花似錦脐帝、人聲如沸同云。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炸站。三九已至,卻和暖如春疚顷,著一層夾襖步出監(jiān)牢的瞬間旱易,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工荡含, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留咒唆,地道東北人。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓释液,卻偏偏與公主長得像全释,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子误债,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容