使用TFTP启动Linux内核(ZYNQ-7010)

使用TFTP启动Linux内核(ZYNQ-7010)

发现最近随便转载的很多啊,未经授权禁止转载!抄袭!!否则转载者死全家!!另外这是我的笔记,不是教程,难免会有错误,不具有很高的参考性,望周知。

ZYNQ的启动与普通的LINUX芯片不太一样,需要在启动内核之前通过u-boot加载比特流文件,否则会因为没有FPGA的程序导致外设无法正常运行。

服务端配置

Ubuntu虚拟机中,安装TFTP服务:

1
sudo apt-get install tftpd-hpa

然后将内核文件复制到**/tftpboot**目录中:

1
2
sudo cp zImage /tftpboot
# 在Ubuntu 20.04中,tftpd-hpa的默认路径改为:/srv/tftp

复制设备树文件:

1
sudo cp system.dtb /tftpboot

测试服务端是否正常(可以忽略):

1
2
3
tftp localhost
tftp> get zImage
Received 7574653 bytes in 1.7 seconds

开发板配置

进入U-boot命令,从TFTP服务器获取比特流文件:

1
2
#ZYNQ的U-boot环境中没有tftp命令,使用bootp命令代替
bootp 0x00100000 system.bit

加载比特流文件:

1
2
fpga loadb 0 0x100000 0x300000
#loadb [dev] [address] [size] Load device from bitstream buffer (Xilinx only)

正常情况下,比特流文件加载之后,FPGA程序就开始正常跑了,u-boot会有如下输出:

1
2
3
4
5
6
7
Bytes transferred = 2083866 (1fcc1a hex)
design filename = "system_wrapper;UserID=0XFFFFFFFF;Version=2018.3_AR71948_AR71948"
part number = "7z010clg400"
date = "2022/06/27"
time = "15:53:54"
bytes in bitstream = 2083740
zynq_align_dma_buffer: Align buffer at 10007e to fff80(swap 1)

获取内核:

1
2
bootp 0x02080000 zImage
#这里使用gzip压缩的zImage,也可以使用uImage

下载设备树:

1
bootp 0x02000000 system.dtb

启动:

1
2
bootz 0x02080000 - 0x02000000
#使用uImage格式的内核,需要将bootz命令改为bootm

测试可以启动。

直接启动

为了避免每次启动都输入这么多命令,可以将这些命令保存成变量:

1
env set userboot 'bootp 0x100000 system.bit;fpga loadb 0 0x100000 0x300000;bootp 0x02080000 zImage;bootp 0x02000000 system.dtb;bootz 0x02080000 - 0x02000000'

保存变量到Flash中:

1
2
env save
# saveenv 命令也可以

保存过后,需要启动的时候只需要在U-boot中输入命令:

1
run userboot

使用SD卡启动

可以在SD卡的FAT分区里使用uEnv.txt文件来设置u-boot的变量:

1
2
3
4
5
6
7
8
bitstream_load_address=0x100000
bitstream_image=system.bit
bitstream_size=0x300000
kernel_image=zImage
devicetree_image=system.dtb
userboot=bootp ${bitstream_load_address} ${bitstream_image} && fpga loadb 0 ${bitstream_load_address} ${bitstream_size} && bootp ${kernel_load_address} ${kernel_image} && bootp ${devicetree_load_address} ${devicetree_image} && bootz ${kernel_load_address} - ${devicetree_load_address};
uenvcmd=saveenv;
bootcmd=run userboot;

坚持原创技术分享,您的支持是我前进的动力!