4 M- D" V! l& e' ?% P1 l9 Y
- 实验说明
3 C; j$ |! D1 b5 o2 F' G
操作环境: - Windows 7/10 64bit
- Xilinx Vivado 2017.4
- Ubuntu 14.047 P/ s9 k) y+ n& H' U
6 O1 d. W B2 b. r2 [, g' c# {( y3 X& z
表 1 7 v% h/ \/ M7 c5 v: l/ d G+ ]
在运行Linux系统下,对于Zynq PL端的开发,可以通过动态加载PL端程序、PL设备树的方法对其进行配置。PL端设备树文件xxx.dtsi的生成,需要依赖于Vivado工程的xxx.hdf硬件描述文件和Xilinx设备树源码。 本文以光盘"All-Programmable-SoC-demos\tl-axi-gpio-led-demo"例程为例,演示生成、编译PL端设备树文件,以及动态加载PL端程序和PL设备树的方法。 - 生成PL端设备树文件
- 导出Vivado工程硬件描述文件
1 Y! N3 z1 o. m
参照《基于TcL脚本生成Vivado工程及编译》文档,生成Vivado工程并对其进行编译,后面将由Vivado工程编译生成的xxx.bin文件进行动态加载。 点击Vivado的菜单栏"File -> Export -> Export Hardware…",弹出对话框中点击OK,导出tl-axi-gpio-led-demo例程的xxx.hdf硬件描述文件。
% \5 |0 t* z/ i8 x( N4 S# E# A/ Q
: K. A; Y3 U3 S; Y4 ]6 {4 U I* \ 导出完成后,将在"All-Programmable-SoC-demos\tl-axi-gpio-led-demo\"工程目录下生成"\hw\src\runs\axi_gpio.sdk\axi_gpio_wrapper.hdf"文件,同时TcL控制台打印如下信息。
4 B0 `6 d. ~5 _$ U$ } 点击Vivado的菜单栏"File -> Launch SDK",使用Xilinx SDK加载xsdk工程。在弹出对话框中点击OK,打开xsdk工程如下图所示。 ( Y! U# f( I* J5 o8 q& Z
8 R: m( T+ g4 I+ f) S
: v+ Q( ^3 r9 q9 }3 Y" a - 导入device-tree-xlnx7 z, N- V5 c( i
Xilinx设备树源码为“光盘\Linux-system\device-tree-xlnx\src\device-tree-xlnx-[Git 系列号]-[版本号].tar.gz”,其中Git系列号与版本号以实际的为准。将其解压到Windows非中文目录,解压后安装包内容如下图所示。 PL端xxx.dtsi设备树文件需要依赖于Xilinx设备树源码生成。 , k5 d) R9 d& j' X0 X
点击Xilinx SDK菜单栏"Xilinx -> Reposistories"。
( n4 D S+ a9 m8 S" c 在弹出的Xilinx SDK资源库配置界面中,点击"Repositories -> New…",弹出对话框中选中解压到非中文路径下的device-tree-xlnx源码,点击“确定”将其添加进来。
% x2 W+ g, E* N4 q6 L3 f, B 添加完device-tree-xlnx设备树源码如下图所示,点击OK完成。
V4 D; u& N1 L" P% @+ q! a - 生成PL设备树8 q2 `7 E$ I% r7 ^2 _
点击Xilinx SDK菜单栏"File -> New -> Board Support Package",新建Board Support Package。
; T$ ?: f5 z3 W8 l% ^ 在弹出新建Board Support Package配置界面中,按照下图默认选项配置Project name(BSP包命名),Hardware Platform,CPU,同时在Board Support Package选项中勾选"device_tree",点击Finish完成配置。 1 \7 {$ [5 Z# w! J- o
在弹出的界面,将dt_overlay的值修改成true,该选项将支持设备树文件的动态加载,如图所示。 , y9 z% y _" D* P+ ?( _5 `8 y
点击OK,完成SoC工程"hw\src\runs\axi_gpio.sdk\device_tree_bsp_0\pl.dtsi"设备树文件修改,如下图所示。
* X M) W. C' s7 }7 E - pl.dtsi文件是PL端使用的IP核对应的设备树,我司实际开发中仅用到此设备树文件;
- zynq-7000.dtsi文件是Xilinx提供给所有Zynq-7000开发板使用(没用到此文件);
- system.dts根据开发板上的具体实现,修改设备树使其可正常工作(没用到此文件)。​​​​​​​
- }& F( O- g) H! n7 ^
在Ubuntu下新建"/home/tronlong/Zynq/Linux-system/device-tree-xlnx"工作目录,将前面步骤生成的"hw\src\runs\axi_gpio.sdk\device_tree_bsp_0\pl.dtsi"设备树文件拷贝到该目录下,如下图所示: Host#mkdir -p /home/tronlong/Zynq/Linux-system/device-tree-xlnx Host#cd/home/tronlong/Zynq/Linux-system/device-tree-xlnx Host#ls
4 q& ]; m- {& f' V 执行Linux内核编译时,会在Linux内核源码"scripts/dtc/"目录下生成设备树编译器dtc工具。执行如下指令,使用dtc工具编译pl.dtsi设备树源文件。 编译完成后将在当前目录下生成dtbo文件,指令中dtc工具路径以实际情况为准。 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
$ O6 S: @! `6 p) P P7 R5 k - 动态加载PL程序和设备树
8 ~( ?+ {' o# q) R4 y3 p" u
开发板上电启动进入文件系统,执行如下指令新建"/lib/firmware"目录。将编译生成的dtbo文件,以及由Vivado工程编译生成的xxx.bin文件复制到"/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
[) X. b% e K* O 执行以下指令在文件系统根目录下新建configfs目录及设备节点,并从"/lib/firmware"目录下动态加载PL端程序和dtbo文件。 Target#mkdir /configfs Y* u! w. C: o4 O: P; Y* ]( t" |
Target#mount -t configfs configfs /configfs" J+ X& D$ V. C6 M$ P( ^* o
Target#mkdir /configfs/device-tree/overlays/full7 R# P9 w' p5 f: a
Target#echo -n "pl.dtbo" > /configfs/device-tree/overlays/full/path
% \' S8 F% R5 d7 q. w. n* X3 t; g
2 ?6 o; ]5 e; C% |( [+ C1 k
r4 D% J' z* z2 Z: \若需要重新加载dtbo文件,执行如下指令删除full目录,再重新创建,然后再动态加载dtbo文件即可。! C( d6 Q% g) \! S; d
Target#rmdir /configfs/device-tree/overlays/full
, |+ i8 e7 e, y8 J& Q: x' y Q: p4 bTarget# mkdir /configfs/device-tree/overlays/full
' q. J6 Y/ ]) cTarget# echo -n "pl.dtbo" > /configfs/device-tree/overlays/full/path3 O( f, Y N% S' O8 h
# l9 g% i8 c0 s5 g9 X' v' o8 j; C! D+ T1 p# N3 p+ s% {; w
- 动态加载多个设备树
# H4 l& G8 M! ]7 z$ u; c
若按照上面的步骤加载了一个设备树,如果还想加载其他dtbo,可以在"/configfs/device-tree/overlays/"目录下再任意新建一个文件夹,然后再加载设备树: Target# mkdir /configfs/device-tree/overlays/pl_dtbo Target# echo -n “pl.dtbo” > /configfs/device-tree/overlays/pl_dtbo/path 0 O* Q- d4 S/ V s: V% v3 P9 {1 Q1 y
|