开发板运行U-Boot,在终端下使用Ping命令是能Ping通PC机,但PC机Ping不同U-Boot。
在开发行U-Boo下的Ethernet 驱动时,只能在Target上去Ping 外面的主机能检测以太网是否连通,如果在外面的主机上去ping目标板,则即使目标板上的Ethernet一切OK,也是ping 不通的。这是因为行U-Boo是一个单线程main_loop函数+中断处理的架构,中断处理程序处理串口输入输出等,main_loop解析U-Boot命令, 并没有另外的任务接受并处理ICMP的包,即使U-Boot支持ICMP的协议栈。
U-Boot的Ping是通过一个NETLOOP发送和接受ARP包的!LOOP会不断的检测是否接受到ARP REPLY。所以可以Ping通PC。但是U-Boot模式下是单线程的,总不会老是停在那里检测是否有ARP 。PC Ping通U-Boot的前提是:U-Boot存在一个类似于ARP请求响应的守护进程
setenv ipaddr 172.20.88.149;setenv serverip 172.20.88.137; setenv bootargs console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait ip=none devtmpfs.mount=1 ${optargs};
mw.b 0x20000000x00 0x1fcc00;
tftpboot 0x2000000 i-scan-pl.bit
fpga loadb 0 0x2000000 ${filesize};
fatload mmc 0 0x8000 zImage;
fatload mmc 0 0x103cdda8 devicetree.dtb;
bootz 0x8000 - 0x103cdda8
这是一段嵌入式系统的启动脚本。根据给定的设置,可以解释如下:
setenv ipaddr 172.20.88.149
:设置设备的 IP 地址为 172.20.88.149。setenv serverip 172.20.88.137
:设置 TFTP 服务器的 IP 地址为 172.20.88.137。setenv bootargs console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait ip=none devtmpfs.mount=1 ${optargs}
:设置内核启动参数,包括控制台设备、根文件系统、挂载设置等。mw.b 0x20000000x00 0x1fcc00
:将指定范围内的内存清零。tftpboot 0x2000000 i-scan-pl.bit
:通过 TFTP 从服务器下载位流文件(i-scan-pl.bit)到内存地址 0x2000000。fpga loadb 0 0x2000000 ${filesize}
:将位流文件加载到 FPGA 中。fatload mmc 0 0x8000 zImage
:从 MMC 存储卡的指定分区(mmc 0)加载 Linux 内核映像(zImage)到内存地址 0x8000。fatload mmc 0 0x103cdda8 devicetree.dtb
:从 MMC 存储卡的指定分区(mmc 0)加载设备树文件(devicetree.dtb)到内存地址 0x103cdda8。bootz 0x8000 - 0x103cdda8
:启动 Linux 内核,指定内核映像和设备树的加载地址。
这段脚本的作用是启动嵌入式系统,包括加载 FPGA 位流、Linux 内核和设备树,并启动系统。