Zynq 移植 Debian9 stretch

    搞了一块米联客的7035开发板,非标准版的,移植Debian9系统先,然后将FPGA数据通过DMA传到ARM端,走TCP/IP协议栈传出来。当然还有一种是使用standalone的lwip轻量级的协议栈,比较了下有操作系统毕竟好维护。

PC操作系统 Ubuntu 18.04

硬件 Zynq 7035  (米联客的,非标准开发板,类似于这种非标准版的开发板需要自己配置好defconfig文件,但大体都差不多)

一张TF卡

https://github.com/Xilinx/u-boot-xlnx (u-boot)

https://github.com/Xilinx/linux-xlnx(kernel

http://cdn.debian.net/debian (根文件系统)

xilinx_mz7x_defconfig 编译内核需要用到

本文后续要用到GPIO和DMA,预配置中要加入GPIO和DMA的支持

# GPIO支持
CONFIG_GPIO_SYSFS=y
CONFIG_SYSFS=y
CONFIG_GPIO_ZYNQ=y

# DMA支持
CONFIG_CMA=y
CONFIG_DMA_CMA=y
CONFIG_XILINX_DMA_ENGINES=y
CONFIG_PL330_DMA=y
CONFIG_XILINX_DMA=y
CONFIG_XILINX_AXIDMA=y
CONFIG_XILINX_AXIVDMA=y
CONFIG_DMA_SHARED_BUFFER=y

zynq_mz7x_defconfig 编译u-boot需要用到

这个文件和标准板的zynq_zc702_defconfig差不多了

design_1_wrapper.bit 

PL端用到了DMA,GPIO,1号网口,FPGA端生成的DMA测试程序,本文用到了DMA和GPIO以及网口(怎么搭建硬件平台去问度娘)

 

先把所有的下下来,装好Xilinx SDK,我的版本是最新的2018.3

利用.bit文件建立设备树

打开SDK,导入下好的device-tree-xlnx,如图

Zynq 移植 Debian9 stretch_第1张图片

导入.bit文件工程,打开hdf文件,可以看到vivado生成的硬件资源

Zynq 移植 Debian9 stretch_第2张图片

新建一个BSP,如下图

Zynq 移植 Debian9 stretch_第3张图片

加入boot参数

console=ttyPS0,115200n8 root=/dev/mmcblk0p2 rw noinitrd rootfstype=ext4 rootwait

Zynq 移植 Debian9 stretch_第4张图片

 

然后出现一堆dts文件,要改下pl端的设置

   axidma_chrdev: axidma_chrdev@0 {
		    compatible = "xlnx,axidma-chrdev";
		    dmas = <&axi_dma_0 0 &axi_dma_0 1>;
		    dma-names = "tx_channel", "rx_channel";
		};

Zynq 移植 Debian9 stretch_第5张图片

还有一些自带生成的bug,如果这里写成#include居然会编译错误?memory也要@0,

Zynq 移植 Debian9 stretch_第6张图片

此时可以编译了,这里有个骚操作

先把system-top.dts编译成 dtb文件

../linux-xlnx-xilinx-v2018.3/scripts/dtc/dtc -I dts -O dtb -o ./devicetree.dtb ~/workspace/device_tree_bsp_0/system-top.dts

然后又编译回来,将system-top,pl,....所有文件组合成一个dts文件

../linux-xlnx-xilinx-v2018.3/scripts/dtc/dtc -I dtb -O dts -o ./zynq-mz7x.dts ./devicetree.dtb

这个最后zynq-mz7x.dts文件时编译u-boot需要,devicetree.dtb是启动操作系统需要的

 

U-Boot编译

进入u-boot文件夹,将刚刚生成的zynq-mz7x.dts复制到 /u-boot-xlnx-xilinx-v2018.3/arch/arm/dts/ 文件夹下,还有一个头文件

,放到include/configs下

#make distclean  //清除配置文件和编译中间结果

#make CROSS_COMPILE=arm-linux-gnueabihf- zynq_mz7x_defconfig //重新配置,生成makefile,具体板子不一样,在U-Boot/configs文件夹下,这个会找到dts下的zynq-mz7x.dts

#make CROSS_COMPILE=arm-linux-gnueabihf- tools  //编译开发所需要的工具

#make CROSS_COMPILE=arm-linux-gnueabihf-  //编译,完成后生成一个elf文件u-boot,uboot.bin,u-boot.srec等文件

最后把编译生成的u-boot后缀改成.elf,连同u-boot.img文件拷贝出来,启动Linux需要。

 

First Bootloader FSBL生成

进入SDK,新建一个project,用fsbl的模板

Zynq 移植 Debian9 stretch_第7张图片

Zynq 移植 Debian9 stretch_第8张图片

这里有两个我们需要的,一个是DMA驱动,一个是GPIO

Zynq 移植 Debian9 stretch_第9张图片

右键fabl project,build一下,然后生成这个

Zynq 移植 Debian9 stretch_第10张图片

拷出来

内核编译

这里有个头文件需要加入

#export PATH=${YOUR_UBOOT_DIR}/tools:$PATH  //编译内核如果要生成uImage,则需要用到mkimage工具,该工具在u-boot/tools下有提供
#make distclean //清除配置文件和编译中间结果
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- xilinx_mz7x_defconfig  //重新配置,生成makefile 
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- prepare scripts  //编译开发所需要的工具
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- UIMAGE_LOADADDR=0x8000 uImage  //编译内核,且生成uImage

 最后把{KERNEL_DIR}/arch/arm/boot/uImage拷贝出来。uImage是在zImage之前加上一个长度为0x40,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage0x40位置开始执行,zImageuImage没有任何区别。

 

 

根文件系统搭建 Debian9

安装Arm环境和debootstrap

#sudo apt-get install binfmt-support qemu qemu-user-static debootstrap

第一步,把Debian9文件提取出来

#sudo debootstrap --arch=armhf --foreign stretch rootfs http://cdn.debian.net/debian

等~~~~~~~~~~

第二步,编译

#cp /usr/bin/qemu-arm-static {{刚刚rootfs目录}}/usr/bin

#cd rootfs

//这里先进入rootfs目录,使用arm环境,开始用debootstrap编译

#DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true LC_ALL=C LANGUAGE=C LANG=C chroot rootfs debootstrap/debootstrap --second-stage

 

再等~~~~~~~~~

终端上会最后打印 I: Base system installed successfully.,说明根文件系统就定制成功了。

 

进去刚刚的环境

#chroot rootfs

用apt-get做一些常用的命令 (更正,用这个源 deb http://ftp.cn.debian.org/debian/ stretch main)

#apt-get update

#apt-get install vim sudo net-tools

 

为 root 设置密码和创建新用户

# passwd root

debian不能以root用户登陆,所以创建一个普通用户,登陆系统后再切换到root用户

# adduser xiong

# exit

然后挂载在tf卡,先插入tf卡

用100MB的FAT格式做UBOOT启动,其他剩余的ext4格式用于放文件系统

Zynq 移植 Debian9 stretch_第11张图片

 

最后同步到挂载在tf的ext4文件夹内

#cd rootfs

#rsync -av ./ /media/xiong/rootfs

 

编译启动文件

制作启动镜像需要用到三个文件:fsbl.elf、system.bit和第二步生成的u-boot.elf。

生成fsbl后

选择Create Boot Image

 

 

加入u-boot.elf的路径,然后Create Image,就会在指定的输出路径上生成BOOT.bin

 

新建一个uEnv.txt,输入内容:

optargs=console=tty0 consoleblank=0 vt.global_cursor_default=0

将步骤生成的BOOT.bin、uEnv.txt、devicetree.dtb、uImage拷贝到上一步UBOOT分区下

最后插入TF卡上电开机,用串口的putty测试下

Zynq 移植 Debian9 stretch_第12张图片

Zynq 移植 Debian9 stretch_第13张图片

Zynq 移植 Debian9 stretch_第14张图片

测试下网口

Zynq 移植 Debian9 stretch_第15张图片

下一篇DMA、GPIO驱动加载和用户态程序正在酝酿

参考 

http://copyfuture.com/blogs-details/482a7861c6a41a9c2778c9acb7a58700

https://github.com/PyHDI/zynq-linux

https://blog.csdn.net/long_fly/article/details/80482248

你可能感兴趣的:(linux杂谈,硬件)