Skip to content
Snippets Groups Projects
README 180 KiB
Newer Older
  • Learn to ignore specific revisions
  •   bootm_low	- Memory range available for image processing in the bootm
    		  command can be restricted. This variable is given as
    		  a hexadecimal number and defines lowest address allowed
    		  for use by the bootm command. See also "bootm_size"
    		  environment variable. Address defined by "bootm_low" is
    		  also the base of the initial memory mapping for the Linux
    
    		  kernel -- see the description of CONFIG_SYS_BOOTMAPSZ and
    		  bootm_mapsize.
    
    
      bootm_mapsize - Size of the initial memory mapping for the Linux kernel.
    
    		  This variable is given as a hexadecimal number and it
    		  defines the size of the memory region starting at base
    		  address bootm_low that is accessible by the Linux kernel
    		  during early boot.  If unset, CONFIG_SYS_BOOTMAPSZ is used
    		  as the default value if it is defined, and bootm_size is
    		  used otherwise.
    
    
      bootm_size	- Memory range available for image processing in the bootm
    		  command can be restricted. This variable is given as
    		  a hexadecimal number and defines the size of the region
    		  allowed for use by the bootm command. See also "bootm_low"
    		  environment variable.
    
    
      updatefile	- Location of the software update file on a TFTP server, used
    		  by the automatic software update feature. Please refer to
    		  documentation in doc/README.update for more details.
    
    
      autoload	- if set to "no" (any string beginning with 'n'),
    		  "bootp" will just load perform a lookup of the
    		  configuration from the BOOTP server, but not try to
    		  load any image using TFTP
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      autostart	- if set to "yes", an image loaded using the "bootp",
    		  "rarpboot", "tftpboot" or "diskboot" commands will
    		  be automatically started (by internally calling
    		  "bootm")
    
    		  If set to "no", a standalone image passed to the
    		  "bootm" command will be copied to the load address
    		  (and eventually uncompressed), but NOT be started.
    		  This can be used to load and uncompress arbitrary
    		  data.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      fdt_high	- if set this restricts the maximum address that the
    		  flattened device tree will be copied into upon boot.
    
    		  For example, if you have a system with 1 GB memory
    		  at physical address 0x10000000, while Linux kernel
    		  only recognizes the first 704 MB as low memory, you
    		  may need to set fdt_high as 0x3C000000 to have the
    		  device tree blob be copied to the maximum address
    		  of the 704 MB low memory, so that Linux kernel can
    		  access it during the boot procedure.
    
    
    		  If this is set to the special value 0xFFFFFFFF then
    		  the fdt will not be copied at all on boot.  For this
    		  to work it must reside in writable memory, have
    		  sufficient padding on the end of it for u-boot to
    		  add the information it needs into it, and the memory
    		  must be accessible by the kernel.
    
    
      fdtcontroladdr- if set this is the address of the control flattened
    		  device tree used by U-Boot when CONFIG_OF_CONTROL is
    		  defined.
    
    
      i2cfast	- (PPC405GP|PPC405EP only)
    		  if set to 'y' configures Linux I2C driver for fast
    		  mode (400kHZ). This environment variable is used in
    		  initialization code. So, for changes to be effective
    		  it must be saved and board must be reset.
    
    
      initrd_high	- restrict positioning of initrd images:
    		  If this variable is not set, initrd images will be
    		  copied to the highest possible address in RAM; this
    		  is usually what you want since it allows for
    		  maximum initrd size. If for some reason you want to
    		  make sure that the initrd image is loaded below the
    
    		  CONFIG_SYS_BOOTMAPSZ limit, you can set this environment
    
    		  variable to a value of "no" or "off" or "0".
    		  Alternatively, you can set it to a maximum upper
    		  address to use (U-Boot will still check that it
    		  does not overwrite the U-Boot stack and data).
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    		  For instance, when you have a system with 16 MB
    		  RAM, and want to reserve 4 MB from use by Linux,
    		  you can do this by adding "mem=12M" to the value of
    		  the "bootargs" variable. However, now you must make
    		  sure that the initrd image is placed in the first
    		  12 MB as well - this can be done with
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    		  setenv initrd_high 00c00000
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    		  If you set initrd_high to 0xFFFFFFFF, this is an
    		  indication to U-Boot that all addresses are legal
    		  for the Linux kernel, including addresses in flash
    		  memory. In this case U-Boot will NOT COPY the
    		  ramdisk at all. This may be useful to reduce the
    		  boot time on your system, but requires that this
    		  feature is supported by your Linux kernel.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      ipaddr	- IP address; needed for tftpboot command
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      loadaddr	- Default load address for commands like "bootp",
    		  "rarpboot", "tftpboot", "loadb" or "diskboot"
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      loads_echo	- see CONFIG_LOADS_ECHO
    
      serverip	- TFTP server IP address; needed for tftpboot command
    
      bootretry	- see CONFIG_BOOT_RETRY_TIME
    
      bootdelaykey	- see CONFIG_AUTOBOOT_DELAY_STR
    
      bootstopkey	- see CONFIG_AUTOBOOT_STOP_STR
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      ethprime	- controls which interface is used first.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      ethact	- controls which interface is currently active.
    		  For example you can do the following
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    		  => setenv ethact FEC
    		  => ping 192.168.0.1 # traffic sent on FEC
    		  => setenv ethact SCC
    		  => ping 10.0.0.1 # traffic sent on SCC
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      ethrotate	- When set to "no" U-Boot does not go through all
    		  available network interfaces.
    		  It just stays at the currently selected interface.
    
    
      netretry	- When set to "no" each network operation will
    
    		  either succeed or fail without retrying.
    		  When set to "once" the network operation will
    		  fail when all the available network interfaces
    		  are tried once without success.
    		  Useful on scripts which control the retry operation
    		  themselves.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      npe_ucode	- set load address for the NPE microcode
    
      tftpsrcport	- If this is set, the value is used for TFTP's
    
      tftpdstport	- If this is set, the value is used for TFTP's UDP
    		  destination port instead of the Well Know Port 69.
    
    
      tftpblocksize - Block size to use for TFTP transfers; if not set,
    		  we use the TFTP server's default block size
    
      tftptimeout	- Retransmission timeout for TFTP packets (in milli-
    		  seconds, minimum value is 1000 = 1 second). Defines
    		  when a packet is considered to be lost so it has to
    		  be retransmitted. The default is 5000 = 5 seconds.
    		  Lowering this value may make downloads succeed
    		  faster in networks with high packet loss rates or
    		  with unreliable TFTP servers.
    
      vlan		- When set to a value < 4095 the traffic over
    
    		  Ethernet is encapsulated/received over 802.1q
    
    		  VLAN tagged frames.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    The following image location variables contain the location of images
    used in booting. The "Image" column gives the role of the image and is
    not an environment variable name. The other columns are environment
    variable names. "File Name" gives the name of the file on a TFTP
    server, "RAM Address" gives the location in RAM the image will be
    loaded to, and "Flash Location" gives the image's address in NOR
    flash or offset in NAND flash.
    
    *Note* - these variables don't have to be defined for all boards, some
    boards currenlty use other variables for these purposes, and some
    boards use these variables for other purposes.
    
    
    Image		    File Name	     RAM Address       Flash Location
    -----		    ---------	     -----------       --------------
    u-boot		    u-boot	     u-boot_addr_r     u-boot_addr
    Linux kernel	    bootfile	     kernel_addr_r     kernel_addr
    device tree blob    fdtfile	     fdt_addr_r	       fdt_addr
    ramdisk		    ramdiskfile	     ramdisk_addr_r    ramdisk_addr
    
    The following environment variables may be used and automatically
    updated by the network boot commands ("bootp" and "rarpboot"),
    depending the information provided by your boot server:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
      bootfile	- see above
      dnsip		- IP address of your Domain Name Server
      dnsip2	- IP address of your secondary Domain Name Server
      gatewayip	- IP address of the Gateway (Router) to use
      hostname	- Target hostname
      ipaddr	- see above
      netmask	- Subnet Mask
      rootpath	- Pathname of the root filesystem on the NFS server
      serverip	- see above
    
    There are two special Environment Variables:
    
      serial#	- contains hardware identification information such
    		  as type string and/or serial number
      ethaddr	- Ethernet address
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    These variables can be set only once (usually during manufacturing of
    the board). U-Boot refuses to delete or overwrite these variables
    once they have been set once.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Further special Environment Variables:
    
      ver		- Contains the U-Boot version string as printed
    		  with the "version" command. This variable is
    		  readonly (see CONFIG_VERSION_VARIABLE).
    
    Please note that changes to some configuration parameters may take
    only effect after the next boot (yes, that's just like Windoze :-).
    
    Command Line Parsing:
    =====================
    
    There are two different command line parsers available with U-Boot:
    the old "simple" one, and the much more powerful "hush" shell:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Old, simple command line parser:
    --------------------------------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    - supports environment variables (through setenv / saveenv commands)
    - several commands on one line, separated by ';'
    
    - variable substitution using "... ${name} ..." syntax
    
    - special characters ('$', ';') can be escaped by prefixing with '\',
      for example:
    
    	setenv bootcmd bootm \${address}
    
    - You can also escape text by enclosing in single apostrophes, for example:
    	setenv addip 'setenv bootargs $bootargs ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname::off'
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Hush shell:
    -----------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    - similar to Bourne shell, with control structures like
      if...then...else...fi, for...do...done; while...do...done,
      until...do...done, ...
    - supports environment ("global") variables (through setenv / saveenv
      commands) and local shell variables (through standard shell syntax
      "name=value"); only environment variables can be used with "run"
      command
    
    General rules:
    --------------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    (1) If a command line (or an environment variable executed by a "run"
        command) contains several commands separated by semicolon, and
        one of these commands fails, then the remaining commands will be
        executed anyway.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    (2) If you execute several variables with one call to run (i. e.
    
        calling run with a list of variables as arguments), any failing
    
        command will cause "run" to terminate, i. e. the remaining
        variables are not executed.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Note for Redundant Ethernet Interfaces:
    =======================================
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Some boards come with redundant Ethernet interfaces; U-Boot supports
    
    such configurations and is capable of automatic selection of a
    "working" interface when needed. MAC assignment works as follows:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Network interfaces are numbered eth0, eth1, eth2, ... Corresponding
    MAC addresses can be stored in the environment as "ethaddr" (=>eth0),
    "eth1addr" (=>eth1), "eth2addr", ...
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    If the network interface stores some valid MAC address (for instance
    in SROM), this is used as default address if there is NO correspon-
    ding setting in the environment; if the corresponding environment
    variable is set, this overrides the settings in the card; that means:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    o If the SROM has a valid MAC address, and there is no address in the
      environment, the SROM's address is used.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    o If there is no valid address in the SROM, and a definition in the
      environment exists, then the value from the environment variable is
      used.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    o If both the SROM and the environment contain a MAC address, and
      both addresses are the same, this MAC address is used.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    o If both the SROM and the environment contain a MAC address, and the
      addresses differ, the value from the environment is used and a
      warning is printed.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    o If neither SROM nor the environment contain a MAC address, an error
      is raised.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    If Ethernet drivers implement the 'write_hwaddr' function, valid MAC addresses
    
    will be programmed into hardware as part of the initialization process.	 This
    
    may be skipped by setting the appropriate 'ethmacskip' environment variable.
    The naming convention is as follows:
    "ethmacskip" (=>eth0), "eth1macskip" (=>eth1) etc.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Image Formats:
    ==============
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    U-Boot is capable of booting (and performing other auxiliary operations on)
    images in two formats:
    
    New uImage format (FIT)
    -----------------------
    
    Flexible and powerful format based on Flattened Image Tree -- FIT (similar
    to Flattened Device Tree). It allows the use of images with multiple
    components (several kernels, ramdisks, etc.), with contents protected by
    SHA1, MD5 or CRC32. More details are found in the doc/uImage.FIT directory.
    
    
    Old uImage format
    -----------------
    
    Old image format is based on binary files which can be basically anything,
    preceded by a special header; see the definitions in include/image.h for
    details; basically, the header defines the following image properties:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    * Target Operating System (Provisions for OpenBSD, NetBSD, FreeBSD,
      4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks,
    
      LynxOS, pSOS, QNX, RTEMS, INTEGRITY;
      Currently supported: Linux, NetBSD, VxWorks, QNX, RTEMS, LynxOS,
      INTEGRITY).
    
    * Target CPU Architecture (Provisions for Alpha, ARM, AVR32, Intel x86,
    
      IA64, MIPS, NDS32, Nios II, PowerPC, IBM S390, SuperH, Sparc, Sparc 64 Bit;
      Currently supported: ARM, AVR32, Intel x86, MIPS, NDS32, Nios II, PowerPC).
    
    * Compression Type (uncompressed, gzip, bzip2)
    * Load Address
    * Entry Point
    * Image Name
    * Image Timestamp
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    The header is marked by a special Magic Number, and both the header
    and the data portions of the image are secured against corruption by
    CRC32 checksums.
    
    Linux Support:
    ==============
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Although U-Boot should support any OS or standalone application
    easily, the main focus has always been on Linux during the design of
    U-Boot.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    U-Boot includes many features that so far have been part of some
    special "boot loader" code within the Linux kernel. Also, any
    "initrd" images to be used are no longer part of one big Linux image;
    instead, kernel and "initrd" are separate images. This implementation
    serves several purposes:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    - the same features can be used for other OS or standalone
      applications (for instance: using compressed images to reduce the
      Flash memory footprint)
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    - it becomes much easier to port new Linux kernel versions because
      lots of low-level, hardware dependent stuff are done by U-Boot
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    - the same Linux kernel image can now be used with different "initrd"
      images; of course this also means that different kernel images can
      be run with the same "initrd". This makes testing easier (you don't
      have to build a new "zImage.initrd" Linux image when you just
      change a file in your "initrd"). Also, a field-upgrade of the
      software is easier now.
    
    Linux HOWTO:
    ============
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Porting Linux to U-Boot based systems:
    ---------------------------------------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    U-Boot cannot save you from doing all the necessary modifications to
    configure the Linux device drivers for use with your target hardware
    (no, we don't intend to provide a full virtual machine interface to
    Linux :-).
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    But now you can ignore ALL boot loader code (in arch/powerpc/mbxboot).
    
    Just make sure your machine specific header file (for instance
    include/asm-ppc/tqm8xx.h) includes the same definition of the Board
    
    Information structure as we define in include/asm-<arch>/u-boot.h,
    and make sure that your definition of IMAP_ADDR uses the same value
    
    as your U-Boot configuration in CONFIG_SYS_IMMR.
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    Configuring the Linux kernel:
    -----------------------------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    No specific requirements for U-Boot. Make sure you have some root
    device (initial ramdisk, NFS) for your target system.
    
    
    Building a Linux Image:
    -----------------------
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    With U-Boot, "normal" build targets like "zImage" or "bzImage" are
    not used. If you use recent kernel source, a new build target
    "uImage" will exist which automatically builds an image usable by
    U-Boot. Most older kernels also have support for a "pImage" target,
    which was introduced for our predecessor project PPCBoot and uses a
    100% compatible format.
    
    Example:
    
    	make TQM850L_config
    	make oldconfig
    	make dep
    	make uImage
    
    The "uImage" build target uses a special tool (in 'tools/mkimage') to
    encapsulate a compressed Linux kernel image with header	 information,
    CRC32 checksum etc. for use with U-Boot. This is what we are doing:
    
    * build a standard "vmlinux" kernel image (in ELF binary format):
    
    * convert the kernel into a raw binary image:
    
    	${CROSS_COMPILE}-objcopy -O binary \
    				 -R .note -R .comment \
    				 -S vmlinux linux.bin
    
    * compress the binary image:
    
    	gzip -9 linux.bin
    
    * package compressed binary image for U-Boot:
    
    	mkimage -A ppc -O linux -T kernel -C gzip \
    		-a 0 -e 0 -n "Linux Kernel Image" \
    		-d linux.bin.gz uImage
    
    The "mkimage" tool can also be used to create ramdisk images for use
    with U-Boot, either separated from the Linux kernel image, or
    combined into one file. "mkimage" encapsulates the images with a 64
    byte header containing information about target architecture,
    operating system, image type, compression method, entry points, time
    stamp, CRC32 checksums, etc.
    
    "mkimage" can be called in two ways: to verify existing images and
    print the header information, or to build new images.
    
    In the first form (with "-l" option) mkimage lists the information
    contained in the header of an existing U-Boot image; this includes
    checksum verification:
    
    Wolfgang Denk's avatar
    Wolfgang Denk committed
    
    
    	tools/mkimage -l image
    	  -l ==> list image header information
    
    The second form (with "-d" option) is used to build a U-Boot image
    from a "data file" which is used as image payload:
    
    	tools/mkimage -A arch -O os -T type -C comp -a addr -e ep \
    		      -n name -d data_file image
    	  -A ==> set architecture to 'arch'
    	  -O ==> set operating system to 'os'
    	  -T ==> set image type to 'type'
    	  -C ==> set compression type 'comp'
    	  -a ==> set load address to 'addr' (hex)
    	  -e ==> set entry point to 'ep' (hex)
    	  -n ==> set image name to 'name'
    	  -d ==> use image data from 'datafile'
    
    
    Right now, all Linux kernels for PowerPC systems use the same load
    address (0x00000000), but the entry point address depends on the
    kernel version:
    
    
    - 2.2.x kernels have the entry point at 0x0000000C,
    - 2.3.x and later kernels have the entry point at 0x00000000.
    
    So a typical call to build a U-Boot image would read:
    
    	-> tools/mkimage -n '2.4.4 kernel for TQM850L' \
    	> -A ppc -O linux -T kernel -C gzip -a 0 -e 0 \
    
    	> -d /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux.gz \
    
    	> examples/uImage.TQM850L
    	Image Name:   2.4.4 kernel for TQM850L
    	Created:      Wed Jul 19 02:34:59 2000
    	Image Type:   PowerPC Linux Kernel Image (gzip compressed)
    	Data Size:    335725 Bytes = 327.86 kB = 0.32 MB
    	Load Address: 0x00000000
    	Entry Point:  0x00000000
    
    To verify the contents of the image (or check for corruption):
    
    	-> tools/mkimage -l examples/uImage.TQM850L
    	Image Name:   2.4.4 kernel for TQM850L
    	Created:      Wed Jul 19 02:34:59 2000
    	Image Type:   PowerPC Linux Kernel Image (gzip compressed)
    	Data Size:    335725 Bytes = 327.86 kB = 0.32 MB
    	Load Address: 0x00000000
    	Entry Point:  0x00000000
    
    NOTE: for embedded systems where boot time is critical you can trade
    speed for memory and install an UNCOMPRESSED image instead: this
    needs more space in Flash, but boots much faster since it does not
    need to be uncompressed:
    
    
    	-> gunzip /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux.gz
    
    	-> tools/mkimage -n '2.4.4 kernel for TQM850L' \
    	> -A ppc -O linux -T kernel -C none -a 0 -e 0 \
    
    	> -d /opt/elsk/ppc_8xx/usr/src/linux-2.4.4/arch/powerpc/coffboot/vmlinux \
    
    	> examples/uImage.TQM850L-uncompressed
    	Image Name:   2.4.4 kernel for TQM850L
    	Created:      Wed Jul 19 02:34:59 2000
    	Image Type:   PowerPC Linux Kernel Image (uncompressed)
    	Data Size:    792160 Bytes = 773.59 kB = 0.76 MB
    	Load Address: 0x00000000
    	Entry Point:  0x00000000
    
    
    Similar you can build U-Boot images from a 'ramdisk.image.gz' file
    when your kernel is intended to use an initial ramdisk:
    
    	-> tools/mkimage -n 'Simple Ramdisk Image' \
    	> -A ppc -O linux -T ramdisk -C gzip \
    	> -d /LinuxPPC/images/SIMPLE-ramdisk.image.gz examples/simple-initrd
    	Image Name:   Simple Ramdisk Image
    	Created:      Wed Jan 12 14:01:50 2000
    	Image Type:   PowerPC Linux RAMDisk Image (gzip compressed)
    	Data Size:    566530 Bytes = 553.25 kB = 0.54 MB
    	Load Address: 0x00000000
    	Entry Point:  0x00000000
    
    
    Installing a Linux Image:
    -------------------------
    
    To downloading a U-Boot image over the serial (console) interface,
    you must convert the image to S-Record format:
    
    	objcopy -I binary -O srec examples/image examples/image.srec
    
    The 'objcopy' does not understand the information in the U-Boot
    image header, so the resulting S-Record file will be relative to
    address 0x00000000. To load it to a given address, you need to
    specify the target address as 'offset' parameter with the 'loads'
    command.
    
    Example: install the image to address 0x40100000 (which on the
    TQM8xxL is in the first Flash bank):
    
    	=> erase 40100000 401FFFFF
    
    	.......... done
    	Erased 8 sectors
    
    	=> loads 40100000
    	## Ready for S-Record download ...
    	~>examples/image.srec
    	1 2 3 4 5 6 7 8 9 10 11 12 13 ...
    	...
    	15989 15990 15991 15992
    	[file transfer complete]
    	[connected]
    	## Start Addr = 0x00000000
    
    
    You can check the success of the download using the 'iminfo' command;
    
    this includes a checksum verification so you can be sure no data
    
    corruption happened:
    
    	=> imi 40100000
    
    	## Checking Image at 40100000 ...
    	   Image Name:	 2.2.13 for initrd on TQM850L
    	   Image Type:	 PowerPC Linux Kernel Image (gzip compressed)
    	   Data Size:	 335725 Bytes = 327 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 0000000c
    	   Verifying Checksum ... OK
    
    
    Boot Linux:
    -----------
    
    The "bootm" command is used to boot an application that is stored in
    memory (RAM or Flash). In case of a Linux kernel image, the contents
    of the "bootargs" environment variable is passed to the kernel as
    parameters. You can check and modify this variable using the
    "printenv" and "setenv" commands:
    
    
    	=> printenv bootargs
    	bootargs=root=/dev/ram
    
    	=> setenv bootargs root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2
    
    	=> printenv bootargs
    	bootargs=root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2
    
    	=> bootm 40020000
    	## Booting Linux kernel at 40020000 ...
    	   Image Name:	 2.2.13 for NFS on TQM850L
    	   Image Type:	 PowerPC Linux Kernel Image (gzip compressed)
    	   Data Size:	 381681 Bytes = 372 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 0000000c
    	   Verifying Checksum ... OK
    	   Uncompressing Kernel Image ... OK
    	Linux version 2.2.13 (wd@denx.local.net) (gcc version 2.95.2 19991024 (release)) #1 Wed Jul 19 02:35:17 MEST 2000
    	Boot arguments: root=/dev/nfs rw nfsroot=10.0.0.2:/LinuxPPC nfsaddrs=10.0.0.99:10.0.0.2
    	time_init: decrementer frequency = 187500000/60
    	Calibrating delay loop... 49.77 BogoMIPS
    	Memory: 15208k available (700k kernel code, 444k data, 32k init) [c0000000,c1000000]
    	...
    
    
    If you want to boot a Linux kernel with initial RAM disk, you pass
    
    the memory addresses of both the kernel and the initrd image (PPBCOOT
    format!) to the "bootm" command:
    
    	=> imi 40100000 40200000
    
    	## Checking Image at 40100000 ...
    	   Image Name:	 2.2.13 for initrd on TQM850L
    	   Image Type:	 PowerPC Linux Kernel Image (gzip compressed)
    	   Data Size:	 335725 Bytes = 327 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 0000000c
    	   Verifying Checksum ... OK
    
    	## Checking Image at 40200000 ...
    	   Image Name:	 Simple Ramdisk Image
    	   Image Type:	 PowerPC Linux RAMDisk Image (gzip compressed)
    	   Data Size:	 566530 Bytes = 553 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 00000000
    	   Verifying Checksum ... OK
    
    	=> bootm 40100000 40200000
    	## Booting Linux kernel at 40100000 ...
    	   Image Name:	 2.2.13 for initrd on TQM850L
    	   Image Type:	 PowerPC Linux Kernel Image (gzip compressed)
    	   Data Size:	 335725 Bytes = 327 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 0000000c
    	   Verifying Checksum ... OK
    	   Uncompressing Kernel Image ... OK
    	## Loading RAMDisk Image at 40200000 ...
    	   Image Name:	 Simple Ramdisk Image
    	   Image Type:	 PowerPC Linux RAMDisk Image (gzip compressed)
    	   Data Size:	 566530 Bytes = 553 kB = 0 MB
    	   Load Address: 00000000
    	   Entry Point:	 00000000
    	   Verifying Checksum ... OK
    	   Loading Ramdisk ... OK
    	Linux version 2.2.13 (wd@denx.local.net) (gcc version 2.95.2 19991024 (release)) #1 Wed Jul 19 02:32:08 MEST 2000
    	Boot arguments: root=/dev/ram
    	time_init: decrementer frequency = 187500000/60
    	Calibrating delay loop... 49.77 BogoMIPS
    	...
    	RAMDISK: Compressed image found at block 0
    	VFS: Mounted root (ext2 filesystem).
    
    	bash#
    
    
    Boot Linux and pass a flat device tree:
    -----------
    
    First, U-Boot must be compiled with the appropriate defines. See the section
    titled "Linux Kernel Interface" above for a more in depth explanation. The
    following is an example of how to start a kernel and pass an updated
    flat device tree:
    
    => print oftaddr
    oftaddr=0x300000
    => print oft
    oft=oftrees/mpc8540ads.dtb
    => tftp $oftaddr $oft
    Speed: 1000, full duplex
    Using TSEC0 device
    TFTP from server 192.168.1.1; our IP address is 192.168.1.101
    Filename 'oftrees/mpc8540ads.dtb'.
    Load address: 0x300000
    Loading: #
    done
    Bytes transferred = 4106 (100a hex)
    => tftp $loadaddr $bootfile
    Speed: 1000, full duplex
    Using TSEC0 device
    TFTP from server 192.168.1.1; our IP address is 192.168.1.2
    Filename 'uImage'.
    Load address: 0x200000
    Loading:############
    done
    Bytes transferred = 1029407 (fb51f hex)
    => print loadaddr
    loadaddr=200000
    => print oftaddr
    oftaddr=0x300000
    => bootm $loadaddr - $oftaddr
    ## Booting image at 00200000 ...
    
       Image Name:	 Linux-2.6.17-dirty
       Image Type:	 PowerPC Linux Kernel Image (gzip compressed)
       Data Size:	 1029343 Bytes = 1005.2 kB
    
       Entry Point:	 00000000
    
       Verifying Checksum ... OK
       Uncompressing Kernel Image ... OK
    Booting using flat device tree at 0x300000
    Using MPC85xx ADS machine description
    Memory CAM mapping: CAM0=256Mb, CAM1=256Mb, CAM2=0Mb residual: 0Mb
    [snip]
    
    
    
    More About U-Boot Image Types:
    ------------------------------
    
    U-Boot supports the following image types:
    
       "Standalone Programs" are directly runnable in the environment
    	provided by U-Boot; it is expected that (if they behave
    	well) you can continue to work in U-Boot after return from
    	the Standalone Program.
       "OS Kernel Images" are usually images of some Embedded OS which
    	will take over control completely. Usually these programs
    	will install their own set of exception handlers, device
    	drivers, set up the MMU, etc. - this means, that you cannot
    	expect to re-enter U-Boot except by resetting the CPU.
       "RAMDisk Images" are more or less just data blocks, and their
    	parameters (address, size) are passed to an OS kernel that is
    	being started.
       "Multi-File Images" contain several images, typically an OS
    	(Linux) kernel image and one or more data images like
    	RAMDisks. This construct is useful for instance when you want
    	to boot over the network using BOOTP etc., where the boot
    	server provides just a single image file, but you want to get
    	for instance an OS kernel and a RAMDisk image.
    
    	"Multi-File Images" start with a list of image sizes, each
    	image size (in bytes) specified by an "uint32_t" in network
    	byte order. This list is terminated by an "(uint32_t)0".
    	Immediately after the terminating 0 follow the images, one by
    	one, all aligned on "uint32_t" boundaries (size rounded up to
    	a multiple of 4 bytes).
    
       "Firmware Images" are binary images containing firmware (like
    	U-Boot or FPGA images) which usually will be programmed to
    	flash memory.
    
       "Script files" are command sequences that will be executed by
    	U-Boot's command interpreter; this feature is especially
    	useful when you configure U-Boot to use a real shell (hush)
    	as command interpreter.
    
    
    Booting the Linux zImage:
    -------------------------
    
    On some platforms, it's possible to boot Linux zImage. This is done
    using the "bootz" command. The syntax of "bootz" command is the same
    as the syntax of "bootm" command.
    
    
    Note, defining the CONFIG_SUPPORT_INITRD_RAW allows user to supply
    kernel with raw initrd images. The syntax is slightly different, the
    address of the initrd must be augmented by it's size, in the following
    format: "<initrd addres>:<initrd size>".
    
    
    
    Standalone HOWTO:
    =================
    
    One of the features of U-Boot is that you can dynamically load and
    run "standalone" applications, which can use some resources of
    U-Boot like console I/O functions or interrupt services.
    
    Two simple examples are included with the sources:
    
    "Hello World" Demo:
    -------------------
    
    'examples/hello_world.c' contains a small "Hello World" Demo
    application; it is automatically compiled when you build U-Boot.
    It's configured to run at address 0x00040004, so you can play with it
    like that:
    
    	=> loads
    	## Ready for S-Record download ...
    	~>examples/hello_world.srec
    	1 2 3 4 5 6 7 8 9 10 11 ...
    	[file transfer complete]
    	[connected]
    	## Start Addr = 0x00040004
    
    	=> go 40004 Hello World! This is a test.
    	## Starting application at 0x00040004 ...
    	Hello World
    	argc = 7
    	argv[0] = "40004"
    	argv[1] = "Hello"
    	argv[2] = "World!"
    	argv[3] = "This"
    	argv[4] = "is"
    	argv[5] = "a"
    	argv[6] = "test."
    	argv[7] = "<NULL>"
    	Hit any key to exit ...
    
    	## Application terminated, rc = 0x0
    
    Another example, which demonstrates how to register a CPM interrupt
    handler with the U-Boot code, can be found in 'examples/timer.c'.
    Here, a CPM timer is set up to generate an interrupt every second.
    The interrupt service routine is trivial, just printing a '.'
    character, but this is just a demo program. The application can be
    controlled by the following keys:
    
    	? - print current values og the CPM Timer registers
    	b - enable interrupts and start timer
    	e - stop timer and disable interrupts
    	q - quit application
    
    	=> loads
    	## Ready for S-Record download ...
    	~>examples/timer.srec
    	1 2 3 4 5 6 7 8 9 10 11 ...
    	[file transfer complete]
    	[connected]
    	## Start Addr = 0x00040004
    
    	=> go 40004
    	## Starting application at 0x00040004 ...
    	TIMERS=0xfff00980
    	Using timer 1
    	  tgcr @ 0xfff00980, tmr @ 0xfff00990, trr @ 0xfff00994, tcr @ 0xfff00998, tcn @ 0xfff0099c, ter @ 0xfff009b0
    
    Hit 'b':
    	[q, b, e, ?] Set interval 1000000 us
    	Enabling timer
    Hit '?':
    	[q, b, e, ?] ........
    	tgcr=0x1, tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0xef6, ter=0x0
    Hit '?':
    	[q, b, e, ?] .
    	tgcr=0x1, tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x2ad4, ter=0x0
    Hit '?':
    	[q, b, e, ?] .
    	tgcr=0x1, tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x1efc, ter=0x0
    Hit '?':
    	[q, b, e, ?] .
    	tgcr=0x1, tmr=0xff1c, trr=0x3d09, tcr=0x0, tcn=0x169d, ter=0x0
    Hit 'e':
    	[q, b, e, ?] ...Stopping timer
    Hit 'q':
    	[q, b, e, ?] ## Application terminated, rc = 0x0
    
    
    Minicom warning:
    ================
    
    Over time, many people have reported problems when trying to use the
    "minicom" terminal emulation program for serial download. I (wd)
    consider minicom to be broken, and recommend not to use it. Under
    Unix, I recommend to use C-Kermit for general purpose use (and
    especially for kermit binary protocol download ("loadb" command), and
    
    use "cu" for S-Record download ("loads" command).  See
    http://www.denx.de/wiki/view/DULG/SystemSetup#Section_4.3.
    for help with kermit.
    
    
    
    Nevertheless, if you absolutely want to use it try adding this
    configuration to your "File transfer protocols" section:
    
    	   Name	   Program			Name U/D FullScr IO-Red. Multi
    	X  kermit  /usr/bin/kermit -i -l %l -s	 Y    U	   Y	   N	  N
    	Y  kermit  /usr/bin/kermit -i -l %l -r	 N    D	   Y	   N	  N
    
    
    NetBSD Notes:
    =============
    
    Starting at version 0.9.2, U-Boot supports NetBSD both as host
    (build U-Boot) and target system (boots NetBSD/mpc8xx).
    
    Building requires a cross environment; it is known to work on
    NetBSD/i386 with the cross-powerpc-netbsd-1.3 package (you will also
    need gmake since the Makefiles are not compatible with BSD make).
    Note that the cross-powerpc package does not install include files;
    attempting to build U-Boot will fail because <machine/ansi.h> is
    missing.  This file has to be installed and patched manually:
    
    	# cd /usr/pkg/cross/powerpc-netbsd/include
    	# mkdir powerpc
    	# ln -s powerpc machine
    	# cp /usr/src/sys/arch/powerpc/include/ansi.h powerpc/ansi.h
    	# ${EDIT} powerpc/ansi.h	## must remove __va_list, _BSD_VA_LIST
    
    Native builds *don't* work due to incompatibilities between native
    and U-Boot include files.
    
    Booting assumes that (the first part of) the image booted is a
    stage-2 loader which in turn loads and then invokes the kernel
    proper. Loader sources will eventually appear in the NetBSD source
    tree (probably in sys/arc/mpc8xx/stand/u-boot_stage2/); in the
    
    meantime, see ftp://ftp.denx.de/pub/u-boot/ppcboot_stage2.tar.gz
    
    
    
    Implementation Internals:
    =========================
    
    The following is not intended to be a complete description of every
    implementation detail. However, it should help to understand the
    inner workings of U-Boot and make it easier to port it to custom
    hardware.
    
    
    Initial Stack, Global Data:
    ---------------------------
    
    The implementation of U-Boot is complicated by the fact that U-Boot
    starts running out of ROM (flash memory), usually without access to
    system RAM (because the memory controller is not initialized yet).
    This means that we don't have writable Data or BSS segments, and BSS
    is not initialized as zero. To be able to get a C environment working
    at all, we have to allocate at least a minimal stack. Implementation
    options for this are defined and restricted by the CPU used: Some CPU
    models provide on-chip memory (like the IMMR area on MPC8xx and
    MPC826x processors), on others (parts of) the data cache can be
    locked as (mis-) used as memory, etc.
    
    
    	Chris Hallinan posted a good summary of these issues to the
    
    
    	Subject: RE: [U-Boot-Users] RE: More On Memory Bank x (nothingness)?
    	From: "Chris Hallinan" <clh@net1plus.com>
    	Date: Mon, 10 Feb 2003 16:43:46 -0500 (22:43 MET)
    	...
    
    	Correct me if I'm wrong, folks, but the way I understand it
    	is this: Using DCACHE as initial RAM for Stack, etc, does not
    	require any physical RAM backing up the cache. The cleverness
    	is that the cache is being used as a temporary supply of
    	necessary storage before the SDRAM controller is setup. It's
    
    	beyond the scope of this list to explain the details, but you
    
    	can see how this works by studying the cache architecture and
    	operation in the architecture and processor-specific manuals.
    
    	OCM is On Chip Memory, which I believe the 405GP has 4K. It
    	is another option for the system designer to use as an
    
    	initial stack/RAM area prior to SDRAM being available. Either
    
    	option should work for you. Using CS 4 should be fine if your
    	board designers haven't used it for something that would
    	cause you grief during the initial boot! It is frequently not
    	used.
    
    
    	CONFIG_SYS_INIT_RAM_ADDR should be somewhere that won't interfere
    
    	with your processor/board/system design. The default value
    	you will find in any recent u-boot distribution in
    
    	walnut.h should work for you. I'd set it to a value larger
    
    	than your SDRAM module. If you have a 64MB SDRAM module, set
    	it above 400_0000. Just make sure your board has no resources
    	that are supposed to respond to that address! That code in
    	start.S has been around a while and should work as is when
    	you get the config right.
    
    	-Chris Hallinan
    	DS4.COM, Inc.
    
    It is essential to remember this, since it has some impact on the C
    code for the initialization procedures:
    
    * Initialized global data (data segment) is read-only. Do not attempt
      to write it.
    
    
    * Do not use any uninitialized global data (or implicitely initialized
    
      as zero data - BSS segment) at all - this is undefined, initiali-
      zation is performed later (when relocating to RAM).
    
    * Stack space is very limited. Avoid big data buffers or things like
      that.
    
    Having only the stack as writable memory limits means we cannot use
    normal global data to share information beween the code. But it
    turned out that the implementation of U-Boot can be greatly
    simplified by making a global data structure (gd_t) available to all
    functions. We could pass a pointer to this data as argument to _all_
    functions, but this would bloat the code. Instead we use a feature of
    the GCC compiler (Global Register Variables) to share the data: we
    place a pointer (gd) to the global data into a register which we
    reserve for this purpose.
    
    When choosing a register for such a purpose we are restricted by the
    relevant  (E)ABI  specifications for the current architecture, and by
    GCC's implementation.
    
    For PowerPC, the following registers have specific use:
    	R1:	stack pointer
    
    	R2:	reserved for system use
    
    	R3-R4:	parameter passing and return values
    	R5-R10: parameter passing
    	R13:	small data area pointer
    	R30:	GOT pointer
    	R31:	frame pointer
    
    
    	(U-Boot also uses R12 as internal GOT pointer. r12
    	is a volatile register so r12 needs to be reset when
    	going back and forth between asm and C)
    
        ==> U-Boot will use R2 to hold a pointer to the global data
    
    
        Note: on PPC, we could use a static initializer (since the