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