开发板:Zynq7030数据采集板
PC平台:Ubuntu-18.04 + MobaXterm
开发环境:Xilinx Vivado + SDK -18.3
交叉编译工具:arm-linux-gnueabihf-
学习目标:生成 uImage、devictree.dtb 文件
在第一篇文章Zynq-7000系列之linux开发学习笔记:开发前准备(一)中已经提供过Linux内核源码的下载链接,这里再提供一下,方便中途看本文章的人进行下载,链接如下:
kernel 2018.3 :https://github.com/Xilinx/linux-xlnx/tree/xilinx-v2018.3
下载完Linux内核源码后,将文件解压到相应目录,我这里还是解压到前几篇文章使用的目录。进到目录可以看到如下的文件结构:
claude1009@ubuntu:~/xc7030$ cd linux-xlnx-xilinx-v2018.3/
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ ls
arch certs CREDITS Documentation firmware include ipc Kconfig lib MAINTAINERS mm README scripts sound usr
block COPYING crypto drivers fs init Kbuild kernel LICENSES Makefile net samples security tools virt
同样,首先我们要设置好交叉编译工具和环境变量,操作如下:
claude1009@ubuntu:~$ source /home/claude1009/Xilinx/SDK/2018.3/settings64.sh
claude1009@ubuntu:~$ export ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
如果直接就开始编译Linux内核,可能会出现下面问题:“mkimage” command not found – uImage will not be built,这是由于缺少相关依赖包,执行下面命令安装即可。
claude1009@ubuntu:~$ sudo apt-get install uboot-mkimage
然后进入到Linux内核源码的主目录,使用下面使命令进行编译,生成uImage。
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ make clean
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ make xilinx_zynq_defconfig
HOSTCC scripts/basic/fixdep
HOSTCC scripts/kconfig/conf.o
SHIPPED scripts/kconfig/zconf.tab.c
SHIPPED scripts/kconfig/zconf.lex.c
HOSTCC scripts/kconfig/zconf.tab.o
HOSTLD scripts/kconfig/conf
#
# configuration written to .config
#
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ make uImage LOADADDR=0x00008000
然后等待比较长时间,就完成了。生成的内核文件所在位置为生成 linux-xlnx-xilinx-v2018.3/arch/arm/boot 。
在第一篇文章Zynq-7000系列之linux开发学习笔记:开发前准备(一)中已经提供过设备树devicetree源码的下载链接,这里再提供一下,方便中途看本文章的人进行下载,链接如下:
device-tree 2018.3 :https://github.com/Xilinx/device-tree-xlnx/tree/xilinx-v2018.3
下载完设备树devicetree源码后,将文件解压到相应目录,我这里还是解压到前几篇文章使用的目录。进到目录可以看到如下的文件结构:
claude1009@ubuntu:~/xc7030$ cd device-tree-xlnx-xilinx-v2018.3/
claude1009@ubuntu:~/xc7030/device-tree-xlnx-xilinx-v2018.3$ ls
ams axi_emc axi_sysace axi_xadc demosaic framebuf_rd hdmi_rx_ss mipi_csi2_rx pl310ps scene_change_detector sdps ttcps vtc
audio_embed axi_ethernet axi_tft canps devcfg framebuf_wr hdmi_tx_ss mipi_dsi_tx pmups scugic slcrps uartlite wdtps
audio_formatter axi_gpio axi_timebase_wdt cpu device_tree gamma_lut i2s_receiver mixer pr_decoupler scutimer smccps uartns xadcps
axi_can axi_iic axi_traffic_gen cpu_cortexa53 dmaps generic i2s_transmitter multi_scaler qspips scuwdt spips uartps
axi_cdma axi_pcie axi_usb2_device cpu_cortexa9 dp globaltimerps iicps nandps ramps sdfec tmrctr usbps
axi_clk_wiz axi_perf_mon axi_vcu ddrcps emaclite gpiops intc norps rfdc sdi_rx tpg vid_phy_ctrl
axi_dma axi_qspi axi_vdma ddrps emacps hdmi_ctrl mig_7series ocmcps RM sdi_tx tsn vproc_ss
首先将下载好的设备树源码device-tree-xlnx-xilinx-v2018.3文件夹复制到已经安装好的Vivado安装目录下的~/Xilinx/SDK/2018.3/data/embeddedsw/lib/bsp文件下,如图所示。
然后打开生成fsbl.elf文件的那个工程,进入到SDK软件中。打开 Xilinx Tools->Respositories 工具。
在Local Repositories中点击New,找到并加载刚才复制的设备树文件夹目录,然后点击Rescan Repositories,点击OK完成配置,如下图所示:
点击 File -> New -> Xilinx Board Support Package ,并命名为 devicetree_zc703 ,并在 Board Support Package OS 选择device_tree,如下图所示:
然后在弹出的窗口中,在bootargs一栏输入: console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=0 ,其他可保持不变,点击OK即可。
然后就在该工程目录下生成了一个设备树文件夹,目录如下图:
可以将此文件夹devicetree_zc703复制到Linux内核源码的目录中,然后进入目录可以看到有如下文件:
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ cd devicetree_zc703/
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3/devicetree_zc703$ ls
Makefile pcw.dtsi skeleton.dtsi system.dts system.mss system-top.dts zynq-7000.dtsi
这里我们要使用的文件有: pcw.dtsi、system-top.dts、zynq-7000.dtsi ,其中zynq-7000.dtsi是Zynq系列通用的设备树文件;而pcw.dtsi则包含我们在fsbl工程创建时,在原理框图设计中进行IO配置的外设接口;system-top.dts通过include方式包含了pcw.dtsi和zynq-7000.dtsi,是我们需要进行编译的文件,最终生成可用的设备树。
使用的命令是Linux内核源码中的dtc工具,具体操作如下:
claude1009@ubuntu:~/xc7030/linux-xlnx-xilinx-v2018.3$ ./scripts/dtc/dtc -I dts -O dtb -o devicetree.dtb ./devicetree_zc703/system-top.dts
Error: ./devicetree_zc703/system-top.dts:9.2-10 syntax error
FATAL ERROR: Unable to parse input tree
这里出现了错误,是因为在system-top.dts文件中使用include有误,修改如下:
/include/ "zynq-7000.dtsi"
/include/ "pcw.dtsi"
再次执行命令即可生成devicetree.dtb设备树文件。
将上述得到的uImage和devicetree.dtb文件,和之前得到的BOOT.bin文件都复制到SD卡中。
然后插入到板子。打开PC端的MobaXterm,设置好串口,连接好USB线和电源线,就可以看到下图的系统启动过程,并成功登录系统。
到此,我们的Linux系统就搭建完成啦0.0.0.0.0