u-boot 超时后不重试

u-boot not retrying after timeout

我将 u-boot 配置为使用 tftpboot 通过以太网抓取 linux 图像。如果外部设备上的 tftp 服务器已经设置并且 运行,一切正常。但是,如果我的设备在服务器准备就绪之前开机,它将超时。一旦超时,将不再尝试连接服务器获取文件。:

Filename 'image.ub'.
Load address: 0x10000000
Loading: T T T T T T T T T T
Retry count exceeded; starting again
Zynq>

尽管它显示 "starting again",但实际上并没有重新启动。一旦服务器最终准备就绪,就没有通信来获取 linux 图像。注意我可以用串口手动重启tftpboot,但是我需要它自动重试

是否有一些选项可以让重试真正发生?这里是一些环境变量:

> echo $default_bootcmd
    run uenvboot; run cp_kernel2ram && bootm 0x10000000; run netboot
> echo $netboot
    tftpboot ${netstart} ${kernel_img} && bootm        
> echo $uenvboot
    if run sd_uEnvtxt_existence_test; then run loadbootenv; echo Loaded environment from ${bootenv}; run importbootenv; fi; if test -n $uenvcmd; then echo Running uenvcmd ...; run uenvcmd; fi

U-Boot输出的最后一条消息,

Retry count exceeded; starting again

源自 tftp_timeout_handler() and restart(), which then calls net_start_again()

Is there some option that will make a retry actually occur?

U-Boot例程net_start_again()表示环境变量netretry决定局部变量retrycntretry_forever

尝试用值 yes 定义环境变量 netretry,即

setenv netretry yes

当环境中不存在变量 netretry 时,代码指示不会尝试重试(根据此 patch),如您所见。