做點東西不容易,我這種有強迫癥的人也在這個環(huán)節(jié)屈服了。開發(fā)環(huán)境這兩年真是換了又換,被搞的精疲力盡。Xilinx的開發(fā)環(huán)境我還是推薦Linux(這里默認(rèn)都是64bit系統(tǒng)),Windows的綜合和P&R的效率要比Linux低三分之一,這個不能忍,再就是petalinux的交叉編譯用啥呢,cygwin?Linux發(fā)行版里面我用的是CentOS,Vivado推薦測試的那幾個我試過CentOS和Ubuntu。先說Ubuntu,不好用,問題比較多。CentOS最好的版本是6.5,但是6.5已經(jīng)在官網(wǎng)不支持了,替代的是6.6和7。先說7,Vivado的開發(fā)環(huán)境沒有問題,但是petalinux的環(huán)境始終有問題,具體在這里,Unable to determine a suitable packaging system type。那最后就剩下6.6了,6.6也有一個小問題,是eclipse的一個bug,eclipse cairo bug。網(wǎng)上你能找到的方法是在eclipse的配置文件加上一句disable cairo的話,但是這個在Xilinx的工具鏈中不管用,我試了好多Xilinx的eclipse的config文件,都不行。別的解決的方法下面我會說。好,現(xiàn)在正是搭建環(huán)境:
開發(fā)平臺環(huán)境搭建
上邊說了,我們用CentOS 6.6 64bit。裝的時候有個地方讓你選平臺的用處,你就選最后一個,software development。裝別的也行,注意把一些開發(fā)環(huán)境和庫的選項都選上。裝好系統(tǒng)后可能會提示你更新,內(nèi)核也被更新了,你就更新吧。然后我們裝幾個庫1。
yum install dos2unix iproute gawk gcc git gnutls-devel net-tools ncurses-devel sftp-server zlib-devel flex bison libstdc++.i686 libgcc.i686 libgomp.i686 ncurses-libs.i686 zlib.i686 libselinux libselinux.i686
前邊幾個都是文檔里面說的庫,有些也用不到,比如tftp那個,你不用tftp調(diào)試就不用。后邊也要裝上,要不然petalinux編譯的時候還是會有問題。然后我們再裝兩個庫,解決上邊說的那個eclipse的bug。去rpmfind.net下載下面的兩個庫:
cairo-1.10.2-3.el6.x86_64.rpm
cairo-devel-1.10.2-3.el6.x86_64.rpm
然后裝上,
yum localinstall cairo*.rpm
Vivado工具鏈安裝
這個簡單,下載下來裝上就行,記得勾上 Install Cable Drivers。這里我用的都是2014.4的版本,下邊的Petalinux也是對應(yīng)的。記得source setting文件。
Petalinux開發(fā)環(huán)境
這個開發(fā)環(huán)境我們可以參考Xilinx Wiki上說的那些方法,也可以直接用他們準(zhǔn)備好的Petalinux SDK工具鏈。這里我們選擇后者。安裝也簡單,去官網(wǎng)下載下來然后裝上就好。BSP你可以下載下來裝上玩玩,我們這里不用下這個,我們自己建一個就好。大家可以參看Xilinx的官方文檔,ug1144,里面有詳細(xì)的說明。我們也只是按照說明走一遍,然后給出一個例子,讓大家快速上手。
一個例子
這里給大家展示一個例子,跟Zynq CTT ug873里面的差不多,但是這里我們用了Vivado,并且結(jié)合了Petalinux SDK的開發(fā)流程。不過我建議大家多看help,這里還有一個Petalinux的command reference供大家參考。我們開始:
建立一個petalinux的project
petalinux-create -t project --name poll
cd poll
在當(dāng)前目錄就會建立一個poll的文件夾,這就是我們的工作目錄,后邊的所有操作如果不特別指出,都是在這個工作目錄的根目錄進行的。里面還缺hardware platform,driver,還有我們的application。我們一一補上。
創(chuàng)建一個hardware platform
這里我給大家準(zhǔn)備了一個TCL文件,下載(戳這里下載),然后放到project的根目錄。這里注意,我都是在Vivado 2014.4和ZC706環(huán)境下做的,要是你的環(huán)境不同,要做出適當(dāng)?shù)男薷模遄硬煌膭?chuàng)建工程的那兩句話。Vivado版本不同改所有IP的版本,或者你自己建一個也行,這個系統(tǒng)就是一個PS然后一個MicroBlaze,然后還有個BRAM。后邊還得給MB寫個程序。這里有個系統(tǒng)圖你可以參考下,注意保證BRAM的起始地址是0x40000000,MB和ARM都得一樣才行。?
?
最后運行:
vivado -mode gui -source ./system.tcl
然后Vivado就是啟動,等右上角的那個進度條走完,bitstream文件就會生成好了。機器不同,時間可能不同,我的機器大約5分鐘。
生成系統(tǒng)的時候看著特別爽吧,哈哈,duang duang的生成完了。Vivado比ISE增加了tcl,在自動化的時候還是很爽的,不用像原來ISE分析那個系統(tǒng)描述文件來自動生成系統(tǒng)。其實下邊的SDK的過程也可以全程自動化,但是有點麻煩,需要修改SDK的xml文件然后調(diào)用xsdk去build就行。這里就不說了,爽到底就沒意思了。
然后我們就可以File->Export->Export Hardware,記得勾上Include bitstream。然后File->Launch SDK,我們就進入到下一步了。
給MicroBlaze寫個程序
MB的這個程序主要的功能就是不斷的把BRAM中一個地址的數(shù)值傳到另一個地址,后邊在ARM運行的Linux會把這個BRAM當(dāng)做一個外設(shè),然后要對其寫個driver。不要MB也行,有個好玩嘛,異構(gòu)系統(tǒng),heterogeneous,多高大上。。。哈哈。給MB建一個空的Application Project,名字叫poll吧,然后添加一個main.c的文件到工程中,main.c里面復(fù)制上這些代碼:
/*
* main.c
*/
#define BRAM_ADDRESS 0x40000000
int main(void) {
volatile int *bram = (int *)BRAM_ADDRESS;
while (1)
bram[1] = bram[0];
}
然后保存下,SDK就編譯好啦。下面要做的事情就是把編譯生成的ELF文件和系統(tǒng)生成的bitstream文件組合在一起。這樣bit文件下載到板子里面,這個程序就可以直接運行了。這里有個簡單的方法,選Xilinx Tools->Program FPGA。把下面的ELF File to Initialize in Block BRAM 選擇成我們生成好的poll.elf,下拉下就找到了,一般在Debug下邊(大就忍了吧)。然后點那個Program,然后出來下一個對話框后,點Cancel。這樣,我們就騙SDK把我們要的那個download.bit文件生成出來了,然后我們不用這個下載。你們注意下邊的Console選項卡,會有剛才這個合成調(diào)用的命令updatemem,原來是data2mem,不過模糊有印象哪里說過前者會更好一些。
配置一下Petalinux
剛才創(chuàng)建的Petalinux project是沒有硬件的描述信息的,這會我們就把我們生成的硬件描述信息配置到Petalinux里面去。很簡單,運行這個:
petalinux-config --get-hw-description=./hardware/hardware.sdk/system_wrapper_hw_platform_0
然后會出來個配置界面,我們直接選Exit,然后保存配置就可以了。系統(tǒng)會被自動配置好。詳細(xì)的說明看上邊說的那個reference guide。
創(chuàng)建Linux Kernel Module
接下來我們需要對剛才創(chuàng)建的那個PL上要program的硬件系統(tǒng)寫一個驅(qū)動,主要就是對那個BRAM的兩個location進行的訪問。先創(chuàng)建一個module的工程吧:
petalinux-create -t modules --name poll_driver --enable --force
創(chuàng)建好的module的模板會在components->modules->poll_driver。這里已經(jīng)有一個poll_driver.c,然后還要建一個poll_driver.h文件。下載這個zip文件,里面有這兩個dirver文件和下一步要用的app文件。(戳這里下載)。都是參考CTT寫得啦,他們也參考了另一個網(wǎng)站,上邊給了比較簡明的教程,寫了個char的device driver。
創(chuàng)建Linux Application
這一步我們就創(chuàng)建個在petalinux上運行的程序,然后會調(diào)用剛才的那個driver。還是先建個app的工程:
petalinux-create -t apps --name poll_app --enable --force
app的模板會在components->apps->poll_app。把上一步那個壓縮包里面的poll_app.c替換到這個生成的app目錄里面。好啦,到目前為止所有的軟硬件的創(chuàng)建工作就完成了,下面就得編譯fsbl,device_tree, uboot,kernel,module和app了。我也不會分開弄了,Xilinx Wiki上的是分開弄的,好復(fù)雜的說。
編譯生成所有image文件
上邊說了那么復(fù)雜,Petalinux SDK里面好簡單的。
petalinux-build
可能需要點時間,等一會,哈哈!再修改編譯就快了。
生成image文件會在./image/linux里面,modules和apps會在./build/linux/rootfs/modules和./build/linux/rootfs/apps里面。但其實./image/linux下面的rootfs (或者kernel image,我不確定)里面已經(jīng)有我們編譯好的modules和apps了。
生成boot文件
這一步得生成啟動需要用得boot文件:
petalinux-package --boot --fsbl ./image/linux/zynq_fsbl.elf --u-boot --force
生成pre-built文件夾
這一步主要是方便后面的boot的,其實上一步已經(jīng)生成了我們可以boot zynq的所有文件了,但是養(yǎng)成好習(xí)慣,我們生成一個pre-built文件夾,把image和bitstream文件都包含進來。
petalinux-package --prebuilt --fpga ./hardware/hardware.sdk/system_wrapper_hw_platform_0/download.bit --force
好了之后可以看到工程根目錄下生成了一個pre-built,然后./pre-built/linux/images和./pre-built/linux/implementation下分別是軟件和硬件的文件。
啟動zynq board
好啦,終于倒數(shù)第二步了,所有的文件都已經(jīng)生成完了,啟動zynq有好多種方法,因為我們有bitstream文件,所以介紹兩種可以下載bitstream文件的方法,也是兩種啟動linux kernel的方法。就是SD和JTAG,還有些別的方法,參看文檔。我就不用了,無論哪種方法先把板子上的SW4配置成 off和on。其實SD卡啟動不用,但是方便就都配置成這樣就行了。在這之前還得裝一個看UART的小工具,用minicom就挺好。
yum install minicom
第一次運行su模式minicom -s,配置一下Serial port setup,Serial Device改成/dev/ttyUSB0(我的是0,你的不一定)。然后115200 8N1。Hardware Flow Control設(shè)置成No就可以輸入字符到zynq上啦,我會亂說。
第一種SD卡引導(dǎo)啦(加粗顯得正式一些。。)
先格式化一張SD卡成FAT格式,然后把這三個文件都考到SD卡上的第一個分區(qū)。
./pre-built/linux/images/image.ub
./pre-built/linux/images/BOOT.BIN
./pre-built/linux/implementation/download.bit
然后配置一下板子上的SW11成00110,0就是開關(guān)掰到下邊,1就是上邊。這樣板子就進入了SD卡啟動的模式。把SD卡插進去,重啟電源就行啦!然后啟動minicom,用戶名和密碼都輸入root就進入系統(tǒng)啦!
第二種方法JTAG
調(diào)試的時候用JTAG了,不用一遍一遍的插拔SD卡了,多方便。發(fā)行的時候用SD卡模式了。同樣,SW11先配置成00000。然后重啟下zynq的電源,清空原來運行的系統(tǒng),要不然會有錯誤哦,你又知道了。。然后我們執(zhí)行:
petalinux-boot --jtag --prebuilt 3
稍等片刻,download.bit會先被下載到板子里面,然后kernel會被加載。然后輸入用戶名密碼,系統(tǒng)又進去了。迭代開發(fā)的時候要記得生成pre-built啊,還得重啟zynq電源啊。
Finally!!下載PL,加載module,運行我們的程序了
終于最后一步了,肚子好餓。如果上一步你用的JTAG啟動,就不用再下載bitstream了,如果SD卡啟動,我們先把bitstream下載到板子里面。進入到Petalinux的系統(tǒng)之后,運行這個,很神奇的。
mount /dev/mmcblk0p1 /mnt
cat /mnt/download.bit > /dev/xdevcfg
下載完啦。。用得是zynq上得PCAP啊。
接下就是加載我們的module:
insmod /lib/modules/`uname -r`/extra/poll_driver.ko
一般會輸出printk里面的東西了,如果沒有就運行:
dmesg
或者
cat /var/log/dmesg
最后就可以看到kernel的輸出了。這里要看的是中間有那么一句話,我們需要知道m(xù)odule加載被分配的major device number。我這里是245,還要再創(chuàng)建一個設(shè)備節(jié)點,后邊的app會用到。
mknod /dev/poll_dev c 245 0
然后/dev/poll_dev就被創(chuàng)建出來了。
最后的最后了。。運行我們創(chuàng)建的程序:
很簡單,很簡單。。
/bin/poll_app
整個流程終于結(jié)束了。。。
后記
萬里長征第一步而已,入個門。還有很多的問題,比如debug,大家多多交流。
最后,推薦一本書Embedded Linux Primer: A Practical Real-World Approach,作者:Christopher Hallinan。 資深工程師寫得書,通俗易懂,入門必選。
Petalinux Tools Documentation Reference Guilde:UG1144的page 9-10推薦的庫。
評論
查看更多