TFTP Boot using u-boot

I was fiddling around with my newly purchased Beaglebone and wanted to get my hands dirty with kernel hacking and stuff. Since beaglebone is hard-wired to boot off an SD card I found it tedious to shuttle the card between my development laptop and the board.
===================
Enter TFTP boot.
===================
This is a very handy way of booting when you need to recompile your kernel repeatedly and inserting/removing the card from/to board becomes a tedious process. For those who wanted to try out this fantastic way of booting, here is my short howto:

Before I begin, here is snapshot of my development platform:
Host machine: am64 lubuntu 12.10
Tftp software: tftp-hpa 5.2 [client and server]
U-boot: 2013.01-dirty

===========================================================
To install, run: sudo apt-get install tftpd-hpa tftp-hpa
===========================================================

Before we begin, we need to configure the tftpd’s configuration file so edit:
————————————————–

sudo vim /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="your-ftp-root-directory"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

————————————————–
After that restart the daemon: sudo service tftpd restart
Now that the server has been setup in our host machine, we may now concentrate on the target system.
Note: The SD card containing MLO and u-boot should always be present in the beaglebone’s slot.
Power up the board and and get to the u-boot prompt:
———————————————————————————————————-

U-Boot 2013.01-dirty (Jan 16 2013 - 15:36:41)
I2C: ready
DRAM: 256 MiB
WARNING: Caches not enabled
NAND: No NAND device found!!!
0 MiB
MMC: OMAP SD/MMC: 0, OMAP SD/MMC: 1
*** Warning - readenv() failed, using default environment

musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Peripheral mode controller at 47401000 using PIO, IRQ 0
musb-hdrc: ConfigData=0xde (UTMI-8, dyn FIFOs, bulk combine, bulk split, HB-ISO Rx, HB-ISO Tx, SoftConn)
musb-hdrc: MHDRC RTL version 2.0
musb-hdrc: setup fifo_mode 4
musb-hdrc: 28/31 max ep, 16384/16384 memory
USB Host mode controller at 47401800 using PIO, IRQ 0
Net: cpsw, usb_ether
Hit any key to stop autoboot: 0
U-Boot#

———————————————————————————————————-
Make sure that ethernet cable is plugged into the board and a dhcp server is running in either your host machine or your router.
———————————————————————————————————-

U-Boot# setenv autoload no
U-Boot# dhcp
link up on port 0, speed 100, full duplex
BOOTP broadcast 1
DHCP client bound to address 192.168.1.11

———————————————————————————————————-
Next will be configuring the server-ip [our host machine’s IP], kernel’s command line and the load address
———————————————————————————————————-

U-Boot# setenv serverip 192.168.1.4
U-Boot# setenv bootfile uImage
U-Boot# setenv bootargs console=ttyO0,115200 root=/dev/mmcblk0p2 rw rootwait ip=dhcp
U-Boot# tftp 0x80200000 uImage
link up on port 0, speed 100, full duplex
Using cpsw device
TFTP from server 192.168.1.4; our IP address is 192.168.1.11
Filename 'uImage'.
Load address: 0x80200000
Loading: #################################################################
#####################################################T ############
##########################################T #######################
###################################T ########
146.5 KiB/s
done
Bytes transferred = 3484264 (352a68 hex)
U-Boot# bootm 0x80200000
## Booting kernel from Legacy Image at 80200000 ...
Image Name: Angstrom/3.2.28/beaglebone
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 3484200 Bytes = 3.3 MiB
Load Address: 80008000
Entry Point: 80008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.2.28 (koen@Angstrom-F16-vm-rpm) (gcc version 4.5.4 20120305 (prerelease) (GCC) ) #1 Tue Sep 11 13:08:30 CEST 2012
[ 0.000000] CPU: ARMv7 Processor [413fc082] revision 2 (ARMv7), cr=50c53c7d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
[ 0.000000] Machine: am335xevm

———————————————————————————————————-
And voila! It boots!!!!

15 Comments

  1. Awesome mate. Got to try this. One doubt though. How to you tell the TFTP server as to what image it must pick up and whereabouts of the image in the host machine ? Does TFTP server do a full system look up based on the filename alone? Or is there is specific location the uImage must be kept in order that the server simply loads it?

    Reply

    1. When you edit the file “/etc/defaults/tftpd-hpa”, you tell the daemon about its root directory.
      TFTP_DIRECTORY=”your-ftp-root-directory”
      Then all you need is to put your ‘uImage’ in that directory and “instruct” u-boot to load a file “U-Boot# setenv bootfile uImage”.
      Then, when you run “U-Boot# tftp 0x80200000 uImage”, it requests from the tftp server for the file ‘uImage’, downloads it and loads it to the load-address supplied (0x80200000 in this case).

      Reply

      1. Got it :). Besides. There was a time when I had to something similar. I used SCP the binary from host to /boot (SD card) and issue a reboot command. Another alternative. It’d be nice to compare these methods.

      2. Really? I didn’t know about this association of windows to SCP. I thought SCP was secure copy protocol and WinScp is the windows implementation of it. I used SCP with Red hat on Host and windriver on target. However TFTP is very popular and deserves to be. TFTP is built to boot. While SCP is a generic protocol to copy files from between nodes on a network.

  2. Excellent note! One question please, the received image is stored in the uSD and then it boots, or is stored in RAM and boots from it?.
    After 30 days or so, my uSD on the BB starts to fail and I have to download the image again, I guess that booting from LAN would will save me those problems. I’m right?
    Thanks for your time!

    Reply

    1. Hello Guilles,

      Thank you. The BB is not a XIP (execute in place) device. So, the kernel must be downloaded to its DDR (RAM) and execute from there. I am not sure why your BB fails to boot after 30 days or so but taking a guess I’d like you to check if you have magnetic material near your SD card. As always, booting from LAN is quite convenient for me and I hope you’d benefit from it too!

      Contact me if you need more help.

      -Jeet

      Reply

  3. Hello

    FIrst thanks it is a great tutorial but still i have Q: after i successfully executed the kernel when i reboot the bbb the old kernel return what iam missing ??

    Reply

  4. Thanks for the great tutorial , is there a way to set up sd card with rootfs over tftp for the very first time, if we have to set up boards all at once

    Reply

  5. I am trying to convert the image I donwloaded from the BeagleBone website to a uImage format to transfer it over TFTP. Any thoughts on how I could go about it?

    Reply

Leave a comment