5 R0 V4 h! I7 Q# r+ o
- 實(shí)驗(yàn)說明8 n$ O6 I% ~9 |( j& E0 ?% L
操作環(huán)境: - Windows 7/10 64bit
- Xilinx Vivado 2017.4
- Ubuntu 14.04
) Y( c* z/ U+ n) C4 B; {- J2 V
$ R3 O3 G& O# Y& V/ X3 i5 n& H7 n表 1 " K! Q, b% I; J
在運(yùn)行Linux系統(tǒng)下,對(duì)于Zynq PL端的開發(fā),可以通過動(dòng)態(tài)加載PL端程序、PL設(shè)備樹的方法對(duì)其進(jìn)行配置。PL端設(shè)備樹文件xxx.dtsi的生成,需要依賴于Vivado工程的xxx.hdf硬件描述文件和Xilinx設(shè)備樹源碼。 本文以光盤"All-Programmable-SoC-demos\tl-axi-gpio-led-demo"例程為例,演示生成、編譯PL端設(shè)備樹文件,以及動(dòng)態(tài)加載PL端程序和PL設(shè)備樹的方法。 - 生成PL端設(shè)備樹文件
- 導(dǎo)出Vivado工程硬件描述文件- N- z5 M' A' m5 K3 h. E& m/ d
參照《基于TcL腳本生成Vivado工程及編譯》文檔,生成Vivado工程并對(duì)其進(jìn)行編譯,后面將由Vivado工程編譯生成的xxx.bin文件進(jìn)行動(dòng)態(tài)加載。 點(diǎn)擊Vivado的菜單欄"File -> Export -> Export Hardware…",彈出對(duì)話框中點(diǎn)擊OK,導(dǎo)出tl-axi-gpio-led-demo例程的xxx.hdf硬件描述文件。
* [9 C# Z6 l& f & ?7 ]# a7 f! n2 k2 ?% @& V
導(dǎo)出完成后,將在"All-Programmable-SoC-demos\tl-axi-gpio-led-demo\"工程目錄下生成"\hw\src\runs\axi_gpio.sdk\axi_gpio_wrapper.hdf"文件,同時(shí)TcL控制臺(tái)打印如下信息。
& b) C) v0 B+ S3 X; R: s1 W; c) Y4 i$ j 點(diǎn)擊Vivado的菜單欄"File -> Launch SDK",使用Xilinx SDK加載xsdk工程。在彈出對(duì)話框中點(diǎn)擊OK,打開xsdk工程如下圖所示。 7 `+ q% S0 y3 t z0 N
$ Q- A6 d3 _7 T7 q" e( o 6 N6 _! t& ^6 \4 m% ?% g
- 導(dǎo)入device-tree-xlnx2 k! g% V, \: U5 n) t5 p
Xilinx設(shè)備樹源碼為“光盤\Linux-system\device-tree-xlnx\src\device-tree-xlnx-[Git 系列號(hào)]-[版本號(hào)].tar.gz”,其中Git系列號(hào)與版本號(hào)以實(shí)際的為準(zhǔn)。將其解壓到Windows非中文目錄,解壓后安裝包內(nèi)容如下圖所示。 PL端xxx.dtsi設(shè)備樹文件需要依賴于Xilinx設(shè)備樹源碼生成。 1 M" Y! }! f2 j( C3 ~; ~2 @! S
點(diǎn)擊Xilinx SDK菜單欄"Xilinx -> Reposistories"。 ( f0 w" J% u' W
在彈出的Xilinx SDK資源庫配置界面中,點(diǎn)擊"Repositories -> New…",彈出對(duì)話框中選中解壓到非中文路徑下的device-tree-xlnx源碼,點(diǎn)擊“確定”將其添加進(jìn)來。
+ o7 Z' `, X, B( B+ C4 i4 S 添加完device-tree-xlnx設(shè)備樹源碼如下圖所示,點(diǎn)擊OK完成。 9 T( d/ h9 _1 L) X
- 生成PL設(shè)備樹
8 c' W1 Q! E3 I4 @* I# c
點(diǎn)擊Xilinx SDK菜單欄"File -> New -> Board Support Package",新建Board Support Package。
1 Y) Z" m" {! j/ l9 @ 在彈出新建Board Support Package配置界面中,按照下圖默認(rèn)選項(xiàng)配置Project name(BSP包命名),Hardware Platform,CPU,同時(shí)在Board Support Package選項(xiàng)中勾選"device_tree",點(diǎn)擊Finish完成配置。
# N) q+ n( a' b* j& u% U 在彈出的界面,將dt_overlay的值修改成true,該選項(xiàng)將支持設(shè)備樹文件的動(dòng)態(tài)加載,如圖所示。 : ^, K9 d- W4 ~8 X
點(diǎn)擊OK,完成SoC工程"hw\src\runs\axi_gpio.sdk\device_tree_bsp_0\pl.dtsi"設(shè)備樹文件修改,如下圖所示。 , N4 Y$ b5 n5 h4 @$ S
- pl.dtsi文件是PL端使用的IP核對(duì)應(yīng)的設(shè)備樹,我司實(shí)際開發(fā)中僅用到此設(shè)備樹文件;
- zynq-7000.dtsi文件是Xilinx提供給所有Zynq-7000開發(fā)板使用(沒用到此文件);
- system.dts根據(jù)開發(fā)板上的具體實(shí)現(xiàn),修改設(shè)備樹使其可正常工作(沒用到此文件)。​​​​​​​) m' Y/ S+ I/ E$ g$ {& f0 ^) R
- 編譯設(shè)備樹
5 S' I* K' j/ y j P& S, J
在Ubuntu下新建"/home/tronlong/Zynq/Linux-system/device-tree-xlnx"工作目錄,將前面步驟生成的"hw\src\runs\axi_gpio.sdk\device_tree_bsp_0\pl.dtsi"設(shè)備樹文件拷貝到該目錄下,如下圖所示: Host#mkdir -p /home/tronlong/Zynq/Linux-system/device-tree-xlnx Host#cd/home/tronlong/Zynq/Linux-system/device-tree-xlnx Host#ls " {+ U M- p- }7 b Z, N
執(zhí)行Linux內(nèi)核編譯時(shí),會(huì)在Linux內(nèi)核源碼"scripts/dtc/"目錄下生成設(shè)備樹編譯器dtc工具。執(zhí)行如下指令,使用dtc工具編譯pl.dtsi設(shè)備樹源文件。 編譯完成后將在當(dāng)前目錄下生成dtbo文件,指令中dtc工具路徑以實(shí)際情況為準(zhǔn)。 Host#ls /home/tronlong/Zynq/Linux-system/kernel/scripts/dtc Host#/home/tronlong/Zynq/Linux-system/kernel/scripts/dtc/dtc -q - @ -O dtb -o pl.dtbo pl.dtsi
. k9 X3 X. c" S- Y5 o! S - 動(dòng)態(tài)加載PL程序和設(shè)備樹
, x r; F+ u: A4 `8 I5 ]" p! r
開發(fā)板上電啟動(dòng)進(jìn)入文件系統(tǒng),執(zhí)行如下指令新建"/lib/firmware"目錄。將編譯生成的dtbo文件,以及由Vivado工程編譯生成的xxx.bin文件復(fù)制到"/lib/firmware"目錄,并將xxx.bin文件重命名為system_wrapper.bin。 Target#mkdir -p /lib/firmware Target# mv /lib/firmware/axi_gpio_xc7z020.bin /lib/firmware/system_wrapper.bin 8 D# |* K; d) {& ~" N6 w' y- z
執(zhí)行以下指令在文件系統(tǒng)根目錄下新建configfs目錄及設(shè)備節(jié)點(diǎn),并從"/lib/firmware"目錄下動(dòng)態(tài)加載PL端程序和dtbo文件。 Target#mkdir /configfs/ t7 e. p4 X/ d# v1 `' n* B0 ~+ K
Target#mount -t configfs configfs /configfs* o! L% O" |( B$ A2 Y
Target#mkdir /configfs/device-tree/overlays/full
: o7 z4 A; A6 H" qTarget#echo -n "pl.dtbo" > /configfs/device-tree/overlays/full/path
, G" q* k' b( e; t+ }' Z% p& Y
2 F2 {; m* I) L% o6 R$ D' v+ J% L, i: I. k6 T; o. ]
若需要重新加載dtbo文件,執(zhí)行如下指令刪除full目錄,再重新創(chuàng)建,然后再動(dòng)態(tài)加載dtbo文件即可。. d( H Q$ D) C! N1 Y8 C
Target#rmdir /configfs/device-tree/overlays/full4 {# [" b+ u7 U2 P/ Z6 A# [
Target# mkdir /configfs/device-tree/overlays/full" _- d% r6 e# L1 w, i
Target# echo -n "pl.dtbo" > /configfs/device-tree/overlays/full/path! ]7 o4 `' v* U! {
1 e6 i; j0 F, U7 L9 ~, j" K! V; e6 T7 Q
- 動(dòng)態(tài)加載多個(gè)設(shè)備樹
7 e, O) x+ x9 I* q; g% q
若按照上面的步驟加載了一個(gè)設(shè)備樹,如果還想加載其他dtbo,可以在"/configfs/device-tree/overlays/"目錄下再任意新建一個(gè)文件夾,然后再加載設(shè)備樹: Target# mkdir /configfs/device-tree/overlays/pl_dtbo Target# echo -n “pl.dtbo” > /configfs/device-tree/overlays/pl_dtbo/path # J2 @" z2 V( S; L" m$ {' Z
|