搞了一块米联客的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
打开SDK,导入下好的device-tree-xlnx,如图
导入.bit文件工程,打开hdf文件,可以看到vivado生成的硬件资源
新建一个BSP,如下图
加入boot参数
console=ttyPS0,115200n8 root=/dev/mmcblk0p2 rw noinitrd rootfstype=ext4 rootwait
然后出现一堆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";
};
还有一些自带生成的bug,如果这里写成#include居然会编译错误?memory也要@0,
此时可以编译了,这里有个骚操作
先把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文件夹,将刚刚生成的zynq-mz7x.dts复制到 /u-boot-xlnx-xilinx-v2018.3/arch/arm/dts/ 文件夹下,还有一个头文件
#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需要。
进入SDK,新建一个project,用fsbl的模板
这里有两个我们需要的,一个是DMA驱动,一个是GPIO
右键fabl project,build一下,然后生成这个
拷出来
这里有个头文件需要加入
#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的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。
安装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格式用于放文件系统
最后同步到挂载在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测试下
测试下网口
下一篇DMA、GPIO驱动加载和用户态程序正在酝酿
参考
http://copyfuture.com/blogs-details/482a7861c6a41a9c2778c9acb7a58700
https://github.com/PyHDI/zynq-linux
https://blog.csdn.net/long_fly/article/details/80482248