world leader in high performance signal processing
Trace: » tftp_loading_files

Loading Files With U-Boot via Ethernet and TFTP

With a network connection available, U-Boot can load files quickly and easily via TFTP.

If you need information about how to even connect to the board initially for basic communication, please see the terminal programs document.

If you need information about how to setup a TFTP server, please see the setting up a TFTP server document.

If you need information about how to connect your board to the network, please see the DHCP and Network Configuration pages.

We'll start off with a terminal connected to the board and sitting at the U-Boot prompt.

U-Boot Commands

There is just one U-Boot command that everything else uses and that is the tftp command. All you have to specify is the load address and the file to load.

bfin> help tftp
tftpboot [loadAddress] [bootfilename]

Things to keep in mind:

  • The file will transfer in binary mode.
  • The location of the file is relative to the root of the TFTP server.
  • The IP address of the board is controlled by the ipaddr U-Boot environment variable.
  • The TFTP server IP address is controlled by the serverip U-Boot environment variable.
  • You can load any file you like to any address the Blackfin can access.

Like any other command, the tftp command can (and often times is) used in the autoboot command that U-Boot runs automatically.

Common Examples

u-boot.bin

A common example of using the tftp command is loading up a U-Boot binary to test:

bfin> tftp 0x1000 u-boot.bin
Using Blackfin EMAC device
TFTP from server 192.168.0.2; our IP address is 192.168.0.15
Filename 'u-boot.bin'.
Load address: 0x1000
Loading: ############################
done
Bytes transferred = 141016 (226d8 hex)
bfin> go 0x1000
## Starting application at 0x00001000 ...
Here we loaded the u-boot.bin file into external memory at address 0x1000. Then we proceeded to simply start executing at that address.

uImage

Another common example is loading up a bootable U-Boot image that contains the Linux kernel:

bfin> tftp 0x1000000 uImage
Using Blackfin EMAC device
TFTP from server 192.168.0.2; our IP address is 192.168.0.15
Filename 'uImage'.
Load address: 0x1000000
Loading: #################################################################
         #################################################################
         #################################################################
         #################################################################
         #################################################################
         #######################################################
done
Bytes transferred = 3937349 (3c1445 hex)
bfin> bootm
## Booting image at 01000000 ...
   Image Name:   Linux-2.6.22.14-ADI-2007R2-pre-s
   Created:      2007-11-29  14:46:30 UTC
   Image Type:   Blackfin Linux Kernel Image (gzip compressed)
   Data Size:    3937285 Bytes =  3.8 MB
   Load Address: 00001000
   Entry Point:  00150000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK
Starting Kernel at = 150000
Linux version 2.6.22.14-ADI-2007R2-pre-svn3955 (vapier@G5) (gcc version 4.1.2 (ADI svn)) #22 Thu Nov 29 09:46:25 EST 2007
Here we loaded the uImage file into external memory at address 0x1000000. Then we proceeded to boot it. Keep in mind that compressed images (like uImages), the address of the uImage needs to be different from that of the load address of the executable and that it needs to be loaded outside of the decompressed file. Our kernel here loads at 0x1000 and is only 3.8 megs, so the load address of the uImage at 16 meg (0x1000000) is clearly outside of the decompression range.

It is recommended when doing development to load and boot uImage files rather than linux files. The bootable U-Boot format includes compression while the ELF format does not. The time to decompress is typically smaller than the time to load a larger uncompressed file. With recent versions of U-Boot, booting a Linux ELF will not work properly anyways.

Standalone Application

Another common example is loading up the ELF image of a standalone U-Boot application:

bfin> tftp 0x1000000 smc91111_eeprom
SMC91111: MAC 00:e0:22:fe:05:3f
Using SMC91111-0 device
TFTP from server 192.168.0.2; our IP address is 192.168.0.15
Filename 'smc91111_eeprom'.
Load address: 0x1000000
Loading: ##
done
Bytes transferred = 17699 (4523 hex)
bfin> boote
Loading phdr 0 to 0x00001000 (2836 bytes)
## Starting application at 0x00001490 ...

SMC91111>
Here we loaded the smc91111_eeprom file into external memory at address 0x1000000. Then we proceeded to boot it. Keep in mind that the two memory regions cannot overlap. The memory region where U-Boot loads the ELF cannot overlap the memory region where the ELF loads and executes.