ZYNQ开发流程框图
ZYNQ操作系统搭建——环境搭建
1.虚拟机 VMware-player-14.1.1-7528167.exe
2.linux系统 ubuntu-17.10.1-desktop-amd64.iso
ZYNQ获取代码
1.网址:http://www.wiki.xilinx.com/Fetch+Sources
2.下载方式:
代码可通过在Windows通过git下载
Linux下终端命令:git clone
git clone /mnt/hgfs/kernel/linux-xlnx/arch/arm/boot/dts
3.用到git相关命令
查看git工作目录: git branch -l
切换分支:git checkout 版本分支
ZYNQ编译环境搭建
- 进入root用户,安装32位兼容库的支持(Ubuntu 17.10.1是64位系统);
CMD: apt-get install lib32z1
apt-get install lib32ncurses5
安装独立的交叉编译工具包:xilinx-2011.09-50-arm-xilinx-linux-gnueabi
安装前需更换shell:dpkg-reconfigure -plow dash(弹窗后选择no)
CMD: ./xilinx-2011.09-50-arm-xilinx-linux-gnueabi.bin
3. 安装好交叉编译工具后,设置环境变量
(以后每次开teminal都需要重新设置,或者修改相关文件,固化到系统中),
告诉系统编译工具路径:
CMD:export ARCH=arm
CMD:export CROSS_COMPILE=arm-xilinx-linux-gnueabi-
CMD:export PATH=/root/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/:$PATH
4. 为解决编译过程中出现的错误还需要安装gcc/ g++
可以通过“gcc -v” "g++ -v"命令来查看是否安装,没有安装的情况下,可通过如下命令安装
CMD: sudo apt-get install gcc
CMD: sudo apt-get install g++
ZYNQ操作系统搭建——u-boot编译
参考http://www.wiki.xilinx.com/Build+U-Boot
-
下发配置文件
进入之前u-boot解压出来的文件夹,通过以下指令进行编译以下命令需在u-boot-xlnx此文件夹下执行
CMD:make zynq_zc702_defconfig
CMD:make
以下附表为可支持的平台和对应的配置文件
-
编译时遇到以下错误,见附件:
问题出现的原因:代码在Windows下通过git下载,通过硬盘挂载的方式在虚拟机上编译。此方式会导致一些Windows下的文本文件中的符合在Linux下编译时不认识。
解决方式:重新将代码在Linux下通过git clone的方式下载一份
CMD: git clone /mnt/hgfs/kernel/linux-xlnx/
3. u-boot编译过程会提示几个错误:
错误1:
解决办法:安装缺少的库文件CMD:apt-get install libssl-dev
错误2:提示缺少DTC编译工具,通过以下指令安装;
CMD:apt-get install device-tree-compiler
在使用apt-get安装时,如遇到找不到安装包的情况,可以用apt-get update解决;
4.编译完成后的设置
make完成后会在uboot文件夹的根目录生成u-boot文件,将其拷出虚拟机,同时将后缀名改成elf文件,以便后续打包BOOT.BIN使用;
u-boot编译后要设置uboot的tools文件夹的环境变量,后续生成kernel和ramdisk都会调用;
CMD: export PATH=/home/wangrui/kernel/u-boot-xlnx/tools:$PATH
ZYNQ操作系统搭建——内核编译
内核编译参考如下链接:http://www.wiki.xilinx.com/Build+Kernel
编译过程及命令:
内核指定编译配置文件:
CMD:make ARCH=arm xilinx_zynq_defconfig
内核进行相关配置:
CMD:make ARCH=arm menuconfig
CMD:make
make ARCH=arm UIMAGE_LOADADDR=0x8000 uImage
内核进行完成最终编译,从linux-xlnx/arch/arm/boot/找到生成的文件。
编译过程中错误及解决方式:
此命令的执行有一个坑,当终端窗口太小时,会提示如下错误
解决方法:将终端窗口最大化
编译过程中如果提示错误,是缺少相关库或者没有设置环境变量,指定编译体系,解决指令如下:
CMD:apt-get install libncurses5-dev
CMD:export ARCH=arm
ZYNQ操作系统搭建——生成文件系统
文件系统主要是构建操作系统的文件架构,实际开发时一般不需要修改,可以直接使用Xilinx提供的文件系统压缩包:参考链接:http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs
根据Xilinx提供的文件系统压缩包,结合u-boot的内容,生成最终的文件;
CMD: apt install u-boot-tools
CMD:mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz
ZYNQ软件启动搭建——设备树生成
使用内核包中linux-xlnx/scripts/dtc的编译工具dtc,devicetree.dts–> devicetree.dtb
默认的dts所在目录/linux-xlnx/arch/arm/boot/dts#
CMD: ./scripts/dtc/dtc -I dts -O dtb -o .dtb .dts
提示的错误如下:
解决办法:把#include "zynq-7000.dtsi"改成/include/“zynq-7000.dtsi”
ZYNQ操作系统搭建——文件打包
Package打包到qspi flash
- fsbl;
- top.bit;
- u-boot.elf;
- uImage;(0x100000)
- system.dtb;(0x600000)
- uramdisk.image.gz(0x620000)
提示如下错误:
解决办法:先将bit文件掉
//arch = zynq; split = false; format = BIN
the_ROM_image:
{
[bootloader]E:\kernel\zynq\FSBL.elf
E:\kernel\zynq\u-boot.elf
[offset = 0x100000]E:\kernel\zynq\uImage
[offset = 0x600000]E:\kernel\zynq\system.dtb
[offset = 0x620000]E:\kernel\zynq\uramdisk.image.gz
}
ZYNQ FLASH启动
1.FALSH启动uboot调试
通过调试器进行烧写,启动信息如下:
问题:
1.Flash错误
SF: Unsupported flash IDs: manuf 00, jedec 0000, ext_jedec 0000
Failed to initialize SPI flash at 0:0 (error -93)
解决办法:
2.如何修改devicetree将bit文件打包进去:修改FLASH空间划分
打包偏移做相应的修改,打包脚本文件
//arch = zynq; split = false; format = BIN
the_ROM_image:
{
[bootloader]E:\kernel\packwr\FSBL.elf
E:\kernel\packwr\top.bit
E:\kernel\packwr\u-boot.elf
[offset = 0x500000]E:\kernel\packwr\uImage
[offset = 0x900000]E:\kernel\packwr\system.dtb
[offset = 0x920000]E:\kernel\packwr\uramdisk.image.gz
}
2.flash的相关操作:
sf probe
在使用sf read sf write之前,一定要调用sf probe
sf write 0x82000000 0x0 0x20000
把内存0x8200 0000处的数据, 写入flash的偏移0x0, 写入数据长度为0x20000(128KB), 操作偏移和长度最小单位是Byte
sf read 0x82000000 0x10000 0x20000
把flash偏移0x10000(64KB)处, 长度为0x20000(128KB)的数据, 写入到内存0x82000000, 操作偏移和长度最小单位是Byte
sf erase 0x0 0x10000
擦除偏移0x0处, 到0x10000之间的擦除块, 擦除操作是以erase block为单位的, 要求offset和len参数必须是erase block对齐的
ZYNQ 网口调试
网口的调试要分为两步:
第一步:uBoot下网口调试
在串口uboot下设置装置IP
CMD: ipset ipaddr 192.168.0.206
CMD: set netmask 255.255.255.0
ping的特殊操作方式和原因
电脑设置与装置同一个网段的IP,进行ping操作,不管是电脑ping装置,还是装置ping电脑,都ping不通,通过在相应的驱动添加调试信息得知uboot下的协议栈采用的是应答模式,所以需要两方同时做ping操作才可以ping通
相关驱动:
mac控制器:zynq_gem.c、phy驱动marvell.c
协议栈相关的:arp.c ping.c tftp.c
相关命令
mii write 0 0 0x8000 向地址为0的phy芯片的0寄存器写入0x8000
mii read 0 0 读取地址为0的phy芯片的寄存器0的值
mii dump 0 0 读取地址为0的phy芯片的寄存器0的值。结果更具可读性:
搭建tftp服务器和网络启动程序
服务器端设置加载程序的路径和选择正确的网口
客户端在串口下配置命令如下:
set ipaddr 192.168.0.206
set netmask 255.255.255.0
set serverip 192.168.0.106
tftpboot 0x2080000 192.168.0.106:uImage
tftpboot 0x2000000 192.168.0.106:system.dtb
tftpboot 0x4000000 192.168.0.106:uramdisk.image.gz
bootm 0x2080000 0x4000000 0x2000000
至此uboot下网口可用,也通通过tftp更新程序
第二步:kernel下网口调试
mac控制器驱动:macb.c
phy驱动:marvell.c
调试方法1:printk
调试方法2:借助小工具ethtool
编译目标板子可运行的工具
1、下载
ethtool-3.4.2.tar.bz2下载
2、安装
解压:tar -xvf ethtool-3.4.2.tar.bz2
配置:./configure --host=arm-xilinx-linux-gnueabi
//–host 指定的是交叉编译工具链的前缀
编译:make
生成:ethtool
查看:file ethtool
ethtool: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 2.6.16, with debug_info, not stripped
制作文件系统
1.下载 http://www.wiki.xilinx.com/Build+and+Modify+a+Rootfs
arm_ramdisk.image.gz
2.解压 gunzip ramdisk.image.gz
3.挂载
chmod u+rwx ramdisk.image
mkdir tmp_mnt/
sudo mount -o loop ramdisk.image tmp_mnt/
cd tmp_mnt/
在此处将新的工具copy进来
4.解挂载和压缩
sudo umount tmp_mnt/
gzip ramdisk.image
5.生成新的文件系统
mkimage -A arm -T ramdisk -C gzip -d ramdisk.image.gz uramdisk.image.gz