如何移植linux系统至zynq板卡上呢?这里我们只讲方法,不讲原理,适合小白参考!
一、必要信息
假设你手上有一块zynq的板卡,现在你需要给板卡搭载一个linux操作系统,以及开发一些接口模块的驱动程序。那么首先你需要知道板卡的原理图,原理图中你需要关注以下几点:
-
zynq具体型号
-
zynq启动方式
-
DDR型号
-
FLASH型号
-
uart引脚约束
二、搭建BD平台
利用vavido软件搭建BD平台,这部分不会的可以直接参照我的另外一篇博客《zynq Linux程序开发》,搭建完BD后,需要导出HDF文件,以及launchSDK,在SDK中创建FSBL工程,这个FSBL工程一般直接使用SDK自动生成的就行,FSBL称为第一阶段引导程序,SDK根据你搭建的硬件平台会自动生成一个匹配BD的FSBL,在FSBL中主要对内存、时钟等等进行了设置,保证了CPU(ARM)能正常运行。
三、hello world程序固化
为什么我移植linux系统,还要固化hello world程序呢?因为hello world程序是最简单的,也是最方便去验证zynq能否正常启动的,而你直接固化UBOOT,当你看到命令中无任何输出时,并不能确定是启动方式的问题,还是生成的uboot问题。所以建议在移植之前,先利用hello world程序来验证下zynq能否正常启动。如果命令行中能正常打印除hello world,那就可以进行下一步移植uboot的工作;如果不能正常打印,就需要检查启动方式设置、FLASH参数配置、DDR参数配置是否有问题。
如何验证DDR有没有问题呢?很简单,SDK支持在线调试,在线加载hello world程序,运行后看能否打印出hello world,如果可以,就说明DDR没有问题;如果不能,那就要去vivado工程去检查下DDR的型号、位宽等配置是否有问题。
如何检查启动方式呢?FSBL工程中有一段代码是获取当前板卡的启动方式的,直接把这个值打印出来看看就知道,记得在打印时要看看是否已经初始化了串口,不然无法打印的。
如果以上两点都没问题,那基本上可以确认是FLASH配置问题了,如果是NAND FLASH启动,特别注意要配置SMC,按照FLASH的datasheet来配置。
四、移植uboot
在移植linux系统之前,还需要移植uboot,可以把uboot理解成二级引导程序,而且uboot本身也就是个裸机程序,所以可以利用SDK在线调试,看看uboot能否输出信息。uboot分为两个版本,一个是不支持设备树的uboot,最新的uboot是支持设备树的版本。我们按支持设备树的版本来移植uboot。uboot的设备树只是将硬件信息告诉uboot,在编译uboot的时候,会将uboot文件夹中的设备树链接进uboot.elf,因此在移植uboot时必须要修改uboot中的设备树。可能很多人会问:为什么uboot中有个设备树,而内核中也有个设备树,这两个设备树我要用哪个呢?其实你打开uboot中的设备树和内核中的设备树,你就会发现这两个设备树时一样的,也就是你修改并使用其中一个就行,而且必须是修改uboot中的设备树,因为uboot中的设备树是直接编译进uboot的,而不是去flash的偏移地址处读取设备树。你可以直接将uboot中的设备树修改完,拷贝一份作为内核的设备树文件,再去内核里编译成DTB文件就行。
uboot默认是从NOR FLASH启动的,所以需要根据你的板卡启动方式修改uboot的启动方式,例如如果你的板卡是从NAND启动,就需要在include/configs/zynq_zc70x.h增加
#define CONFIG_SYS_NO_FLASH
#define CONFIG_NAND_ZYNQ
紧接着要修改uboot的环境变量,也即是指定uboot该从什么地方读取内核、设备树、文件系统。这一步非常关键,在利用SDK烧写程序时要按照uboot中设置的环境变量中的便宜地址来,否则uboot引导就会失败。
当然,你可以利用make menuconfig来关闭不需要的外设驱动(建议关掉,不然可能会出现uboot启动卡在寻找驱动与之对应设备的死循环中)。
修改完配置文件后,就需要根据板卡的硬件信息,来修改设备树了,主要是内存大小,时钟频率,以及串口,修改完后,再执行make就可以编译uboot了,编译生成的uboot文件要手动修改为uboot.elf文件,再利用SDK常见BOOT.BIN。
附上移植uboot的步骤:
1.解压u-boot-xlnx-xilinx-v2017.4; 7za x u-boot-xlnx-xilinx-v2017.4 -r -o./
2.修改根目录下的Makefile文件,指定架构和编译工具链;
3.修改zynq_zc70x.h
4.修改zynq_common.h
5.make zynq_zc70x_config
6.make
五、移植linux
linux版本也分为两个,在linux3.0之前是没有设备树的版本,在linux3.0之后引入了设备树,就需要修改设备树来给内核提供硬件信息。一般内核可以直接编译,也可以将不需要的驱动模块去掉(利用make menuconfig),再利用make dtbs来编译设备树。
附上移植kernel的步骤:
- 解压linux-xlnx-xilinx-v2017.4.zip; 7za x linux-xlnx-xilinx-v2017.4.zip -r -o./
- 修改根目录下的Makefile文件,指定架构和编译工具链;
- 增加板卡对应的设备树;
- make xilinx_zynq_defconfig
- make uImage -j2
六、uramdisk
uramdisk可以直接从网上下载一个,也可以自己利用busybox构建一个,一般都是采用从网上下载一个,因为这部分都是通用的,而且下载下来后,可以根据自己的需求进行修改。这里可以到博主的下载模块进行下载;
附上修改ramdisk的步骤:
dd if=uramdisk.image.gz of=ramdisk.image.gz bs=64 skip=1
gunzip ramdisk.image.gz
mkdir p rootfs
sudo mount -o loop,rw ramdisk.image rootfssync
sudo umount rootfsgzip -9 ramdisk.image
mkimage -A arm -T ramdisk -C gzip -n Ramdisk -d ramdisk.image.gz uramdisk.image.gz
rm ramdisk.image.gz