Ethernut Home Hardware Firmware Tools Download Community
 
Ethernuts  /  Ethernut 5  /  U-Boot Environment
Search | Legals | Deutsch

Ethernut 5 U-Boot Environment

Note

Before changing environment variables for saving in serial Flash, reboot the board first to make sure to start with a clean environment.

The command saveenv will store the current environment. This may result in unexpected problems, when other commands had been executed before. For example, the variable ipaddr may be set to dhcp, which instructs U-Boot to query an IP configuration from the local DHCP server prior to executing any network command. Once done, the variable ipaddr will then contain the local IP address, and, when saving this modified environment, the dhcp setting is gone. As a result, the board will always use the fixed IP address.

U-Boot is customizable by environment variables, which may contain scripts that are executed by the run command.

On the U-Boot command line enter

printenv

to display the current environment.

To create new environment variables or to modify existing ones, use

setenv name value

Note, that no equal sign is used here.

The command

saveenv

saves the current environment in serial Flash memory (DataFlash) at address offset 0x3DE000, from where it is reloaded during the next system start.

Factory Environment

In addition to the environment variables saved by saveenv, the serial Flash contains a factory default environment at address offset 0x021000. You can activate this environment by entering the command

run setfactory

U-Boot will load the environment image into SDRAM and apply it:

Loading...
## Executing script at 20000000
## Resetting to default environment
Enter MAC address and then execute 'saveenv' to store the new environment.
Please enter 'ethaddr':

You should now enter the MAC address of your board in the format

00:06:98:XX:YY:ZZ

where 00:06:98 is the organizational unique identifier (OUI) assigned to Ethernuts manufactured by egnite GmbH and XX:YY:ZZ is the unique part of the individual board. Each board manufactured by egnite do contain a label with this number. Other manufactures will use different OUIs and labeling. Alternatively you can use a locally assigned MAC address.

Note, that your previous environment will return, when rebooting the board now. To permanently store the new environment, use

saveenv

On virgin boards, the command setfactory will not be available. In this case enter the following commands to apply the factory default:

cp.b 0xC0021000 ${loadaddr} 0x21000
source ${loadaddr}
saveenv

However, this requires, that an environment image is available in the serial Flash. If not, refer to this page, which explains how to program your board with the Ethernut 5 flasher application.

You can also load the environment over TFTP:

dhcp
tftpboot ${loadaddr} 192.168.0.1:env-ethernut5.bin
source ${loadaddr}
saveenv

Replace 192.168.0.1 the TFTP-Server providing the environment.

Alternatively, you can set the environment by copying the following contents on the U-Boot command line:

env default -f -a
setenv bootcmd run flashbootlinux

setenv hostname ethernut
setenv ipaddr dhcp
setenv netdev eth0
setenv ntpserver de.pool.ntp.org
setenv timeoffset 3600

setenv env_image_name env-ethernut5.bin
setenv uboot_image_name u-boot-ethernut5.bin
setenv linux_image_name uImage-ethernut5.itb
setenv nut_image_name nutapp.bin
setenv rootfs_image_name ethernut5-image-ethernut5.jffs2

setenv nfsrootpath /srv/nut/

setenv env_flash_start 0xC0021000
setenv env_maxsize 0x21000
setenv uboot_flash_start 0xC0042000
setenv uboot_maxsize 0x84000
setenv linux_flash_start 0xC00C6000
setenv linux_maxsize 0x294000
setenv nut_flash_start 0xC035A000
setenv nut_maxsize 0x84000

setexpr env_flash_end ${env_flash_start} + ${env_maxsize} ; setexpr env_flash_end ${env_flash_end} - 1
setexpr uboot_flash_end ${uboot_flash_start} + ${uboot_maxsize} ; setexpr uboot_flash_end ${uboot_flash_end} - 1
setexpr linux_flash_end ${linux_flash_start} + ${linux_maxsize} ; setexpr linux_flash_end ${linux_flash_end} - 1
setexpr nut_flash_end ${nut_flash_start} + ${nut_maxsize} ; setexpr nut_flash_end ${nut_flash_end} - 1

setenv installenv run tftpinstallenv
setenv installuboot run tftpinstalluboot
setenv installlinux run tftpinstalllinux
setenv installnut run tftpinstallnut
setenv installrootfs run tftpinstallrootfs

setenv nfsbootlinux 'run powerup4linux select_linux load_nfs_image addip && bootm'
setenv tftpbootlinux 'run powerup4linux select_linux load_tftp_image addip && bootm'
setenv flashbootlinux 'run powerup4linux select_linux load_flash_image addip && bootm'

setenv nfsbootnut 'run netconf && nfs ${loadaddr} ${serverip}:${nfsrootpath}${nut_image_name} && go ${loadaddr}'
setenv tftpbootnut 'run select_nut load_tftp_image && go ${loadaddr}'
setenv flashbootnut 'cp.b ${nut_flash_start} ${loadaddr} ${nut_maxsize} && go ${loadaddr}'

setenv setfactory 'run select_env load_flash_image && source ${loadaddr}'
setenv powerup4linux 'pwrman on; sleep 2'
setenv powerup 'pwrman vbout mmc ethclk ethrst on ; sleep 1 ; pwrman ethrst off'
setenv powerdown 'pwrman off'
setenv poweroff 'pwrman board off'
setenv nettime 'run netconf && if test -z \\"${ntpserverip}\\"; then dns ${ntpserver} ntpserverip; else true; fi && sntp'

setenv settftpserver 'if test -z \\"${tftpserver}\\"; then setenv tftpserver ${serverip}; else true; fi'
setenv setnfsserver 'if test -z \\"${nfsserver}\\"; then setenv nfsserver ${serverip}; else true; fi'
setenv setntpserver 'if test -z \\"${ntpserver}\\"; then setenv ntpserver ${serverip}; else true; fi'
setenv netconf 'if test ${ipaddr} != off; then if test ${ipaddr} = dhcp || test -z \\"${ipaddr}\\"; then dhcp; else true; fi; fi && run settftpserver setnfsserver setntpserver'

setenv load_tftp_image 'run netconf && if test -z \\"${tftpserverip}\\"; then dns ${tftpserver} tftpserverip; else true; fi && tftpboot ${loadaddr} ${tftpserverip}:$image_name'
setenv load_nfs_image 'run netconf && if test -z \\"${nfsserverip}\\"; then dns ${nfsserver} nfsserverip; else true; fi && nfs ${loadaddr} ${nfsserverip}:${nfsrootpath}$image_name'

setenv load_flash_image 'echo Loading... ; cp.b $start ${loadaddr} ${filesize}'
setenv unprotect_flash_image 'protect off $start $end'
setenv protect_flash_image 'protect on $start $end'
setenv save_flash_image 'cp.b ${loadaddr} $start ${filesize}'
setenv save_protected_flash_image run unprotect_flash_image save_flash_image protect_flash_image

setenv select_env 'image_name=${env_image_name} ; start=${env_flash_start} ; end=${env_flash_end} ; setenv filesize ${env_maxsize}'
setenv select_uboot 'image_name=${uboot_image_name} ; start=${uboot_flash_start} ; end=${uboot_flash_end} ; setenv filesize ${uboot_maxsize}'
setenv select_linux 'image_name=${linux_image_name} ; start=${linux_flash_start} ; end=${linux_flash_end} ; setenv filesize ${linux_maxsize}'
setenv select_nut 'image_name=${nut_image_name} ; start=${nut_flash_start} ; end=${nut_flash_end} ; setenv filesize ${nut_maxsize}'

setenv nfsinstallenv 'run select_env load_nfs_image save_protected_flash_image'
setenv nfsinstalluboot 'run select_uboot load_nfs_image save_protected_flash_image'
setenv nfsinstalllinux 'run select_linux load_nfs_image save_protected_flash_image'
setenv nfsinstallnut 'run select_nut load_nfs_image save_protected_flash_image'

setenv tftpinstallenv 'run select_env load_tftp_image save_protected_flash_image'
setenv tftpinstalluboot 'run select_uboot load_tftp_image save_protected_flash_image'
setenv tftpinstalllinux 'run select_linux load_tftp_image save_protected_flash_image'
setenv tftpinstallnut 'run select_nut load_tftp_image save_protected_flash_image'
setenv tftpinstallrootfs 'nand erase.part clean root && image_name=${rootfs_image_name} ; run load_tftp_image && nand write ${loadaddr} ${partition} ${filesize}'

setenv bootargs_ram setenv bootargs root=/dev/ram rw
setenv bootargs_nfs 'setenv bootargs root=/dev/nfs rw nfsroot=${serverip}:${nfsrootpath}'
setenv bootargs_mtd setenv bootargs root=/dev/mtdblock6 rw rootfstype=jffs2

setenv addip 'if test -z \\"${ipaddr}\\" ; then setenv ipaddr dhcp ; fi; if test ${ipaddr} = off || test ${ipaddr} = dhcp ; then setenv bootargs ${bootargs} ip=${ipaddr} panic=1; else run addfixedip; fi'
setenv addfixedip 'setenv bootargs ${bootargs} ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off panic=1'
setenv enable_nfs 'dhcp && dns ${nfsserver} nfsserverip && setenv bootargs root=/dev/nfs rw nfsroot=${nfsserverip}:/srv/nut ip=${ipaddr}:${serverip}:${gatewayip}:${netmask}:${hostname}:${netdev}:off'

setenv ram_root 'run bootargs_ram addip;bootm ${linux_addr} ${ramdisk_addr} ${fdt_addr}'
setenv nfs_root 'run bootargs_nfs addip;bootm ${linux_addr} - ${fdt_addr}'

mtdparts default

echo Enter MAC address and then execute \'saveenv\' to store the new environment.
askenv ethaddr 17

If copied in one go, this may fail, because the lines are sent too fast for U-Boot. Either use a slower baudrate or add a line delay in your terminal emulator configuration. When using TeraTerm, select Setup -> Serial Port form the main menu and specify a transmit delay of 100 ms per line.

Booting Nut/OS Applications

This chapter assumes, that you are familiar with building Nut/OS applications. If not, please refer to the Nut/OS Software Manual.

Nut/OS applications for Ethernut 5 are typically compiled for running in SDRAM. During the development phase it is most convenient to load them over Ethernet, using TFTP. This requires to install a TFTP server on your PC. While ready-to-run packages are available for Linux, we recommend TFTPD32 for Windows PCs.

For building your Nut/OS application, use

make clean all install

This will copy the final binary to nut/bin/arm9. If you prefer a different location, add the following line to UserConf.mk in your sample (application) directory:

BINDIR = path/to/my/tftp/upload/directory

To load and start the application, enter

setenv nut_image_name appname.bin
run tftpbootnut

on the U-Boot command line, replacing appname by the name of the application, e.g. events. To avoid entering these commands over and over again, you can change the default environment. Reboot the board first, to make sure that the environment is unmodified by U-Boot. Then enter

setenv nut_image_name appname.bin
setenv bootcmd run tftpbootnut
saveenv

Now the application will be automatically loaded and started each time you press the Ethernut 5 reset button. Quite convenient, isn't it?

When your application is stable, you can store it in serial Flash memory, using

run installnut
setenv bootcmd run flashbootnut
saveenv

Again, these commands should be entered immediately after booting the board.

Updating Images

U-Boot can be used to update all images, which are stored in the serial Flash. The factory default environment provides command to load the images from TFTP or NFS, but you could also load them from a SD-Card or an USB-Stick.

If you want to load them over TFTP, you first need to tell U-Boot the IP-Address of the TFTP-Server:

setenv tftpserverip 192.168.0.1
saveenv

Replace 192.168.0.1 with the IP of your TFTP-Server.

All commands prefixed with tftpinstall are used to load the image over TFTP and save them into the serial Flash. To update U-Boot itself you can use the following command:

run tftpinstalluboot

The other images can be installed with the following commands:

run tftpinstallenv
run tftpinstalllinux
run tftpinstallnut
run tftpinstallrootfs

Note, that tftpinstallenv does not activate the installed environment. This can be done with run setfactory as seen above.

Booting Linux

If you have installed all images and the factory default environment is activated, Linux will boot automatically. You can also use the following command to load the Linux Kernel from the Flash and start it:

run flashbootlinux

If the Kernel is located on a TFTP-Server, you can also boot Linux without saving the image to the Flash:

run tftpbootlinux

When started U-Boot will run the bootcmd, which defaults to flashbootlinux. If you always want to load Linux over TFTP you can change bootcmd:

setenv bootcmd run tftpbootlinux
saveenv

The U-Boot environment variable bootargs is used to tell Linux how to boot. It defaults to

bootargs=console=ttyS0,115200 root=/dev/mtdblock0 mtdparts=atmel_nand:128m(root),896m(data) rw rootfstype=jffs2

The option root=/dev/mtdblock0 tells Linux that the root filesystem is in the NAND Flash. It can be modified to support a root filesystem on a SD-Card, an USB-Stick or a NFS-Share.


Enjoy!

Castrop-Rauxel, 5th of July 2011.