Loading Linux Images via Ethernet and TFTP
Â
This note explains how to load images to the target via Ethernet. With an Ethernet connection available, U-Boot can load images from a TFTP host quickly and easily. This is the development and software manufacturing option that is preferable with U-Boot and Linux.
The download procedure is based on the tftpboot
command provided by the U-Boot command interface. tftboot
implements a download capability over Ethernet using the TFTP protocol and has the following synopsis:
tftpboot <file> [<load_addr>]
If you do not specify a load address, then the value will be taken from the loadaddr
environment variable. On the NXP i.MX RT1170 EVK board, loadaddr
is set as follows, placing the download buffer into the on-module SDRAM:
=> print loadaddr
loadaddr=0x80007fc0
=>
The MAC address of the Ethernet interface is defined by the ethaddr
environment variable.The IP address of the board is defined by the ipaddr U-Boot environment variable. The TFTP server IP address is defined by the serverip U-Boot environment variable. Make sure you define these environment variables to values that make sense for your LAN and save them in the SD Card:
=> setenv ethaddr C0:B1:3D:88:88:89
=> setenv ipaddr 192.168.88.89
=> setenv serverip 192.168.88.170
=> saveenv
Saving Environment to MMC... Writing to MMC(0)... OK
Once the transmission using tftpboot
finishes, the file will be in memory at the specified load address. The loadaddr
environment variable will automatically be set to the address the tftpboot
command used. The filesize
environment variable will automatically be set to the number of bytes transferred during the load operation.
Then you are free to do whatever you like with the loaded image. You can boot Linux from the image (assuming it is a Linux uImage
file), display the memory, etc.
One typical command sequence involving tftpboot
is defined in the netboot
environment variable, which by default is set in U-Boot as follows:
=> print netboot
netboot=tftp ${image} && run addip && bootm
=>
What netboot
does is load from tftpdir
in a TFTP host a file defined by image (the tftp command), then add the TCP/IP related parameters to the kernel command string (addip), and finally boot Linux from the just loaded image (bootm).
Let's use netboot
to boot Linux via TFTP from the sample Linux image (rootfs.uImage
) included in the Emcraft software distribution. Copy rootfs.uImage
to the appropriate (tftpdir
) TFTP directory on the host and then from U-Boot on the target set the image
environment variable to point to the image:
Here are some troubleshooting tips, in case tftpboot
does not work for you from U-Boot:
As trivial as it sounds make sure that the board is connected to the LAN with an Ethernet cable.
Suppose you are still not getting your file from the TFTP server. It is possible that the problem is on the host side - you must set up a TFTP server correctly. Just google for "how to set up a tftp server" and follow the advice from some top articles.
Make sure you have copied a file you are trying to download to the TFTP server directory on the host.
Disable the firewall on the host since get enabled, it will block TFTP requests from the target.
On the target, make sure that you have set
ipaddr
andserverip
correctly. Checkethaddr
and make sure that you don't have another embedded board (eg. another NXP i.MX RT1170 EVK board) configured for the same MAC address.