使用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中输入命令:
使用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;