本文将介绍如何利用上节搭建好的交叉编译环境编译嵌入式Linux所需的文件,包括u-boot、uImage(内核)、uramdisk.image.gz(文件系统)和devicetree.dtb(设备树)。
原料:
u-boot-xlnx.git
linux-xlnx.git
device-tree-xlnx-xilinx-v2014.4.zip
编译
1. U-Boot
~$ mkdir ZYNQ
~$ cd ZYNQ/
~/ZYNQ$ mkdir buildxil2014.4
~/ZYNQ$ cd buildxil2014.4/
~/ZYNQ/buildxil2014.4$ git clone https://github.com/Xilinx/u-boot-xlnx.git //或者先下载好,直接copy、解压
cd u-boot-xlnx
在编译之前,先进行配置,配置文件在u-boot-xlnx/include/configs下,打开zynq_common.h可查看信息。包括所需要的几个文件的名称等
make zynq_zed_config
make
cp u-boot u-boot.elf
如果需要安装python:
sudo apt-get --reinstall install python-minimal
在u-boot-xlnx/include/configs下,查看zynq_common.h,zynq_zed.h(优先),决定了内核等文件的名称。
本例使用zynq_zed_config:
“ethaddr=00:0a:35:00:01:22\0” \
“kernel_image=uImage\0” \
“kernel_load_address=0x2080000\0” \
“ramdisk_image=uramdisk.image.gz\0” \
“ramdisk_load_address=0x4000000\0” \
“devicetree_image=devicetree.dtb\0” \
“devicetree_load_address=0x2000000\0” \
“bitstream_image=system.bit.bin\0” \
“boot_image=BOOT.bin\0” \
2. uImage
使用配置文件:xilinx_zynq_defconfig(arch/arm/configs)
cd ~/ZYNQ/buildxil2014.4
git clone https://github.com/Xilinx/linux-xlnx.git //或直接copy下载好的linux-xlnx-xilinx-v2014.4.tar.gz
cd ~/ZYNQ/buildxil2014.4/u-boot-xlnx-xilinx-v2014.4/ //需要先安装u-boot-tools
sudo apt-get install u-boot-tools
cd ~/ZYNQ/buildxil2014.4/linux-xlnx-xilinx-v2014.4
make ARCH=arm xilinx_zynq_defconfig
make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
cp arch/arm/boot/uImage
3. uramdisk.image.gz文件系统
这里不进行编译了,直接使用官网的:http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs
或:
wget http://www.wiki.xilinx.com/file/view/arm_ramdisk.image.gz/41943558/arm_ramdisk.image.gz
修改根文件系统
cp arm_ramdisk.image.gz ramdisk.image.gz
gunzip ramdisk.image.gz
mkdir file_tmp
sudo mount ramdisk.image -o loop ./file_tmp/
这样可以在file_tmp目录中对文件系统进行修改,修改完成之后umount并重新压缩即可
sudo umount file_tmp/
gzip ramdisk.image
//添加u-boot头部
sudo apt-get install u-boot-tools
mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
如果需要进行修改,可以先将uramdisk.image.gz解压为uramdisk.image,再挂载到指定目录
4. devicetree.dtb
建议:
建立一个devicetree目录,将/scripts/dtc/dtc工具copy过来,每次使用时在其下建立工程目录;
将所需要的dts,dtsi文件copy到其下的工程目录下;
然后对工程目录打开终端:../dtc -I dts -O dtb -o devicetree.dtb system.dts即可;
如果只有ARM,没有使用PL部分:
在linux-xlnx/arch/arm/boot/dts/下,找到zynq-zed.dts及相关dtsi文件,copy到上述devicetree/xil2014.4/下:
../dtc -I dts -O dtb -o devicetree.dtb zynq-zed.dts
为PL配置devicetree
自己写的PL程序对于ARM来说相当于是新的外设,在xil提供的Linux内核中的dts是没有的,需要自己制作匹配的dts文件。SDK提供了根据在vivado中的硬件设计文件来生成设备树的工具。也可以自己手工编写或作出调整。
使用SDK制作和PL相匹配的devicetree。
SDK设置
下载device-tree-xlnx-xilinx-v2014.4.tar.gz,解压将device-tree-xlnx-xilinx-v2014.4文件夹。
添加至:bsp repo=D:\Xilinx\SDK\2014.1\data\embeddedsw\lib\bsp下,
使用SDK添加下载好的目录:SDK Menu: Xilinx Tools > Repositories > New… (bsp repo) > OK
注:由于device-tree-xlnx-xilinx-v2014.4.tar.gz,但是有win下路径\的问题;重新在https://github.com/Xilinx/device-tree-xlnx下载,device-tree-xlnx-xilinx-v2014.4.zip(clone in desktop),解决
SDK使用
新建:SDK Menu: File > New > Board Support Package > Board Support Package OS: device-tree > Finish
在弹出的的对话框中修改参数;比如bootargs内核的命令行参数,内核启动时传给内核,可设置为:console=ttyPS0,115200 root=/dev/ram rw earlyprintk
编译完成后在工程的\HW\Lab2-LedIP\Lab2-LedIP.sdk\device_tree_bsp_0下可以找到system.dts文件
将所有的dts,dtsi文件copy到虚拟机下的buildxil2014.4/linux-xlnx-xilinx-v2014.4下,使用dtc工具生成devicetree.dtb
../dtc -I dts -O dtb -o devicetree.dtb system.dts
注:这种方法在测试的时候有效,可以使用;但是在做HDMI的时候不能用了,没搞明白怎么回事。只有手工编写dts文件了。
小结
至此,已经编译了xil2014.4-Linux所需的文件了。当然现在还不能启动Linux,还需要制作BOOT.bin文件。这些方法适用于其他硬件,需要确定合适的配置文件。 在实际操作的过程中,由于工具版本、源代码出处及版本等问题,折腾了很多次才选择这种方法,而且经过后续验证有效。在参考陆佳华的书、前辈博客、各种论坛的过程中,遇到过xilinx、xup、zedboard、digilent、AD等出的源码或者编译好的文件,有的是面向ISE的(比如ISE、Vivado的设备树定义不一样,甚至vivado2014.1和2014.4都不完全一样),在参考资料和手头源码加个人关于这块不甚了解的情况下,经历了N次痛苦的过程。 由于时间问题,个中细节就不再详述了,看错误信息、查论坛一般可以解决。