Zynq器件將arm和FPGA結(jié)合,利用了兩者各自的優(yōu)勢,arm可以實現(xiàn)靈活的控制,而FPGA部分可以實現(xiàn)算法加速,這大大擴展了zynq的應(yīng)用。比如深度學習加速,圖像處理等等。PL側(cè)表示FPGA的邏輯部分,PS側(cè)為arm端以及一些AXI接口控制部分,二者實際上通過AXI接口實現(xiàn)通信和互聯(lián)。PS可以通過AXI來對PL邏輯部分進行配置和控制,PL側(cè)通過AXI和PS進行數(shù)據(jù)交互。本章基于zynq7020器件來搭建Linux系統(tǒng),描述搭建Linux系統(tǒng)過程中PL側(cè)的配置以及對u-boot,kenel,桌面系統(tǒng)的配置和編輯。
1
vivado工程創(chuàng)建
本文使用的是黑金的zynq7020開發(fā)板。搭建一個最基本的linux系統(tǒng)需要以下基本配置:
1)arm核的添加和配置。
打開vivado,新建工程。然后創(chuàng)建block,添加zynq processing system。圖中iic是后邊在開發(fā)IIC驅(qū)動時添加的,最基本的linux系統(tǒng)可以不適用IIC。
圖1.1 添加zynq系統(tǒng)
2) bankIO電壓設(shè)置。
根據(jù)原理圖設(shè)置bank IO的電壓。如圖1.2所示。SD卡配置。
Linux系統(tǒng)安裝在SD卡中,所以需要完成SD卡配置,根據(jù)原理圖選擇SD卡的使用引腳。
圖1.2 IO電壓和SD卡配置
3) UART口配置。
需要用到串口進行調(diào)試,所以配置串口MIO引腳。
圖1.3 串口引腳配置
4) DDR配置。
內(nèi)存是必須的。這里面已經(jīng)有內(nèi)存型號供你選擇,不需要在對DDR參數(shù)做配置,只選擇MT41J256M16RE-125就行了。
圖1.4 DDR配置
這樣就完成了一個Linux系統(tǒng)啟動需要的最基本配置。接下來對工程進行綜合和實現(xiàn),生成bit,并在file菜單項中選擇export/export hardware,選擇include bitstream,點積OK就生成了linux系統(tǒng)需要的硬件工程。
接下來還需要生成啟動u-boot的fsbl。這里簡單說一下linux系統(tǒng)啟動的基本過程:
FSBL(完成IO電壓,SD卡,UART等硬件的檢測和基本配置,然后啟動u-boot。)->U-boot(這個主要完成arm硬件的一些更進一步檢測和配置,然后去啟動kernel)->kernel(這個是linux系統(tǒng)需要的所有驅(qū)動)->文件系統(tǒng)。
我們launch SDK,打開SDK生成fsbl和需要的設(shè)備樹。
New->application project->zynq FSBL,然后進行編譯,就生成了fsbl.elf文件。如果我們也已經(jīng)生成了u-boot文件,就可以用SDK來制作boot.bin。我們可以選擇fsbl的工程,右鍵create boot image,然后選擇u-boot的路徑,partition type選擇dtafile。然后create image就會生成boot.bin了。我們在fsbl工程目錄中的bootimage文件夾下看到boot.bin。
圖1.5 選擇u-boot路徑
生成devicetree需要zynq的基本divecetree文件,可以在git上下載:https://github.com/Xilinx/device-tree-xlnx。下載的設(shè)備樹文件添加到SDK中的repositories中:
圖1.6 添加設(shè)備樹文件來生成設(shè)備樹
然后new->board support package project->device_tree,這樣就生成了設(shè)備樹源文件。源文件有以下幾個:
Zynq-7000.dtsi,這個是zynq-7000的默認硬件配置,通常不需要修改。
pcw.dtsi,這個文件是針對自己的硬件平臺進行進一步配置的。比如在zynq-7000中sdhci都是不使能的,在pcw.dtsi中就需要進行使能,并配置sdhci0的statue為okay。
System-top.dtsi,其配置一些別名,并配置chosen,這個主要是選擇在啟動硬件的時候如何和操作系統(tǒng)進行通信,比如stdout-path選擇boot輸出介質(zhì),一般都是串口輸出。
用這三個文件就可以了。
圖1.7 設(shè)備樹源文件生成
以上就完成了linux系統(tǒng)啟動的硬件工程搭建,設(shè)備樹產(chǎn)生,以及fsbl產(chǎn)生。
2
u-boot編譯
下載u-boot源碼:https://github.com/Xilinx/u-boot-xlnx。
主要配置u-boot中的./configs/*_defconfig文件,這個主要是對arm端硬件進行配置。這里我們就使用zynq_zc702_defconfig,當然這里可以修改默認設(shè)備樹文件和board_name. 比如將defconfig文件命名為board_name_defconfig,相應(yīng)有文件./include/configs/board_name.h來描述板卡信息。
然后在./include/configs中復(fù)制一份zynq_zc70x.h為你想要的板級名稱。這個時候我們需要修改zynq_common.h中的配置。由于我們的文件系統(tǒng)在SD卡的第二分區(qū),所以需要修改宏定義:CONFIG_EXTRA_ENV_SETTINGS,去除了ramdisk的啟動。
然后建立uEnv.txt,在其中設(shè)置環(huán)境變量。如圖2.3所示。指定了文件系統(tǒng)所在位置為SD卡分區(qū)2。文件系統(tǒng)格式為ext3。
圖2.1 defconfig文件,紅框可以修改成為你的板卡的名字和設(shè)備樹名字
?
圖2.2 sdboot變量修改前和修改后
圖2.3 uEnv.txt中設(shè)置
接下來就是編譯u-boot了。需要用到交叉編譯工具arm-xilinx-linux-gnueabi。目前的vivado工具中已經(jīng)沒有這個交叉編譯工具了,可以到網(wǎng)上下載這個工具鏈。然后export PATH=$PATH: dir/bin。可以在Makefile中設(shè)置默認的編譯工具:
圖2.4 Makefile中設(shè)置編譯工具
然后make board_name_defconfig進行配置,最后make就可以編譯出u-boot了。根目錄下的u-boot.elf正是我們需要的文件,用于合成boot.bin。在1節(jié)中已經(jīng)介紹了。
3
編譯kernel
Kernel可以到git上下載,kernel包含所有的驅(qū)動,如果進行驅(qū)動修改的話,可以在其中進行配置。比如篩選某些驅(qū)動。通常開發(fā)新的驅(qū)動,并不需要在其中進行修改。因為驅(qū)動可以通過命令行在系統(tǒng)啟動后動態(tài)加載。所以只僅僅對驅(qū)動編譯就行了,在Makefile中添加編譯工具,這個核u-boot一樣。然后make uImage LOADADDR=0x00008000就可以了。編譯完成后再arch/arm/boot中產(chǎn)生uImage,這個是我們要用到的內(nèi)核文件。
設(shè)備樹文件的編譯也很簡單,就是通過設(shè)備樹編譯工具dtc將dtsi文件編為dtc文件就行了,這里注意dtc文件名稱要和在u-boot中zynq-common.h中的設(shè)備樹文件名稱一樣。通常都為devicetree。編譯命令為:
dtc –I dtx –O dtb –o devicetree.dtb your.dts
文件系統(tǒng)可以使用linaro Ubuntu文件系統(tǒng),從網(wǎng)上下載,解壓。這個時候需要對SD卡進行分區(qū),1區(qū)為fat格式,有200M就夠了,存放boot.bin,uImage,devicetree.dtb,uEnv.txt文件。第二區(qū)用ext3格式,存放linaro Ubuntu文件系統(tǒng)。
4
linux系統(tǒng)啟動過程
圖4.1 fsbl啟動
圖4.2 fsbl完成
圖4.3 u-boot啟動:讀取env,uImage和設(shè)備樹
圖4.4 啟動kernel
圖4.5 文件系統(tǒng)的啟動
總結(jié)
本篇在zynq7000的基礎(chǔ)上,制作一個最基本的linux系統(tǒng)。整個流程包括工程創(chuàng)建,fsbl和設(shè)備樹生成,u-boot的配置和編譯,kernel編譯以及文件系統(tǒng)制作。
編輯:黃飛
?
評論
查看更多